python網路編程(八)

來源:互聯網
上載者:User

標籤:coding   資料   reading   bsp   listen   finally   while   共用   連結   

單進程伺服器1. 完成一個簡單的TCP伺服器
from socket import *serSocket = socket(AF_INET, SOCK_STREAM)# 重複使用綁定的資訊serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)localAddr = (‘‘, 7788)serSocket.bind(localAddr)serSocket.listen(5)while True:    print(‘-----主進程,,等待新用戶端的到來------‘)    newSocket,destAddr = serSocket.accept()    print(‘-----主進程,,接下來負責資料處理[%s]-----‘%str(destAddr))    try:        while True:            recvData = newSocket.recv(1024)            if len(recvData)>0:                print(‘recv[%s]:%s‘%(str(destAddr), recvData))            else:                print(‘[%s]用戶端已經關閉‘%str(destAddr))                break    finally:        newSocket.close()serSocket.close()
2. 總結
  • 同一時刻只能為一個客戶進行服務,不能同時為多個客戶服務
  • 類似於找一個“明星”簽字一樣,客戶需要耐心等待才可以擷取到服務
  • 當伺服器為一個用戶端服務時,而另外的用戶端發起了connect,只要伺服器listen的隊列有閒置位置,就會為這個新用戶端進行串連,並且用戶端可以發送資料,但當伺服器為這個新用戶端服務時,可能一次性把所有資料接收完畢
  • 當recv接收資料時,傳回值為空白,即沒有返回資料,那麼意味著用戶端已經調用了close關閉了;因此伺服器通過判斷recv接收資料是否為空白 來判斷用戶端是否已經下線
多進程伺服器1. 多進程伺服器
from socket import *from multiprocessing import *from time import sleep# 處理用戶端的請求並為其服務def dealWithClient(newSocket,destAddr):    while True:        recvData = newSocket.recv(1024)        if len(recvData)>0:            print(‘recv[%s]:%s‘%(str(destAddr), recvData))        else:            print(‘[%s]用戶端已經關閉‘%str(destAddr))            break    newSocket.close()def main():    serSocket = socket(AF_INET, SOCK_STREAM)    serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)    localAddr = (‘‘, 7788)    serSocket.bind(localAddr)    serSocket.listen(5)    try:        while True:            print(‘-----主進程,,等待新用戶端的到來------‘)            newSocket,destAddr = serSocket.accept()            print(‘-----主進程,,接下來建立一個新的進程負責資料處理[%s]-----‘%str(destAddr))            client = Process(target=dealWithClient, args=(newSocket,destAddr))            client.start()            #因為已經向子進程中copy了一份(引用),並且父進程中這個通訊端也沒有用處了            #所以關閉            newSocket.close()    finally:        #當為所有的用戶端服務完之後再進行關閉,表示不再接收新的用戶端的連結        serSocket.close()if __name__ == ‘__main__‘:    main()
2. 總結
  • 通過為每個用戶端建立一個進程的方式,能夠同時為多個用戶端進行服務
  • 當用戶端不是特別多的時候,這種方式還行,如果有幾百上千個,就不可取了,因為每次建立進程等過程需要好較大的資源
多線程伺服器
#coding=utf-8from socket import *from threading import Threadfrom time import sleep# 處理用戶端的請求並執行事情def dealWithClient(newSocket,destAddr):    while True:        recvData = newSocket.recv(1024)        if len(recvData)>0:            print(‘recv[%s]:%s‘%(str(destAddr), recvData))        else:            print(‘[%s]用戶端已經關閉‘%str(destAddr))            break    newSocket.close()def main():    serSocket = socket(AF_INET, SOCK_STREAM)    serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)    localAddr = (‘‘, 7788)    serSocket.bind(localAddr)    serSocket.listen(5)    try:        while True:            print(‘-----主進程,,等待新用戶端的到來------‘)            newSocket,destAddr = serSocket.accept()            print(‘-----主進程,,接下來建立一個新的進程負責資料處理[%s]-----‘%str(destAddr))            client = Thread(target=dealWithClient, args=(newSocket,destAddr))            client.start()            #因為線程中共用這個通訊端,如果關閉了會導致這個通訊端不可用,            #但是此時線上程中這個通訊端可能還在收資料,因此不能關閉            #newSocket.close()     finally:        serSocket.close()if __name__ == ‘__main__‘:    main()

 

 

python網路編程(八)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.