併發伺服器

2021-08-20 02:08:33 字數 1946 閱讀 2308

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 繫結位址...