单线程实现socket服务多客户端
服务器:
import socket,time
tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #这句避免再次开启服务器出现端口已被占用
tcp.bind(("",8000))
tcp.listen(128)
tcp.setblocking(False) #设置tcp不堵塞
client_list = list()
while True:
time.sleep(1)
try:
new_socket,client_addr = tcp.accept()
new_socket.setblocking(False) #设置new_socket不堵塞
except:
print("没有新客户端到来..") #因为accept不堵塞,所以当accept没有客户端连接时,就触发异常
else:
print("一个新客户端到来") #如果没有发送异常,表示有一个客户端来连接了
client_list.append(new_socket) #把这个客户端添加到客户端列表中
print(len(client_list))
for client in client_list: #如果列表为空,则不会进行循环,如果列表中有新客户端,就进行循环
try:
recv_date = client.recv(1024)
except:
print("客户端没有发送数据")#因为recv没有堵塞,所以recv没有收到消息就异常,新客户端没有发送消息会异常
else: #如果recv_data不返还异常,表示客户端发来消息
if recv_date: #如果发来的消息为真,就是真的数据,处理数据即可
print("客户端发送来数据...")
else: #否则就是客户端调用了close(),关掉socket,从列表中移除此客户端
client.close()
client_list.remove(client)
print("客户端关闭")
测试客户端:
import socket
conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
conn.connect(("127.0.0.1",8000))
conn.send(b"aaa")
conn.close()

浙公网安备 33010602011771号