我正在尝试实现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建议的那样,问题出现在我使用缓冲输出的移动应用程序中,但从未刷新过。
答案 0 :(得分:1)
代码似乎是正确的。
您的recv
调用是否返回空字符串?如果发生这种情况,则发生错误。
你还在移动端等待确认吗?如果您没有,只是退出移动端可能是执行过早关闭端点而不是发送所有数据。
另一种可能性是发件人没有正确处理send
也可能返回小于指定大小的值的事实(这在发送缓冲区已满时发生)。
答案 1 :(得分:1)
正如@ 6502建议的那样,问题出现在我使用缓冲输出(BufferedOutputStream
)的Android移动应用中,但从未刷过。在flush()
之后添加write()
解决了问题。