通過為每個客戶端創建一個進程的方式,能夠同時與多個客戶端進行通訊,但是如果有成百上千個客戶端,仍然為每個客戶端創建進程的話,需要消耗較多的資源,因此需要創建用單線程實現與多個客戶端連接的服務器。
# 導入 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()