1

I'm trying to send some data from the server to the client, but the client doesn't get all the data.

Server:

def handle( self ):       
        #self.request.setblocking( 0 )
        i = 10;
        while True:
            if( self.clientname == 'MasterClient' ):                
                try:                    
                    #ans = self.request.recv( 4096 )
                    #print( 'after recv' )   
                    """    Sendign data, testing purpose    """                 
                    while i:
                        mess = str( i );            
                        postbox['MasterClient'].put( self.creatMessage( 0, 0 , mess ) )
                        i = i - 1
                    while( postbox['MasterClient'].empty() != True ):                        
                        sendData = postbox['MasterClient'].get_nowait()                        

                        a = self.request.send( sendData )
                        print( a );
                        #dic = self.getMessage( sendData )
                        #print 'Sent:%s\n' % str( dic )                         
                except:                    
                    mess = str( sys.exc_info()[0] )
                    postbox['MasterClient'].put( self.creatMessage( 1, 0 , mess ) )
                    pass

Client:

def run( self ):        
        sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )        
        addr = ( self.ip, self.port )        
        #print addr
        sock.connect( addr )
        #sock.setblocking( 0 )
        while True:         
            try:   
                ans = sock.recv( 4096 )                
                dic = self.getMessage( ans )               
                self.recvMessageHandler( dic )  
                print 'Received:%s\n' % str( dic )       
            except:
               print "Unexpected error:", sys.exc_info()[0]

Where did I make the mistake?

2 Answers 2

1

Reads are not symmetrical with writes when using TCP, very often the receiving OS will return much smaller chunks of data than the sending side sends out. A common solution is to prefix each send with a fixed-size integer that contains the length of the next message. The pattern for receiving a complete message then becomes:

bin  = sock.recv(4) # for 4-byte integer
mlen = struct.unpack('I', bin)[0]
msg  = ''
while len(msg) != mlen:
    chunk = sock.recv(4096) # 4096 is an arbitrary buffer size
    if not chunk:
        raise Exception("Connection lost")
    msg += chunk
Sign up to request clarification or add additional context in comments.

Comments

1

Make sure you are receiving all data as it's not guaranteed to be sent in a single chunk. For example:

data = ""
while True:
    chunk = sock.recv(4096)
    if not chunk:
        break
    data += chunk

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.