ディレクトリ
ソケット
まず、ソケットのソケットプログラミングTCPプロトコルに基づいて
1.1ソケットは何ですか
、私たちはしばしば一連のインターフェイス、抽象TCP / IP層はいくつかの簡単な界面層の呼び出しが供給されている複雑な操作があるソケットのソケットを、アプリケーション層とトランスポート層との間にソケット抽象層と呼ばれていますネットワークでのプロセス間通信を実装します。
デザインモードでは、ソケットは、ソケットは、指定に準拠するためにデータを整理してみましょう、実際に、それはユーザーのために、シンプルなインタフェースは、すべてのセットがあり、ソケットインタフェースの背後に隠されたTCP / IPプロトコルの複雑さが、ファサードパターンであります合意。私たちは、TCP / UDPプロトコルの深い理解を必要としない、ソケットが私たちのために良いパッケージを持って、私たちは自然のTCP / UDPの基準を以下のプログラムを作成し、プログラムへのソケットの規定に従う必要があります。
1.2ソケットの分類
- AF_UNIX同じマシン上で実行して、2つだけのソケットのプロセス、そして今、この基本的な必要性:ファイルタイプのソケットベースの家族
- AF_INET、最も広く使用されている、別のマシン上で使用することができるの一つである:ネットワークソケットファミリのタイプに基づいて、
1.3ソケットのワークフロー
サーバーの話を起動し、サーバが最初のソケットを初期化し、その後、(バインド)結合ポートは、クライアント接続を待って、ブロックされたコールを受け入れ、(聞く)ポートを監視します。接続が成功した場合は、クライアントはソケットを開始している場合は、この時点では、サーバー(接続)に接続し、その後、クライアントを接続し、サーバが確立されています。クライアントは、サーバがリクエストを受信し、要求を処理し、クライアントに応答データを送信し、クライアントがデータを読み込み、そして最終的に接続を閉じ、対話の終了、データ要求を送信します。例次のコードは、直接使用されます。
- TCPソケットプログラミングのシンプルなプロトコルに基づいて、
# 简单的tcp通信服务端
# 以买手机打电话举例,socket.SOCK_STREAM表示建立tcp连接,socket.SOCK_DGRAM表示建立udp连接
# 导入socket模块
import socket
# 实例化一个socket对象(买了个手机)
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定ip地址(插电话卡),参数传元组:(ip,端口号)
# soc.bind(('127.0.0.1',8080)) # ip写127.0.0.1,只能自己访问
soc.bind(('192.168.11.176',8080)) # 如果写本机ip,局域网外部可以访问
# 监听(手机开机),这个5是半连接池的大小
soc.listen(5)
# 等待客户端连接(等待别人给我打电话)
print('start>>>')
conn,addr = soc.accept() # conn:通路(三次握手建立的双向连接),addr:(客户端的ip,端口)
# 通信:收/发消息
data = conn.recv(1024) # 一次最大接收1024字节数
print('来自客户端的数据>>>',data)
# 发送数据,数据必须是bytes格式
conn.send(data.upper()) # 把接收到的客户端的数据变成大写发送回去
# 关闭通路(挂断电话)
conn.close()
# 关闭连接(销毁手机)
soc.close()
# 简单的tcp通信客户端
import socket
# 创建一个socket对象
soc = socket.socket() # 不传参默认是tcp协议
# 连接服务端
soc.connect(('192.168.11.176',8005)) # 指定服务端ip和端口
# 通信:发/收消息
soc.send(b'zyl') # 发送数据,必须是bytes格式,也可以用soc.send('zyl'.encode('utf8'))
data = soc.recv(1024) # 接收数据
print('收到服务端的数据>>>',data)
# 关闭连接
soc.close()
- TCPソケットプログラミングサイクルプロトコルに基づいて接続し、通信を追加
# 服务端
import socket
# 生成一个socket对象
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定地址和端口号
soc.bind(('127.0.0.1',8005)) # 127.0.0.1只能自己访问
# 监听(半连接池的大小,不是连接数)
soc.listen(5)
# 等待客户端连接
while True: # 连接循环
print('等待客户端连接')
conn,addr = soc.accept() # 卡住,如果没有客户端连接,会一直卡在这,当有客户端连接,才继续往下走
print('有个客户端连接上了',addr)
while True: # 通信循环
try:
# windows如果客户端断开,会报错,所以加了try
# linux如果客户端断开,不会报错,会收到空,所以当data为空时,也break
# 等待接收,最大收取1024个字节
data = conn.recv(1024) # 会卡住,当客户端有数据过来,才会执行
if len(data) == 0: # 处理linux客户端断开,在window下这段代码根本不会执行(即便是客服端发了空,也不会走到这行代码)
break
print(data)
conn.send(data.upper())
except Exception:
break
# 关闭通路
conn.close()
# 关闭连接
soc.close()
# 客户端
import socket
# 创建一个socket对象
soc = socket.socket()
soc.connect(('127.0.0.1',8005))
while True: # 通信循环
in_s = input('请输入要发送的数据>>>').strip()
# 发送的数据必须是b格式,in_s.encode('utf-8') 把字符串编码成b格式
# 把b格式转成字符串
# ss=str(b'hello',encoding='utf-8')
# ss=b'hello'.decode('utf-8')
# #把字符串转成b格式
# by=bytes('hello',encoding='utf-8')
# by='hello'.encode('utf-8')
soc.send(in_s.encode('utf8')) # 发送数据给服务端
data = soc.recv(1024) # 接收服务端发送的数据
print('收到服务端数据>>>',data)
# 关闭连接
soc.close()
第二に、UDPソケットプログラミング契約に基づきます
UDPプロトコルは、接続を必要としないので、ここでは、通信サイクルサービスとクライアントを追加した後に直接書き込まれます
# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8005))
while True: # 通信循环
data,addr = server.recvfrom(1024) # udp协议无需等待连接和监听
print(data)
server.sendto(data.upper(),addr) # 返回处理好的数据给客户端
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
while True: # 通信循环
msg = input('请输入要发送的数据>>>').strip()
# 直接发送数据
client.sendto(msg.encode('utf8'),('127.0.0.1',8005)) # 发送bytes格式的数据和地址
# 接收数据
data = client.recvfrom(1024)
print(data)
三つの違い、UDPプロトコルとTCPプロトコル
3.1 UDPプロトコル機能
- 接続を確立しないと、聞く必要はありません、あなたは領収書なしで、クライアントとサーバーのポートがちょうど送られ、それが信頼できるものではありませんそれを送った人は影響しません、直接データを送信することができます
- 空の内容は、何の問題スティックパッケージを送信しないことができますが、関係なく、クライアントまたはサーバが受信したか否かの、パケットロスになる、それは、それは信頼性の高いだけの髪ではありません
3.2 UDPとTCPの違い
TCP | UDP |
---|---|
信頼性の高い接続 | 信頼性のない接続 |
送信データストリームに基づいて、 | ベースのデータ・パケットを送信します |
スティックパッケージ | ノンスティックパッケージ |
パケット損失 | 損失 |