Search code examples
pythonpython-2.7socketserver

Python SocketServer can't receive all data


I am trying to implenent SocketServer to receive file from mobile application:

  1. Mobile application sends size of file.
  2. Mobile application sends file.

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.


Solution

  • 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.