Python SocketServer无法接收所有数据
Python SocketServer can't receive all data
我正在尝试实现 SocketServer 从移动应用程序接收文件:
- 移动应用程序发送文件大小。
- 移动应用程序发送文件。
正确接收文件大小。在应用程序中发送所有数据。但是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()
解决问题。
我正在尝试实现 SocketServer 从移动应用程序接收文件:
- 移动应用程序发送文件大小。
- 移动应用程序发送文件。
正确接收文件大小。在应用程序中发送所有数据。但是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()
解决问题。