2016-07-28 120 views
1

我正在學習Python中的socket編程,爲什麼客戶端套接字連接在從服務器接收到所有數據後沒有關閉?

服務器代碼:

import socket 

srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
srvsock.bind(('', 23000)) 
srvsock.listen(5) 

while True: 
    clisock, (rem_host, rem_port) = srvsock.accept() 
    print "conection established with host %s and port %s" % (rem_host, rem_port) 
    while True: 
     strg = clisock.recv(20) 
     if not strg: 
      print 'conection closed' 
      clisock.close() 
      break 
     clisock.send(strg) 

客戶端代碼:

import socket 

clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
clisock.connect(('', 23000)) 
clisock.send("Hello World rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr dsadsadsa tttttt\n") 
while True: 
    data = clisock.recv(20) 
    print type(data) 
    if not data: 
     clisock.close() 
     break 
    print data 

我是從客戶端發送數據流服務器同時從服務器接收數據,數據傳輸成功後,服務器不關閉客戶端連接。我錯過任何事情嗎?

回答

0

該問題是由於服務器不斷讀取客戶端的數據直到它讀取不到數據而引起的。只有當連接的客戶端關閉連接時纔會發生這種情況。在此之前,服務器套接字將阻塞(即臨時懷疑操作),直到客戶端發送更多數據。

底線:客戶端或服務器必須指示它不再打算通過連接發送數據。

您可以通過在客戶端for循環之前加入一行

clisock.shutdown(socket.SHUT_WR) 

固定客戶。這表示不會再發送數據。

+0

此外還有一個快速註釋:協議設計最重要的部分之一是確保協議單元(數據包,數據幀,任何)可以相互分離。您試圖實施一個協議,在該協議中不可能發送「消息結束」檢測,也不會發送「傳輸結束」。 – holdenweb

0

服務器代碼:

while True: 
    clisock, (rem_host, rem_port) = srvsock.accept() 
    print "conection established with host %s and port %s" % (rem_host, rem_port) 
    while True: 
     strg = clisock.recv(20) 
     print '[message from client:] %s'%strg 
     clisock.send(strg) 
     print 'about to close with client' 
     clisock.close() 
     print 'connection closed with client' 
     break 

客戶端代碼:

clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
clisock.connect(('', 23000)) 
clisock.send("Hello World rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr dsadsadsa tttttt\n") 
while True: 
    data = clisock.recv(20) 
    print '[Message from server :]%s'%data 
    print 'about to close server connection' 
    clisock.close() 
    print 'server connection closed' 
    break 

這會在你的情況下工作了,holdenweb有適當的理由預期在上面的代碼中的客戶端代碼的行爲不正確的答案僅發送一條消息並關閉連接以及服務器僅偵聽每個客戶端的一條消息並關閉與該客戶端的連接單個客戶端 - 單個連接----單條消息

相關問題