UDPプロトコルモジュール&socketserver
、UDPプロトコル
1.1 UDP通信シンプル
服务器
-------------------------------------------------------------
import socket
soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #socket.SOCK_DGRAM是UDP协议
soc.bind(('127.0.0.1',8080)) #绑定地址和端口号
while True: #通信循环
data,addr = soc.recvfrom(1024) #无需等待接收和监听
print(data)
soc.sendto(data.upper(),addr) #将处理好的数据发送给客户端
客户端
------------------------------------------------------------
import socket
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #实例化一个对象
while True: #通信循环
msg= input('请输入数据>>>').strip()
msg = msg.encode('utf8') #将数据转化为bytes格式
soc.sendto(msg,('127.0.0.1',8080))
data = soc.recvfrom(1024) #接收数据
print(data[0]) #打印数
1.2 UDPの特徴
- 空のコンテンツを送信することができます(データグラムプロトコル、データヘッダ)
- 接続を構築する必要がありません(ので、彼は信頼できるものではありません)
- 戻るスティックパッケージ
- 信頼できない(サーバーが切断されたクライアントは、メッセージを送信しては影響しません)
違い1.3 UDPとTCP
TCP | UDP |
---|---|
信頼性の高い接続 | 信頼性のない接続 |
送信データストリームに基づいて、 | ベースのデータ・パケットを送信します |
スティックパッケージ | ノンスティックパッケージ |
パケット損失 | 損失 |
二、socketserverモジュール
並行プログラミングは、複数のクライアントがクライアントから送信されたデータを処理するために、複数のサーバーにアクセスすることができ、達成することができます
2.1 socketserverモジュールは、単純なTCP通信を実装します
服务端
-----------------------------------------------------------------------------------
import socketserver #导入模块
class MyTcp(socketserver.BaseRequestHandler): #继承一个类,带有Base的都是基类
def handle(self): #必须重写handle方法
try:
while True:
#request其实就是之前conn对象
data = self.request.recv(1024) #接收数据
if len(data)== 0: #如果数据发的是空
return #直接结束
self.request.send(data.upper()) #将数据变大写发送给客户端
except Exception:
pass
if __name__ == '__main__':
#实例化一个socketserver对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp) #第一个参数是绑定的地址,第二个参数是自定义的类
soc.serve_forever() #只要来一个客户端,我们就给他一个线程做交互
客户端
-----------------------------------------------------------------------------
import socket #客户端不需要用socketserver来实现
soc = socket.socket()
soc.connect(('127.0.0.1',8080))
while True:
msg = input('请输入数据>>>').strip()
msg = msg.encode('utf8')
data= soc.send(msg)
print(soc.recv(1024))
シンプルなUDP通信モジュールが実装socketserver 2.2
服务器
--------------------------------------------------------------------------------------
import socketserver
class MyUdp(socketserver.BaseRequestHandler):
def handle(self):
print(self.request[0]) #b'dfgh'
#<socket.socket fd=544, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
print(self.request[1])
print(type(self.request[1])) #<class 'socket.socket'>
data = self.request[0].decode('utf8')
data = data.upper().encode('utf8')
# self.request(tcp / udp是不一样的)
self.request[1].sendto(data,self.client_address) #self.client_address客户端地址
if __name__ == '__main__':
soc = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdp)
soc.serve_forever()
客户端
---------------------------------------------------------------------------------------
import socket
soc = socket.socket(type = socket.SOCK_DGRAM)
while True:
msg = input('请输入数据>>>').strip()
msg = msg.encode('utf8')
soc.sendto(msg,('127.0.0.1',8080))
data = soc.recvfrom(1024) #他是bytes形式
print(data[0].decode('utf-8')) #转为str格式