知人Pythonのネットワークプログラミング-01

最近、最初のすべての知識のこの記事に関連する参考図書だけの簡単な紹介、コンピュータネットワークの基礎を初めて目にすることができ、それについてブログを書く、ネットワークプログラミングの非常に興味深い部分に、パイソンの基礎を学びます!


1.OSI 7層のプロトコル、TCP、UDPプロトコル

旅行私たちが今日使用して、世界最初のコンピュータは、ネットワークの使用されるべきであること。私たちのコンピュータがネットワークを介して通信する方法ですので。私たちは、最初のネットワークに関するいくつかの基本的な知識を理解しています。そして、いくつかの一つのケースネットワークプログラミングについての何かを学び始める、用語を説明するのに最初は、我々は唯一のプロトコルが何であるかを知っている契約、通信ルールの多種多様のルックバックと呼ばれる非常に簡単。
みかんは:コンピュータ通信網契約があります当社は、コンプライアンスの共通セットに同意しなければなりません。互いを識別するために、どのように、接続を確立する方法など。唯一の大会、互いに通信するコンピュータ間のやり取り次
...私はデータ形式が後にあなたがデータを取得するために同じフォーマットを使用してデータを受け取ることが何であるかを送って2台のコンピュータ間の良好な一致を:マンダリンでの
例:あなたと韓国。、あなたが中国を話す人と韓国を伝える、彼は言った、お二人は、彼らが言っているのか理解することはできませんあなたの両方が良いを行う方法で合意したということです、彼らはこれが交流協定と呼ばれている達成するために英語を話す......
ネットワークプロトコル:インターネット相互規則の均一なシリーズ使用してメッセージの納期
一般的に、今日のインターネットデータ伝送に使用するには、OSI 7層のプロトコルはまた、5階建て、4層のプロトコルと呼ばれている。異なるネットワーク層のためだけ異なる定義。
内部原則と役割同じ。
知人Pythonのネットワークプログラミング-01

以下は、OSIプロトコルの基本的な機能の概要を説明
最初物理层:この層は、デバイスの異なるノードを接続するケーブルを構成し、データ伝送ネットワークの通信媒体です。主な機能である:データリンク層は、伝送媒体は、データ伝送誤り率モニタデータを処理する責任がある使用して物理的な接続を提供しますので、そのデータストリームの透明伝送
数据链路层:この層は、アセンブリおよび他のホストの独自のMACアドレスMACアドレスを担当します。パー...のみ異なるベンダーによる世界的なネットワークカード上の唯一の直接プログラミングをネットワークデバイスをコードする。
役割:大規模なネットワークシステムにおいて、あなたはかなりこれを送られた人を与えるために起こっている人、最後に送信したいデータ。あなたが封筒に書くとき。上記明確に荷受人住所を書かれました。
网络层:実際には、我々は、MACアドレスと通信して、コンピュータを起動することができますが、今回は通信が放送される。轟音によって、基本的なコミュニケーションに相当。あなたはデータを送信します。自動的に自分自身に送信されませんし、データを見ていきます各コンピュータの現在のネットワークカード内のすべてのコンピュータに送信されます。この通信のように、データが少なく、コンピュータがYesの場合問題ありません。しかし、世界中のすべてのコンピュータの送信メッセージに、このような方法で。それは、効率の唯一の問題ではない場合。絶対に悲惨 。私はメッセージのブロードキャスト外を提供するためにサブネットブロードキャスト内のサブネット通信の異なるエリアにコンピュータを置くIPプロトコルを使用してIPプロトコルと呼ばれる新しいプログラム、考えどのようにそれを行います。通過するメッセージをルーティングすることもできます。あなたが別の宅配会社の配送センターとして理解することができます。私はあなたに郵便宅配便を与えるでしょう。自分の地域ではありません何を見て。⼰自身の領域はOKを探してドアからドアへ直接である。それがない場合にはIこの地域。あなたの物流センターで(ルータゲートウェイ)のお住まいの地域の物流センター(ルータゲートウェイ)物流センターを通じて見つけ、その後、あなたに通じている。ここでは、IPプロトコルの役割が明らかにされています。サブネットに設計されています。そのデータの送信がで互いのIPアドレスを取らなければならないとき。これは、IPサブネットマスクと組み合わせでは、下のサブネット属し、最後にそのデータを決定することができますデータ。
IPアドレス:.. 0.0.0.0〜255.255.255.255 255理由もので、A:ドット十進表記で4ビットずつが⼗したがって255、IPアドレスの大きい範囲最大である
入口8 2と28それぞれシステム32は一緒になって、コンピュータのIPアドレスを表すことができ、示し
マスクサブネット:4点小数サブネットを分割するための手段を
ゲートウェイ:サブネット異なるLANデータ伝送インターフェース内のIPルータ(流通センター)
計算サブネット:

