python socketserver模块进行单线程、多线程数据传输
日期: 2020-12-13 分类: 跨站数据测试 611次阅读
如何使用socketserver进行单线程、多线程数据传输
在socket模块的练习中,使用socket只可以进行一对一数据传输,无法进行多对一数据传输,在此,我将编写一小段代码实现单线程、多线程数据传输。
一、单线程
服务器端:
import socketserver
#并发处理多个数据传输
#先建立一个新类,继承socketserver.BaseRequestHandler类:
#在新建的类中重写handle方法,此方法为处理客户端发送的数据
#将socketserver.TCPServer方法中加入IP地址和端口,以及新建的类,行成一个对象
#将对象使用serve_forever()方法实现
#
class MyTCPhandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data=self.request.recv(1024)
print("{}:{} wrote:".format(self.client_address[0],self.client_address[1]))
print(self.data.decode('utf-8'))
self.request.send(self.data.decode('utf-8').upper().encode('utf-8'))
except ConnectionError as e:
print(e)
break
if __name__=='__main__':
HOST,PORT='localhost',9999
#server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPhandler)#多线程、多并发
server = socketserver.ServerTCPServer((HOST, PORT), MyTCPhandler)
server.serve_forever()
客户端一
import socket
client1=socket.socket()
client1.connect(('localhost',9999))
while True:
try:
send_mas=input("1号客户端输入发送的数据:").strip()
client1.send(send_mas.encode('utf-8'))
recv_mas=client1.recv(10000)
print(recv_mas.decode('utf-8'))
except ConnectionResetError as e:
print(e)
break
client1.close()
客户端二
import socket
client2=socket.socket()
client2.connect(('localhost',9999))
while True:
try:
send_mas=input("2号客户端请输入您想发送的数据:").strip()
client2.send(send_mas.encode('utf-8'))
recv_mas=client2.recv(1024)
print(recv_mas.decode('utf-8'))
except ConnectionResetError as e:
print(e)
break
client2.close()
运行效果:
客户端一
客户端二
服务器
当开启服务器时,服务器同一时刻只能接收一个客户端的数据,另外一个客户端会被挂起,就像我们日常接打电话一样,当你正在与其他人通话的时候,另外一个人也正好给你打电话,但是你只能同时接听一个电话,如果你想接第二个人的电话,则必须将第一个人的电话挂起,道理就是这样的道理。
二、多线程
但是如何实现多线程数据传输呢?
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPhandler)#多线程、多并发
#server = socketserver.TCPServer((HOST, PORT), MyTCPhandler)
实现上述操作,则可以实现多线程数据传输:
来看运行结果:
服务器端:
客户端一
客户端二
这样子就是先多线程数据传输了!
如果对我的文章感兴趣,请为我点一个赞,如果有python的知识需要了解或探讨,可以加本人微信:cuiliang1666457052
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