2016-11-09 38 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

套接字是像两个单向管道。你永远不会读回你写的数据。你只会得到另一方写的数据。