單程序單執行緒,完成併發伺服器(select版)
阿新 • • 發佈:2019-01-25
# 單程序單執行緒,利用select函式完成併發伺服器
from select import *
from socket import *
def main():
serverSocket = socket(AF_INET, SOCK_STREAM)
# 伺服器主動斷開連線後,在2MSL時間內可以重啟佔用原來埠號,繼續為客戶端服務
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(("", 7788))
serverSocket.listen(5)
inputs = [serverSocket]
# 新建字典 key 連線 value 客戶端地址 (ip:埠號)
duiying = {}
while True:
readable, writable, exceptional = select(inputs, [], [])
for sock in readable:
if sock == serverSocket:
conn, addr = serverSocket.accept()
print('%s連線了' % str(addr))
duiying[conn] = addr
inputs.append(conn)
else :
recvData = sock.recv(1024)
add = str(duiying[sock])
if recvData:
print('收到%s的訊息:%s' % (add, recvData))
sock.send(recvData)
else:
del duiying[sock]
print('%s斷開連線' % add)
inputs.remove(sock)
sock.close()
if __name__ == '__main__':
main()
測試圖片:
利用select庫完成併發伺服器,重點在於理解select的方法(輪詢)
demo下載地址:
下載地址1