UDPプロトコルモジュール&socketserver

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格式

おすすめ

転載: www.cnblogs.com/yanjiayi098-001/p/11492771.html