用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格式