2010-05-26 177 views
2

我在将数据从套接字的一端发送到另一端时遇到问题。发生什么事情是服务器和客户端都试图读取文件,以免文件被发送。我想知道如何让客户端阻塞,直到服务器完成读取客户端发送的文件。通过套接字发送文件

我用send和recv原始数据包这方面的工作,但想通这是一个清晰的解决方案......

客户:

  1. 连接到服务器建立socket连接
  2. 创建一个文件在套接字上并发送数据
  3. 等待文件从服务器

服务器:

  1. 等待文件从客户

完成interraction:

  1. 客户端将数据发送到服务器
  2. 服务器将数据发送到客户端

编辑

的代码实际上,我在看被张贴在这个问题,但我认为Eventlet东西吓到人... https://stackoverflow.com/questions/2909358/eventlet-client-server

底下它只是使用Python插槽,所以我想我倒是简化的问题,并要求有关刚好芯插座的问题...

+0

邮一些代码请? – 2010-05-26 16:50:24

回答

1

我不知道这个问题是清楚的,你问:

  1. 如何SE通过套接字查找整个文件的数据?
  2. 如何让写入者在写入一些数据后阻塞?
  3. 其他的东西?

如果问题是#1,则需要打开文件并将其解析为一个字节流,然后在单个“写入”调用中传递整个字节集合。

如果问题是#2,这意味着你想要的作家在移动之前等待读者完全读取字节(和处理他们?),那么你需要的读写器进行协调。您可以通过在写入之后让作者调用“读取”(读取是阻止调用)来完成此操作。然后,在阅读器完成读取(并处理字节)后,它会向作者写入一些信息以唤醒它。

如果问题是#3,也许你可以提供一些更多的细节。

+0

第二个选项。出于某种原因,你所描述的是我正在做的事情,它不起作用。阅读的协调是我想弄清楚的。 – johannix 2010-05-26 17:49:32

3

这听起来像你的客户端发送的文件,然后等待服务器的响应,但如果你不给服务器上的指示,它已经完全读取文件,的recv()服务器端将挂起等待更多数据。一旦客户端完成发送,您可以在客户端调用shutdown(SHUT_WR)。这会通知服务器,一旦它读取了所有发送的数据,就再也没有数据了。

一个非常基本的例子(发送一个数据blob到服务器,并且响应接收到一个数据blob):

服务器

>>> from socket import * 
>>> s=socket() 
>>> s.bind(('',8000)) 
>>> s.listen(1) 
>>> c,a = s.accept() # will hang here until a client connects 
>>> recvd='' 
>>> while True: 
... data = c.recv(1024) 
... if not data: break # recv() will return '' only if the client calls shutdown(SHUT_WR) or close() 
... recvd += data 
... 
>>> recvd 
'a message' 
>>> c.sendall('a response') 
>>> c.close() # done with client, could loop back to accept here 
>>> s.close() # done with server 

客户

>>> from socket import * 
>>> s=socket() 
>>> s.connect(('localhost',8000)) 
>>> s.sendall('a message') 
>>> s.shutdown(SHUT_WR) # tells server you're done sending, so recv won't wait for more 
>>> recvd='' 
>>> while True: 
... data = s.recv(1024) 
... if not data: break 
... recvd += data 
... 
>>> recvd 
'a response' 
>>> s.close()