socketserver模块在tcp与udp协议通讯应用

一,基于tcp协议通信

服务端必须满足的至少三点:

1,绑定一个固定的Ip和port

2,一直对外提供服务,稳定运行

3,能够支持并发

import socketserver

# 自定义类用来处理通信循环
class MyTCPhanler(socketserver.DatagramRequestHandler):
    def handle(self):
        while True:  # 通讯循环
            try:
                data = self.request.recv(1024)
                if len(data) ==0:break   # 针对linux系统
                print('>>>>:收到客户端的消息:',data)
                # self.request为服务端的地址
                self.request.send(data.upper())

            except ConnectionResetError:
                break
        self.request.close()

if __name__ == '__main__':   # 用于判断是执行文件还是模块
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTCPhanler)
    server.serve_forever()     #循环链接

客户端(sockeyserver模块不用改客户端的内容只在服务端加个通信循环的类即可)

from socket import *

client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))

# 通讯循环
while True:
    msg = input('>>:').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))   #client.send(b'')
    data = client.recv(1024)
    print(data)

client.close()

二,基于udp协议通信

服务端

import socketserver

class MyUdphandler(socketserver.BaseRequestHandler):
    def handle(self):
        # self对象调用内置的request方法得到一个元组,第一个值是数据,第二个是服务端的地址
        data,sock = self.request
        #发送端的地址. sendto(发送的数据,接收端到的地址)
        sock.sendto(data.upper(),self.client_address)

if __name__ == '__main__':   # 用于判断是执行文件还是模块
    server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdphandler)
    server.serve_forever()

客户端(sockeyserver模块不用改客户端的内容只在服务端加个通信循环的类即可)

from socket import *

client = socket(AF_INET,SOCK_DGRAM)

while True:
    msg = input('>>>:').strip()
    if not msg:continue
    client.sendto(msg,('127.0.0.1',8080))
    data,server_addr = client.recvfrom(1024)
    print(data)

猜你喜欢

转载自blog.csdn.net/qq_42737056/article/details/82384504