UDP protocol module & socketserver

UDP protocol module & socketserver

A, UDP protocol

1.1 UDP communication simple

服务器
-------------------------------------------------------------
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 features

  • Can send empty content (Datagram Protocol, data header)
  • Not need to build connections (so he is not reliable)
  • Back stick package
  • Unreliable (client, who disconnected the server will not affect sending a message)

1.3 UDP and TCP the difference

TCP UDP
Reliable connection Unreliable connection
Based on the transmission data stream Transmit data packets based
Stick package Non-stick package
Packet loss Loss

Two, socketserver module

Concurrent programming can be achieved, allowing multiple clients to access multiple servers to handle the data sent by the client

2.1 socketserver module implements a simple TCP communication

服务端
-----------------------------------------------------------------------------------
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))

2.2 socketserver simple UDP communication module implements

服务器
--------------------------------------------------------------------------------------
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格式

Guess you like

Origin www.cnblogs.com/yanjiayi098-001/p/11492771.html