通过为每个客户端创建一个进程的方式,能够同时与多个客户端进行通讯,但是如果有成百上千个客户端,仍然为每个客户端创建进程的话,需要消耗较多的资源,因此需要创建用单线程实现与多个客户端连接的服务器。
# 导入 socket、sys 模块
import socket
import sys
Clients=[]#创建客户端socket列表
def main():
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
localAddr=('',8080)
server_socket.bind(localAddr)# 绑定端口号
server_socket.listen(5)# 设置最大连接数,超过后排队
server_socket.setblocking(0)#将套接字设置为非堵塞
while True:
try:
newClient=server_socket.accept()
except Exception as result:#如果没有客户端连接则产生一个异常
pass
else:#如果有客户端连接,则将新的客户端设置为非阻塞,并添加到客户端列表中
newClient[0].setblocking(0)
Clients.append(newClient)
Clients_invalid=[]#创建无效的客户端列表
for clientSocket,clientAddr in Clients:
try:
meg='0'
clientSocket.send(msg.encode('utf-8')#通过发送数据判断客户端是否在线
except:#客户端不在线
clientSocket.close()#关闭连接
Clients_invalid.append((clientSocket,clientAddr))#将客户端计入无效列表
else:
try:
recvData=clientSocket.recv(1024)
if len(recvData)>0:
print(recvData))#处理数据
else:
pass
except :#接收异常则忽略
pass
for client in Clinets_invalid :#从客户端列表中移除无效的客户端
Clients.remove(client)
if __name__='__main__':
main()