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. 總結
1)同一時刻只能為乙個客戶進行服務,不能同時為多個客戶服務
2)類似於找乙個「明星」簽字一樣,客戶需要耐心等待才可以獲取到服務
3)當伺服器為乙個客戶端服務時,而另外的客戶端發起了connect,只要伺服器listen的佇列有空閒的位置,就會為這個新客戶端進行連線,並且客戶端可以傳送資料,但當伺服器為這個新客戶端服務時,可能已一次性把所有資料接收完畢
4)當recv接收資料時,返回值為空,即沒有返回資料,那麼意味著客戶端已經呼叫了close關閉了;因此伺服器通過判斷recv接收資料是否為空 來判斷客戶端是否已經下線
併發伺服器模型 單程序伺服器
from socket import sersocket socket af inet,sock stream 重複使用繫結的資訊 sersocket.setsockopt sol socket,so reuseaddr 1 localaddr 7788 sersocket.bind localad...
單程序tcp伺服器 select版
io多路復用 沒有使用多程序和多執行緒的情況下完成多個套接字的使用。select 能夠完成一些套接字的檢查,從頭到尾檢查一遍後,標記哪些套接字是否可以收資料,返回的時候,就返回能接收資料的套接字,返回的是列表。select是由作業系統提供的,效率要高些,非常快的方式檢測哪些套接字可以接收資料。sel...
單程序tcp伺服器 epoll版
1 沒有最大併發連線的限制,能開啟的fd 指的是檔案描述符,通俗的理解就是套接字對應的數字編號 的上限遠大於1024。2 效率提公升,不是輪詢的方式,不會隨著fd數目的增加效率下降。只有活躍可用的fd才會呼叫callback函式 即epoll最大的優點就在於它只管你 活躍 的連線,而跟連線總數無關,...