1.select優點:跨平台缺點:對於單個程序的檔案描述符的數量存在最大限制linux一般為1024,32位機器位1024,64位機器位2048
2.對socket進行掃瞄時是一次掃瞄的,即採用輪詢的方法,效率較低
3.遍歷列表浪費cpu時間
poll優點:解決了套接字的上限問題
缺點:效率跟select一樣使用輪詢的方式比較低
from socket import socket, af_inet,sock_stream,sol_socket,so_reuseaddr
#建立tcp伺服器套接字
server_socket = socket(af_inet,sock_stream)
#繫結埠
server_socket.bind(("",9999))
#設定正常情況退出的伺服器下
,設定埠可以重用
server_socket.setsockopt(sol_socket,so_reuseaddr,1)
#設定非阻塞,也就是說accept方法不阻塞了,
# 但是在沒有客戶端鏈結且被執行的時候會報錯
#有客戶端鏈結的時候正常執行
server_socket.setblocking(false)
#設定監聽,變為主動監聽
server_socket.listen(5)
while true:
new_socket,new_address = server_socket.accept()
#接收資料,並且傳送資料
try:
while true:
recv_data = new_socket.recv(1024)
#當有客戶端關閉後,recv解除阻塞,並且返回長度為0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的資訊是:%s" % (str(new_address),recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客戶端%s已經關閉" % (str(new_address)))
break
finally:
new_socket.close()
print("關閉%s客戶端" % (str(new_address)))
#關閉tcp伺服器套接字
server_socket.close()
1)當伺服器為乙個客戶端服務時,而另外的客戶端發起了connect,只要伺服器listen的佇列有空閒的位置,就會為這個新客戶端進行連線,並且客戶端可以傳送資料,但當伺服器為這個新客戶端服務時,可能一次性把所有資料接收完畢。
2)當recv接收資料時,返回值為空,即沒有返回資料,那麼意味著客戶端已經呼叫了close關閉了;因此伺服器通過判斷recv接收資料是否為空 來判斷客戶端是否已經下線。
1. select 原理io多路復用:沒有使用多程序和多執行緒的情況下完成多個套接字的使用。
select 能夠完成一些套接字的檢查,從頭到尾檢查一遍後,標記哪些套接字是否可以收資料,返回的時候,就返回能接收資料的套接字,返回的是列表。select是由作業系統提供的,效率要高些,非常快的方式檢測哪些套接字可以接收資料。select是跨平台的,在window也可以用。
#檢測列表client_lists那些socket可以接收資料,
#檢測列表那些套接字(socket)可否傳送資料
#檢測列表那些套接字(socket)是否產生了異常
#這個select函式預設是堵塞,當有客戶端鏈結的時候解除阻塞,
# 當有資料可以接收的時候解除阻塞,當客戶端斷開的時候解除阻塞
readable, wirteable,excep = select(socket_lists,,)
web伺服器案例
併發伺服器
併發伺服器 伺服器使用多個控制線程,同時處理多個客戶請求。有關併發執行的細節取決於所用作業系統。但其思路很簡單 併發伺服器程式被分為主程式 執行緒 和控制代碼兩部分,主程式只接受來自客戶的連線請求,並為該客戶建立乙個控制線程 每乙個控制線程只與乙個客戶互動,並執行控制代碼程式。當處理完乙個客戶後,該...
伺服器併發策略
一 簡介 從本質上講,所有到達伺服器的請求都封裝在ip包中,位於網絡卡的接收緩衝區中,這時候web伺服器軟體要做的事情就是不斷地讀取這些請求,然後進行處理,並將結果寫到傳送緩衝區,這其中包含了一系列的i o操作和cpu計算,而設計乙個併發策略的目的,就是讓i o操作和cpu計算盡量重疊進行。二 乙個...
併發伺服器設計
併發伺服器就是能夠同時處理多個客戶端請求的伺服器。併發伺服器可通過多程序或者多執行緒程式來實現,這裡採用多程序程式。include include include include include include include 定義了struct sockaddr in void main 繫結位址...