上一篇文章為:→3.3.15家庭上網(wǎng)解析
單進程服務(wù)器
1. 完成一個簡單的TCP服務(wù)器
from socket import *
serSocket = socket(AF_INET, SOCK_STREAM)
# 重復(fù)使用綁定的信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
localAddr = ('', 7788)
serSocket.bind(localAddr)
serSocket.listen(5)
while True:
print('-----主進程锌奴,槐壳,等待新客戶端的到來------')
newSocket,destAddr = serSocket.accept()
print('-----主進程坤候,,接下來負責(zé)數(shù)據(jù)處理[%s]-----'%str(destAddr))
try:
while True:
recvData = newSocket.recv(1024)
if len(recvData)>0:
print('recv[%s]:%s'%(str(destAddr), recvData))
else:
print('[%s]客戶端已經(jīng)關(guān)閉'%str(destAddr))
break
finally:
newSocket.close()
serSocket.close()
2. 總結(jié)
*同一時刻只能為一個客戶進行服務(wù)间护,不能同時為多個客戶服務(wù)
- 類似于找一個“明星”簽字一樣亦渗,客戶需要耐心等待才可以獲取到服務(wù)
- 當(dāng)服務(wù)器為一個客戶端服務(wù)時,而另外的客戶端發(fā)起了connect汁尺,只要服務(wù)器listen的隊列有空閑的位置法精,就會為這個新客戶端進行連接,并且客戶端可以發(fā)送數(shù)據(jù)痴突,但當(dāng)服務(wù)器為這個新客戶端服務(wù)時搂蜓,可能一次性把所有數(shù)據(jù)接收完畢
- 當(dāng)recv接收數(shù)據(jù)時,返回值為空辽装,即沒有返回數(shù)據(jù)帮碰,那么意味著客戶端已經(jīng)調(diào)用了close關(guān)閉了;因此服務(wù)器通過判斷recv接收數(shù)據(jù)是否為空 來判斷客戶端是否已經(jīng)下線