在我们创建普y通的Socket时知道,accept()和recv()都是会阻塞的,也就是意味着程序会在运行到这里时终止,而且一次只能连接一个客户端,必须等这个客户端处理结束才能继续连接,那么如何让程序不终止并且可以连接多个客户端呢?
通过 setblocking(False) 语句让程序不阻塞,但是如果服务端运行起来却没有客户端连接,程序就会退出,所以我们需要让程序一直在循环中等待连接,当客户端连接后就去进行消息处理,如果有其他客户端连接因为接受连接的请求一直都在所以可以继续连接。来看代码。
服务端
import socket server=socket.socket() server.setblocking(False) #设置服务为非阻塞 server.bind(('0.0.0.0',9999)) server.listen() print("开始监听>>>>>") connection=[] #用于存储每个连接的客户端对象 while True: try: coon,addr=server.accept() coon.setblocking(False) #连接设置为非阻塞 connection.append(coon) #将连接的客户端加入列表中 print("用户{}连接".format(addr)) except BlockingIOError as e: #捕捉没有连接的异常 pass new_connection=connection.copy()#连接对象列表的拷贝防止退出连接的对象从列表中移除带来的问题 for co in new_connection: #循环遍历连接对象来监听此时是否有通信 try: data_recv=co.recv(1024) print("接收到的消息为:",data_recv) if data_recv==b'': #如果收到空数据,将连接对象从列表中移除 connection.remove(co) else: co.send(data_recv) except BlockingIOError as e: pass
客户端
import socket client=socket.socket() client.connect(('127.0.0.1',9999)) while True: data=input("请输入要发送的数据:") data=data.encode() client.send(data) print("接收到的数据是:",client.recv(1024).decode())