1 ip1: 192.168.123.16
2 ip2: 192.168.123.45

3 子网掩码: 255.255.255.0

4 全部转化成二进制
4 ip1: 11000000 10101000 01111011 00010000
5 ip2: 11000000 10101000 01111011 00101101
6 子网: 11111111 11111111 11111111 00000000

7 让ip1和ip2分别和子网进行"与"运算
8 ip1 & 子网: 11000000 10101000 01111011 00000000
9 ip2 & 子网: 11000000 10101000 01111011 00000000
10 相等. OK 这两个IP就是同一个子网

传输层:コンピュータが複数のネットワークを実行する可能性がある内、我々が知っている問題が解決されていないがあるように、我々は今だけのコンピュータに見つけることができるMACアドレスとIPアドレスを使用して外部データ伝送の問題を解決しました...アプリケーション。たとえば、あなたはまた、ノラを見てQQを、チャット、DNFぶら下げ、LOL開く。ので、あなたのコンピュータのネットワークカードは、遠くからデータを受信し、この時間は。そう、エンドアプリケーションでのデータのこの作品は、それを行うには?端的に言えば、宅配便は、問題に対応していませんでした。あなたの会社に送った。しかし、あなたの会社で非常に多くの人々 。誰に?ない混乱ああに最後に宅配便。それを行う方法?インターネット大物は、ポートと呼ばれる新しい言葉を考えた。
伝送層指定:..それを適用するかには、(データがポート番号を介してデータを送信するために特定のアプリケーションを決定するために介して送信されるときに、アプリケーションの一意のポート番号を割り当てるが、アプリケーション異なる要求をネットワークに応じて、各⼀れます一部はUDPと呼ばれる、再びTCPと呼ばれる2つのトランスポート層プロトコルに分かれて)いくつかは、信頼性が必要で、速い必要があります。そのため、私たちは多くの場合、TCP / IPプロトコルが最も重要であると言います、私たちは、最も懸念しているIPアドレスとポートという事実である。そのため、これらの2つのうち、私たちは実際に道をコンピュータ上のWebアプリケーションに移動することができます。彼はまたにメッセージを送ることができます
32コンピュータ上のポートの数:
TCP:65536 Geの
UDP:65536 Geの
TCPとUDPの違い:

  1. TCPが、接続に基づいています。連続、および信頼性はあります。非効率的。同様に電話。プロセスでチャットを中断することはできません。
  2. UDP、それがベースにしていない接続が連続的でない、信頼性の高い効率は、1つのシャシシャシの毛を送りたい明日手紙、カミンを送信するために多くのようなものです.....
    应用层:TCP IP +持っていますが、異なるデータ伝送フォーマットと異なる場合があります。宅配便のように。いくつかの大規模小包コンピュータ上のアプリケーションに移動することができます。小さなファイルがたくさん。大宅配便の袋を使用し、小さな宅配便を使用します袋。アプリケーション層には再び我々のパッケージは、一般的に、異なるタイプのアプリケーションに応じて行われる。例えば、HTTPプロトコル、SMTPプロトコル、FTPプロトコルと同様に。

2.ソケット-TCPのプログラミング知人
ほぼすべてのプログラミング言語では、我々はネットワークソケットへのプログラムの準備に使用する必要があります。ソケットは、ソケットは、翻訳と呼ばれる。我々はまた、データネットワーク通信の上にラップが必要なことを理解してMAC、IP、ポート、およびその他の情報が、私たちはデータを準備するために⼀にプログラマーの数を開発しているたびに、そのワークロードが絶対に絶望的である場合。そう、コンピュータプレゼントソケット。ソケットは、ネットワーク通信を実現するために私たちを助けました業務の大半は。私たちはソケットを伝える必要があります。私は、データを送信するためにどのコンピュータ(IP、ポート)にしたいと思います。ソケットによるもののすべての残りの部分を助け私たちをする。そのデータ伝送用のソケットを使用して非常に便利です。
いくつかの単語の男は、それまで練習し、言った~~

