我在将数据作为文件从套接字的一端发送到另一端时遇到问题。发生的情况是服务器和客户端都试图读取该文件,因此该文件永远不会被发送。我想知道如何让客户端阻塞,直到服务器完成读取客户端发送的文件。
我使用发送和接收来处理原始数据包,但我认为这是一个更干净的解决方案......
Client:
- 连接到服务器创建套接字连接
- 在套接字上创建文件并发送数据
- 等待来自服务器的文件
Server:
- 等待来自客户端的文件
完整互动:
- 客户端向服务器发送数据
- 服务器向客户端发送数据
Edit
我实际上正在查看的代码已发布在这个问题中,但我认为 Eventlet 的东西吓到了人们......https://stackoverflow.com/questions/2909358/eventlet-client-server
在它的下面只是使用Python套接字,所以我想我应该简化问题并只询问核心套接字问题......
听起来好像您让客户端发送文件,然后等待服务器响应,但是如果您不向服务器表明它已完全读取文件,则服务器端的recv()将挂起等待更多数据。客户端完成发送后,您可以在客户端调用 shutdown(SHUT_WR)。这通知服务器一旦读取了发送的所有数据,就不再有任何数据了。
一个非常基本的示例(向服务器发送一个数据 blob 并接收一个数据 blob 作为响应):
server
>>> 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
client
>>> 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)