Python SocketServer无法接收所有数据

Python SocketServer can't receive all data

我正在尝试实现 SocketServer 从移动应用程序接收文件:

  1. 移动应用程序发送文件大小。
  2. 移动应用程序发送文件。

正确接收文件大小。在应用程序中发送所有数据。但是SocketServer无法接收到所有数据,卡住。

import SocketServer
import struct

class MyTCPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        size = self.readLong()
        print 'Payload size', size

        bytes = self.readExact(size)
        print 'Read bytes'

        self.request.sendall('Hurray!')

    def readLong(self):
        return long(struct.unpack('>q', self.readExact(8))[0])

    def readExact(self, num):
        buf = bytearray()
        remaining = num
        while remaining > 0:
            chunk = self.request.recv(remaining)
            if not chunk:
                raise EOFError('Could not receive all expected data!')
            buf.extend(chunk)
            remaining -= len(chunk)
        return buf

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

已解决 正如@6502 所建议的那样,问题出在我使用缓冲输出但从未刷新的移动应用程序中。

代码似乎正确。

你的 recv 调用 return 是空字符串吗?如果发生这种情况,则发生错误。

你也在手机端等着ack吗?如果你不这样做,只是退出移动端,可能是那里的实现过早关闭了端点,没有发送所有数据。

另一种可能性是如果发件人没有正确处理 send 也可能 return 小于指定大小的值(当发送缓冲区已满时会发生这种情况)。

正如@6502 所建议的,问题出在 Android 移动应用程序中,我在其中使用了缓冲输出 (BufferedOutputStream),但从未刷新。在 write() 后添加 flush() 解决问题。