我在将数据作为文件从套接字的一端发送到另一端时遇到问题。发生的事情是服务器和客户端都在尝试读取文件,因此永远不会发送文件。我想知道如何让客户端阻塞,直到服务器完成读取客户端发送的文件为止。
我使用send和recv处理原始数据包,但认为这是一个更清洁的解决方案......
客户端:
服务器
完成交互:
修改
我实际看到的代码已发布在这个问题中,但我认为Eventlet的东西吓到了人们...... https://stackoverflow.com/questions/2909358/eventlet-client-server
下面只是使用Python套接字,所以我想我会简化问题并询问核心套接字问题......
答案 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,意味着您希望编写器等到读者完全读取字节(并处理它们)之后再继续,那么您需要读写器进行协调。您可以通过在写入后让编写器调用“read”(读取是阻塞调用)来完成此操作。然后在阅读器完成读取(并处理字节)之后,它会向作者写一些内容以将其唤醒。
如果问题是#3,也许您可以提供更多详细信息。
答案 2 :(得分:0)
我不清楚你在问什么,但也许你在寻找select
?