5.socketserver实现客户端和服务端保持通信
socket的缺陷:
使用socket编写使客户端和服务端连接时,只能由一个客户端能够与服务端保持连接,
其他的客户端只能处于排队状态,等待服务端与正在连接的客户端断开连接,下一个客户端才能连接
总之:同时只能由一个客户端能够与服务端保持连接,接收信息
socketserve
因此就可以使用socketserver来使那些服务器与客户端连接,同时可以由多个客户端连接,同时发送信息
因为是需要服务端有多线程的功能,只需要改写服务端代码即可,客户端的代码不需要发送变化,按照socket的逻辑写即可
代码流程:
流程
1,重写一个类,类要继承socketserver.BaseRequestHandler这个类
2,调用一个server类,把参数传到类中,实例化一个对象
3,对象调用server_forever方法进行数据接收
4,调用server_close关闭socket连接
代码格式:
服务端代码格式:
class Myserver(socketserver.BaseRequestHandler): #必须要继承该类 def handle(self) : #重写该类的handle方法,所有的逻辑操作都写在该方法里 数据接收逻辑流程代码 #在这里,con的获取方式发送变化,要使用con=self.request #这句话的作用与con, adr = sk.accept()的作用相同 self.client_address#是客户端的ip和进程号 if __name__ =='__main__': server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver) #该步骤设置端口和ip,完成所有的连接前绑定并连接,并创建多线程 server.serve_forever()#调用handle方法进行数据接收
以下代码是服务端立即回传客户端发送的数据:
#####客户端代码,与socket代码相同 import socket sk=socket.socket() address=('127.0.0.1',8000) sk.connect(address) while 1: a=input(">>>") if a=='exit': break sk.send(a.encode('utf-8')) data=sk.recv(1024) print(data.decode('utf-8')) sk.close()
#####服务端代码: import socketserver class Myserver(socketserver.BaseRequestHandler): #必须要继承该类 def handle(self) : #重写该类的handle方法,所有的逻辑操作都写在该方法里 print('服务开启') while 1: con=self.request #这句话的作用与con, adr = sk.accept()的作用相同 print(self.client_address) while 1: client_data=con.recv(1024) print(client_data.decode('utf-8')) print('waiting...') con.sendall(client_data) con.close() if __name__ =='__main__': server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver) #该步骤完成所有的连接前绑定 server.serve_forever()
如下代码是使用socketsever来编写代码,完成多个客户端与一个服务端聊天的功能
执行后可服务端可连接多个用户端,实现同时发送信息,一对多聊天
#客户端代码
import socket sk=socket.socket() address=('127.0.0.1',8000) sk.connect(address) while True: data=bytes(input('想跟美女说什么:'),encoding='utf-8') if data== bytes('exit',encoding='utf-8'): break sk.send(data) data=sk.recv(1024).decode('utf-8') print('美女:'+data) sk.close() print('聊天结束')
服务端代码: import socketserver class Myserver(socketserver.BaseRequestHandler): #必须要继承该类 def handle(self) : #重写该类的handle方法,所有的逻辑操作都写在该方法里 print('服务开启') while 1: con=self.request #这句话的作用与con, adr = sk.accept()的作用相同 print(self.client_address) while 1: try: data = con.recv(1024).decode('utf-8') except Exception: print('客户端被强制结束') break print('小虎:' + data) if not data: break data = bytes(input('想跟小虎说什么:'), encoding='utf-8') con.send(data) con.close() if __name__ =='__main__': server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver) #该步骤完成所有的连接前绑定 server.serve_forever()

浙公网安备 33010602011771号