I am trying to implenent SocketServer to receive file from mobile application:
Size of file is received correctly. In application all data is sent. However, SocketServer can't receive all data and sticks.
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()
SOLVED As @6502 suggested, problem was in mobile app where I used buffered output, but never flushed.
As @6502 suggested, problem was in Android mobile app where I used buffered output (BufferedOutputStream
), but never flushed. Adding flush()
after write()
solved the problem.