UDP 프로토콜 모듈 및 socketserver

UDP 프로토콜 모듈 및 socketserver

A, 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))

2.2 socketserver 간단한 UDP 통신 모듈 구현

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