python socketserver模块进行单线程、多线程数据传输

如何使用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

你可能感兴趣的:(socketserver,socket,python,多线程)