1. 程式人生 > >單程序非阻塞伺服器

單程序非阻塞伺服器

程序的執行取決於排程演算法,多個程序就是多個資源,程序是資源分配的單位,用多程序在客戶端訪問伺服器中是很常見的應用。下面我們介紹一種單程序實現客戶端訪問伺服器的方法,其基本思想就是雖然使用單執行緒但是不讓程式產生阻塞,程式不斷執行沒有阻塞,看起來就像偽的多執行緒。

在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設為非堵塞狀態

最終結果是: