用socketserver模块实现并发

用socketserver模块实现并发

在还没学并发编程前,就先使用socketserver模块来实现并发

一、socketserver的使用(TCP协议)

# 服务端

# 导入模块
import socketserver
# 自己定义一个类,必须继承BaseRequestHandler
class MyTcp(socketserver.BaseRequestHandler):
    # 必须重写handle方法
    def handle(self):
        try:
            while True:   # 通信循环
                # print(self)
                # 给客户端回消息
                # conn对象就是request
                # 接收数据
                print(self.client_address)
                data = self.request.recv(1024)
                print(data)
                if len(data) == 0:
                    return
                # 发送数据
                self.request.send(data.upper())
        except Exception:
            pass

if __name__ == '__main__':
    # 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
    server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)
    # 一直在监听
    # 下面这句这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
    server.serve_forever()
# 客户端

import socket

soc = socket.socket()
# 建立连接
soc.connect(('127.0.0.1',8009))
while True:
    # 发送数据
    soc.send('xxxx'.encode('utf-8'))
    # 打印接收的数据
    print(soc.recv(1024))

二、socketserver的使用(UDP协议)

# 服务端

#导入模块
import socketserver

class MyUdp(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request[0]) # b'zyl'
        print(self.request[1]) # <socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
        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格式

转载于:https://www.cnblogs.com/zhuangyl23/p/11508344.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值