サーバ側:

import socket

#创建socket通道
sk = socket.socket()
sk.bind(("127.0.0.1", 8088))  # 绑定ip和端口
sk.listen()  # 开始监听
print("服务器就绪,等待连接")
conn, address = sk.accept()  # 程序阻塞,等待连接
print("有客户端连接,ip是:", address)  # address是客户端的ip和端口

while 1:   #能持续向客户端传递消息
    conn.send(input(">>>").encode("utf-8"))  # 发送的内容只能是bytes
    print(conn.recv(1024).decode("utf-8"))  #展示接收到的消息

クライアント側:

import socket

sk = socket.socket()  # 创建通道
print("客户端初始化完成")
sk.connect(("127.0.0.1", 8088))  # 建立连接
print("客户端连接成功")
while 1:   #持续向服务端发送消息
    print(sk.recv(1024).decode("utf-8"))  # 最大接受1024字节的内容
    sk.send(input(">>>").encode("utf-8")) #展示接收到的消息

ソケット-UDPの知人3.プログラミング
、サーバ側:

import socket

sk = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
sk.bind(("127.0.0.1", 8089))
msg, address = sk.recvfrom(1024)
print(msg)
sk.sendto(b'hi', address)

クライアント側:

import socket

sk = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

sk.sendto(b'hello', ("127.0.0.1", 8089))
msg, address = sk.recvfrom(1024)
print(msg)

TCPは、原則をプログラミングして、接続を確立するパッケージを送信するためにUDP長い時間ほとんどですが、ない、返事を待たずに、あなたは、サービスとクライアントの厳密な意味を終わらなかった、受信または受信しないように、相手を気にする必要はありません。


4.スティックパック現象
データ伝送のためのTCPプロトコルを使用した場合、以下のような問題点がある。
クライアント側:

import socket

sk = socket.socket()  # 创建通道
print("客户端初始化完成")
sk.connect(("127.0.0.1", 8088))  # 建立连接
print("客户端连接成功")

sk.send("哈哈".encode("utf-8"))
sk.send("哈哈".encode("utf-8")) #发送两次
print("发送完毕")
sk.close()

サーバ側:

import socket

# 创建socket通道
sk = socket.socket()
sk.bind(("127.0.0.1", 8088))  # 绑定ip和端口
sk.listen()  # 开始监听
print("服务器就绪,等待连接")
conn, address = sk.accept()  # 程序阻塞,等待连接
print("有客户端连接,ip是:", address)  # address是客户端的ip和端口

msg1 = conn.recv(1024)
print(msg1.decode("utf-8"))
msg2 = conn.recv(1024)
print(msg2.decode("utf-8"))
sk.close()

受信したコンテンツサーバーを終了:
知人Pythonのネットワークプログラミング-01
あなたが見ることができ、コンテンツは、2回送信パッケージに、一緒に固執する、パッケージは、典型的な粘着性の現象です。
だから、パッケージ?シンプルの粘着性の問題を解決する方法。データはスティッキーパケット境界ではありませんので、理由です。直接混合袋に二つのパッケージは、理由は。反対側に伝えるためにデータを送信するときにその後、私は。境界指定することができます。私は取りますパケットデータが....パケットのサイズを読む前に、それのために多くの時間を越え受けた後、読み出されたデータは、パッケージがくっつかない生成ダウン
データ・フォーマットを開発するためにデータを送信する:マンダリン長さ+パケットの現在のサイズであることが...分離境界の定義に相当しますどのくらい知っているデータ受信
:操作の波を示し、
クライアント側:

import socket

sk = socket.socket()  # 创建通道
print("客户端初始化完成")
sk.connect(("127.0.0.1", 8088))  # 建立连接
print("客户端连接成功")

s = "哈哈"
bs = sk.send(s.encode("utf-8"))
# 计算数据长度.格式化成四位数字
bs_len = format(len(bs), "04d").encode("utf-8")
# 发送数据之前,先发送数据的长度
sk.send(bs_len)
sk.send(bs)

# 发送第二次
sk.send(bs_len)
sk.send(bs)

print("发送完毕")
sk.close()

サーバ側:

import socket

# 创建socket通道
sk = socket.socket()
sk.bind(("127.0.0.1", 8088))  # 绑定ip和端口
sk.listen()  # 开始监听
print("服务器就绪,等待连接")
conn, address = sk.accept()  # 程序阻塞,等待连接
print("有客户端连接,ip是:", address)  # address是客户端的ip和端口

