Python SocketServer无法接收所有数据

时间:2015-05-30 12:43:55

标签: python python-2.7 socketserver

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

  1. 移动应用程序发送文件大小。
  2. 移动应用程序发送文件。
  3. 正确接收文件大小。在应用程序中,发送所有数据。但是,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建议的那样,问题出现在我使用缓冲输出的移动应用程序中,但从未刷新过。

2 个答案:

答案 0 :(得分:1)

代码似乎是正确的。

您的recv调用是否返回空字符串?如果发生这种情况,则发生错误。

你还在移动端等待确认吗?如果您没有,只是退出移动端可能是执行过早关闭端点而不是发送所有数据。

另一种可能性是发件人没有正确处理send也可能返回小于指定大小的值的事实(这在发送缓冲区已满时发生)。

答案 1 :(得分:1)

正如@ 6502建议的那样,问题出现在我使用缓冲输出(BufferedOutputStream)的Android移动应用中,但从未刷过。在flush()之后添加write()解决了问题。