2016-11-09 32 views
1

哪個是更好的類比描述兩個INET插座之間的溝通渠道:套接字類比:一個管道還是兩個管道?

  • 一個雙向的「管道」
  • 兩個單向的「管道」

如果我送點東西給一個雙向的「管道」,然後立即嘗試從那裏接收一些東西,我期待回收我剛剛發送的東西(除非另一端在此期間設法使用它)。

如果有兩個單向管,一個用於發送和其他用於接收(和另一端反之亦然),那麼我期待寫入在一端不會影響在相同的端部的讀數。

我是新來的插座和閱讀Python插座HOWTO後,我無法告訴正在使用哪種模式。我試圖通過實驗來推斷它,但我不確定是否正確設置了它。

所以,可以在一個端發送接收影響在相同的端部,或在這些方向上分開,如果有兩個「管道」?

+1

分隔。你不會讀回你剛寫的東西。以一種方式進行數據傳輸的唯一方式是延遲數據。 – spectras

回答

1

如果我向雙向「管道」發送一些東西,然後立即嘗試從那裏接收某些東西,我希望找回剛剛發送的東西(除非其他端設法使用它)與此同時)。

簡短的回答是:不,這不是python sockets的工作方式。

爲了驗證這一點,請嘗試以下代碼片斷

server.py

#!/usr/bin/python 

from socket import * 
import time 

if __name__ == '__main__': 
    s = socket(AF_INET, SOCK_STREAM) 
    s.bind(('localhost', 5000)) 
    s.listen(1) 
    conn,addr = s.accept() 
    print conn,addr 
    time.sleep(2) 
    print "Unceremoniously closing the connection" 

client.py

#!/usr/bin/python 

from socket import * 

if __name__ == '__main__': 
    s = socket(AF_INET, SOCK_STREAM) 
    s.connect(('localhost',5000)) 

    s.send('hello!!') 

    data = s.recv(1024) 

    print data 

運行

python server.py 

然後

python client.py 

客戶端將不會收到任何數據,並會在等待接收數據時拋出異常。

(這是爲蟒2.7順便說一句)

1

套接字是像兩個單向管道。你永遠不會讀回你寫的數據。你只會得到另一方寫的數據。