Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过套接字发送文件_Python_Sockets - Fatal编程技术网

Python 通过套接字发送文件

Python 通过套接字发送文件,python,sockets,Python,Sockets,我在将数据作为文件从套接字的一端发送到另一端时遇到问题。发生的情况是,服务器和客户机都试图读取该文件,因此该文件永远不会被发送。我想知道在服务器读取完从客户端发送的文件之前,如何阻止客户端 我使用send和recv处理原始数据包,但我认为这是一个更干净的解决方案 客户端: 连接到服务器创建套接字连接 在套接字上创建文件并发送数据 等待来自服务器的文件 服务器: 等待来自客户端的文件 完成交互操作: 客户端向服务器发送数据 服务器向客户端发送数据 编辑 我实际上看到的代码是在这个问题中发布的,但我

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

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

客户端:

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

  • 等待来自客户端的文件
  • 完成交互操作:

  • 客户端向服务器发送数据
  • 服务器向客户端发送数据
  • 编辑

    我实际上看到的代码是在这个问题中发布的,但我认为Eventlet的东西吓坏了人们。。。


    下面是仅使用Python套接字的问题,因此我想我应该简化问题并只询问核心套接字问题…

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

  • 如何通过套接字发送整个文件的数据
  • 如何让写入程序在写入某些数据后阻塞
  • 还有别的吗
  • 如果问题是#1,则需要打开文件并将其解析为字节流,然后在单个“写入”调用中传递整个字节集合

    如果问题是#2,这意味着您希望编写器在继续之前等待读卡器完全读取字节(并处理它们??),那么您需要读卡器和编写器进行协调。您可以通过在写入之后让writer调用“read”(read是一个阻塞调用)来实现这一点。然后,在读卡器完成读取(并处理字节)后,让它向写卡器写入内容以唤醒它


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

    我不太清楚你在问什么,但也许你正在寻找
    选择


    听起来您让客户端发送文件,然后等待服务器响应,但如果您没有向服务器指示它已完全读取文件,服务器端的recv()将挂起等待更多数据。一旦客户端完成发送,就可以在客户端调用shutdown(shutdown_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()
    

    第二种选择。出于某种原因,你所描述的是我正在做的事情,它不起作用。阅读的协调性是我想弄明白的。。。