python学习——socketserver模块实现并发(自己敲的 理论在36天下有)

socketserver模块实现并发

客户端(tcp

# 购买手机
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数  是基于tcp(流)或者是基于udp(报)传输协议
# 传输地址(拨通服务电话)
phone.connect(('127.0.0.1',8081))#传输给ip地址端口给服务器       循环在这上面会一直刷新所以接收不到值

while True:
    msg=input('请输入您需要发送的信息>>>: ').strip()
    if len(msg)==0:continue
    # 发送信息(通信)
    phone.send(msg.encode('utf8'))#传输的bytes类型           seng是给自己缓存发东西并不是一一对应的 recv也是在自己内存中 要数据
    # 接收信息
    data=phone.recv(1024)
    print(data.decode('utf8'))


#手机关机(必须回收资源的操作)
phone.close()

服务端

import socketserver


class MyrequesHandle(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request)
        print(self.client_address)
        while True:
            try:
                data = self.request.recv(1024)  # 接收bytse类型的最大限度
                print(data.decode('utf8'))  # 解码输出客户端传来的数据

                self.request.send(data.upper())

            except Exception:
                break
        self.request.close()   #记得需要关闭管道否者一直循环下去(看不出)


s = socketserver.ThreadingTCPServer(('127.0.0.1', 8081), MyrequesHandle)
s.serve_forever()

 

客户端udp

# 购买手机
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#传输协议是通过网络的家族协议,需要参数  是基于tcp(流)或者是基于udp(报)传输协议
# 传输地址(拨通服务电话)

while True:
    msg=input('请输入您需要发送的信息>>>: ').strip()
    # 发送信息(通信)
    phone.sendto(msg.encode('utf8'),('127.0.0.1',8081))
    # 接收信息
    data,client_addr=phone.recvfrom(1024)

    print(data.decode('utf8'),client_addr)

服务端

import socketserver

                                #绑定基类
class MyrequesHandle(socketserver.BaseRequestHandler):
    def handle(self):
        # print(self.request)
        # print(self.client_address)
        # (b'dsa',< socket.socket fd=364, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8081) >)
        # ('127.0.0.1', 59119)
        clier_data=self.request[0]      #客户端连的线
        clier_addr=self.request[1]    #建立的通道信息
        sever_addr=self.client_address #重要的获取返回地址
        print(clier_data.decode('utf8'))
        clier_addr.sendto(clier_data.upper(),sever_addr)        #通过传过来的线sendto 传输什么到 什么地址


s = socketserver.ThreadingUDPServer(('127.0.0.1', 8081), MyrequesHandle)
s.serve_forever()

 

posted @ 2021-04-11 21:30  欧阳锦涛  阅读(40)  评论(0)    收藏  举报
TOP 底部