Python之單線程-非阻塞模式實現TCP服務器連接多客戶端


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

# 導入 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM