gpt4 book ai didi

python - 通过套接字发送文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:30 25 4
gpt4 key购买 nike

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

我使用发送和接收来处理原始数据包,但认为这是一个更简洁的解决方案...

客户:

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

服务器:

  1. 等待客户端的文件

完整交互:

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

编辑

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

在它的背后只是使用 Python 套接字,所以我想我应该简化问题并只询问核心套接字问题......

最佳答案

听起来你让客户端发送文件然后等待服务器响应,但是如果你不给服务器一个它已经完全读取文件的指示,服务器端的 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()

关于python - 通过套接字发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com