通过套接字发送文件

时间:2010-05-26 16:45:37

标签: python sockets

我在将数据作为文件从套接字的一端发送到另一端时遇到问题。发生的事情是服务器和客户端都在尝试读取文件,因此永远不会发送文件。我想知道如何让客户端阻塞,直到服务器完成读取客户端发送的文件为止。

我使用send和recv处理原始数据包,但认为这是一个更清洁的解决方案......

客户端:

  1. 连接到服务器创建套接字连接
  2. 在套接字上创建文件并发送数据
  3. 等待来自服务器的文件
  4. 服务器

    1. 等待来自客户的文件
    2. 完成交互:

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

        我实际看到的代码已发布在这个问题中,但我认为Eventlet的东西吓到了人们...... https://stackoverflow.com/questions/2909358/eventlet-client-server

        下面只是使用Python套接字,所以我想我会简化问题并询问核心套接字问题......

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

我不确定问题是否清楚,你问:

  1. 如何通过套接字发送整个文件的数据?
  2. 如何在编写一些数据后让编写器阻止?
  3. 完全不同的其他事情?
  4. 如果问题是#1,则需要打开文件并将其解析为字节流,然后在单个“写入”调用中传递整个字节集。

    如果问题是#2,意味着您希望编写器等到读者完全读取字节(并处理它们)之后再继续,那么您需要读写器进行协调。您可以通过在写入后让编写器调用“read”(读取是阻塞调用)来完成此操作。然后在阅读器完成读取(并处理字节)之后,它会向作者写一些内容以将其唤醒。

    如果问题是#3,也许您可​​以提供更多详细信息。

答案 2 :(得分:0)

我不清楚你在问什么,但也许你在寻找select

http://docs.python.org/library/select.html