# 接收数据长度4个字节,转化成数字
bs_len = int(conn.recv(4).decode("utf-8"))
# 读取数据
msg1 = conn.recv(1024)
print(msg1.decode("utf-8"))
# 再接收数据长度,读取数据
bs_len = int(conn.recv(4).decode("utf-8"))
msg2 = conn.recv(1024)
print(msg2.decode("utf-8"))
sk.close()

ただし、このアプローチは、伝送パッケージながら粘着性の問題を解決することを見つける必要があり、それは第一の受信の長さを定義する必要があります受信するたびに、それをあまりにも疲れていないニャー?問題は、Pythonはまた、自身の態度を持って、新しいモジュールの導入に、それを簡単にするためにあなたのコードを与えることを決定しstruct、テストに、焦点である、小さな本のダウンを取ります!
構造体のショーどのように使用します:

import struct

ret = struct.pack("i", 123456789)  # 把数字打包成字节
print(ret)

print(len(ret))  # 4  不论数字大小,定死了4个字节

# 把字节还原回数字
ds = b'\x15\xcd[\x07'
num = struct.unpack("i", ds)[0]   # num返回的是一个元祖,取索引为0的元素,也就是第一个元素,就是我们传输的数字
print(num)   # 123456789

さて、粘着性の問題のパックに戻って、粘着性、エレガントなパッケージの問題を解決する方法については、出てくる:
クライアント側:

import socket
import struct

sk = socket.socket()  # 创建通道
print("客户端初始化完成")
sk.connect(("127.0.0.1", 8088))  # 建立连接
print("客户端连接成功")

msg_bs = "你好呀".encode("utf-8")
msg_struct_len = struct.pack("i", len(msg_bs))
sk.send(msg_struct_len)
sk.send(msg_bs)
print("发送完毕")
# 发送第二次
sk.send(msg_struct_len)
sk.send(msg_bs)
print("发送完毕")

sk.close()

サーバ側:

import socket
import struct

# 创建socket通道
sk = socket.socket()
sk.bind(("127.0.0.1", 8088))  # 绑定ip和端口
sk.listen()  # 开始监听
print("服务器就绪,等待连接")
conn, address = sk.accept()  # 程序阻塞,等待连接
print("有客户端连接,ip是:", address)  # address是客户端的ip和端口

msg_struct_len = conn.recv(4)
msg_len = struct.unpack("i", msg_struct_len)[0]
data = conn.recv(msg_len)
print(data.decode("utf-8"))
print("接收完毕")
# 接收第二个包
msg_struct_len = conn.recv(4)
msg_len = struct.unpack("i", msg_struct_len)[0]
data = conn.recv(msg_len)
print(data.decode("utf-8"))
print("接收完毕")

sk.close()

:しかし、今、これは使用を繰り返した場合、多少面倒も、カスタムモジュールをインポートするために、それらが必要とされ、カプセル化され、構造体のモジュールで使用することができている
パッケージモジュールmy_struct_util.pyを:

import struct

def my_send(sk, msg):
    msg_len = msg.encode("utf-8")
    msg_struct_len = struct.pack("i", len(msg_len))
    sk.send(msg_struct_len)
    sk.send(msg_len)

def my_recv(sk):
    msg_struct_len = sk.recv(4)
    msg_len = struct.unpack("i", msg_struct_len)[0]
    data = sk.recv(msg_len)
    print(data.decode("utf-8"))

クライアント側:

import socket
import my_socket_util as msu

sk = socket.socket()  # 创建通道
print("客户端初始化完成")
sk.connect(("127.0.0.1", 8088))  # 建立连接
print("客户端连接成功")
msu.my_send(sk, "你好吗")
msu.my_send(sk, "你好吗")

sk.close()

サーバ側:

import socket
import my_socket_util as msu

# 创建socket通道
sk = socket.socket()
sk.bind(("127.0.0.1", 8088))  # 绑定ip和端口
sk.listen()  # 开始监听
print("服务器就绪,等待连接")
conn, address = sk.accept()  # 程序阻塞,等待连接
print("有客户端连接,ip是:", address)  # address是客户端的ip和端口

msu.my_recv(conn)
msu.my_recv(conn)
sk.close()

このように、それは~~簡単なことの多くではありません

おすすめ

転載: blog.51cto.com/14226596/2457271