91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現一個服務器監聽多個客戶端請求

發布時間:2021-03-24 10:52:33 來源:億速云 閱讀:295 作者:小新 欄目:開發技術

小編給大家分享一下Python如何實現一個服務器監聽多個客戶端請求,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

首先建立服務器的socket來監聽客戶端的請求:

tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5)

這樣服務器的監聽socket就建好了。

接下來的思路是,如果要監聽多個客戶端,則

tcpSerSock.accept() #(accept()是阻塞式的)

必須放進一個while循環(不放進循環監聽一次就沒了)。然而,這里就有問題了。如果按照一對一的那種處理順序,客戶端A連進來后,程序順序向下執行,服務端要再寫一個while循環,用來處理客戶端A的請求,如果此時客戶端B再來請求,服務器將接收不到。于是,很自然想到,將監聽和處理放到不同的線程進行處理。我選擇將監聽放入主線程,將處理放進子線程。該服務器功能為接收到客戶端的數據加上時間戳后返回給客戶端。服務端完整代碼如下:

#coding=utf-8 
#!/usr/bin/env python 
''''' 
author:Mr.Jing 
created on Fri Sep 22 14:29:03 2017 
platfrom:win10,python2.7 
''' 
 
from socket import * 
from time import ctime 
import threading 
import time 
HOST='' 
PORT=2159 
BUFSIZ=1024 
ADDR = (HOST,PORT) 
 
tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 
socks=[]        #放每個客戶端的socket 
 
def handle(): 
 while True: 
  for s in socks: 
   data = s.recv(BUFSIZ) 
   if not data: 
    socks.remove(s) 
    continue 
   s.send('[%s],%s' % (ctime(), data)) #加上時間戳返回 
 
t = threading.Thread(target=handle)    #子線程 
if __name__ == '__main__': 
 t.start() 
 print u'我在%s線程中 ' % threading.current_thread().name #本身是主線程 
 print 'waiting for connecting...' 
 while True: 
  clientSock,addr = tcpSerSock.accept() 
  print 'connected from:', addr 
  socks.append(clientSock)

兩個客戶端A和B同時連接,服務器輸出:

Python如何實現一個服務器監聽多個客戶端請求

可以看到服務端是可以相應多個客戶端的。

客戶端A發條消息試試?

Python如何實現一個服務器監聽多個客戶端請求

服務器返回來了帶時間戳的消息,goodjob。

那另一個呢?

Python如何實現一個服務器監聽多個客戶端請求

很棒。服務器都能做出響應。

再發一條試試?

Python如何實現一個服務器監聽多個客戶端請求

發現服務器沒響應了,這是怎么回事呢?

經過仔細勘察發現是因為這句:

data = s.recv(BUFSIZ)

因為recv方法是阻塞的,也就是說,當輪訓到某個客戶端,比如A,這句等待A發消息,不發消息就不往下走,所以此時B再去發消息的話服務器就收不到了。

那該怎么辦呢?

很容易想到,將其設為非阻塞就好了。但上網找了好久,雖然找到可以用setblocking(0)  將套接字設為非阻塞,然而具體怎么用卻很少有人講清楚。查資料后終于搞明白,非阻塞的recv方法會繼續向下執行,若超時得不到數據則會拋出異常。

修改后的代碼如下:

#coding=utf-8 
#!/usr/bin/env python 
''''' 
author:Mr.Jing 
created on Fri Sep 22 14:29:03 2017 
platfrom:win10,python2.7 
''' 
 
from socket import * 
from time import ctime 
import threading 
import time 
HOST='' 
PORT=2159 
BUFSIZ=1024 
ADDR = (HOST,PORT) 
 
tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 
socks=[]        #放每個客戶端的socket 
 
def handle(): 
 while True: 
  for s in socks: 
   try: 
    data = s.recv(BUFSIZ)  #到這里程序繼續向下執行 
   except Exception, e:   
    continue 
   if not data: 
    socks.remove(s) 
    continue 
   s.send('[%s],%s' % (ctime(), data)) 
 
t = threading.Thread(target=handle)    #子線程 
if __name__ == '__main__': 
 t.start() 
 print u'我在%s線程中 ' % threading.current_thread().name #本身是主線程 
 print 'waiting for connecting...' 
 while True: 
  clientSock,addr = tcpSerSock.accept() 
  print 'connected from:', addr 
  clientSock.setblocking(0) 
  socks.append(clientSock)

此時再去嘗試:

Python如何實現一個服務器監聽多個客戶端請求

客戶端隨便輸都會得到響應。任務達成!

看完了這篇文章,相信你對“Python如何實現一個服務器監聽多個客戶端請求”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚松县| 苗栗市| 阿拉尔市| 祁门县| 宜章县| 广东省| 武冈市| 云和县| 合阳县| 萨迦县| 岳池县| 郎溪县| 孝昌县| 漾濞| 分宜县| 泗阳县| 平安县| 郴州市| 吉木萨尔县| 沂南县| 浪卡子县| 咸宁市| 石河子市| 金湖县| 建始县| 永胜县| 洛川县| 龙岩市| 晋江市| 古田县| 辉县市| 洪江市| 太和县| 东乡| 盐津县| 康马县| 璧山县| 黄山市| 文水县| 宁安市| 江口县|