單程序非阻塞伺服器
阿新 • • 發佈:2019-01-10
程序的執行取決於排程演算法,多個程序就是多個資源,程序是資源分配的單位,用多程序在客戶端訪問伺服器中是很常見的應用。下面我們介紹一種單程序實現客戶端訪問伺服器的方法,其基本思想就是雖然使用單執行緒但是不讓程式產生阻塞,程式不斷執行沒有阻塞,看起來就像偽的多執行緒。
在windows中我們使用網路除錯助手產生3個客戶端同時訪問Ubuntu中建立的伺服器
在ubuntu中我們建立一個伺服器端,程式碼如下:
這裡最主要的就是使用了# 單執行緒費堵塞伺服器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) serSocket.setblocking(False) localAddr = ('', 7788) serSocket.bind(localAddr) serSocket.listen(10) # 用來儲存所有已經連線的客戶端的資訊 clientAddrList = [] while True: try: clientSocket, clientAddr = serSocket.accept() except: pass else: print('一個新的客戶端到來:%s' % (clientAddr)) clientSocket.setblocking(False) clientAddrList.append((clientSocket, clientAddr)) for clientSocket, clientAddr in clientAddrList: try: recvData = clientSocket.recv(1024) except: pass else: if len(recvData) > 0: print('%s,%s' % (str(clientAddr), recvData)) else: clientSocket.close() clientAddrList.remove((clientSocket, clientAddr)) print('%s 已經下線' % (str(clientAddr)))
clientSocket.setblocking(False)
將Socket設為非堵塞狀態
最終結果是: