Python丢失的软件包

2024-10-02 20:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python编写一个客户机-服务器应用程序,但是我遇到了一个问题,在客户端,我没有得到所有发送的数据。首先,我试图发送数字1到10,我收到了1,2,5,6,10,所以有很多数字丢失。在

服务器端:

def __init__( self ):
        super( MCCommunication, self ).__init__()

        HOST, PORT = socket.gethostbyname( socket.gethostname() ), 31000
        self.server = SocketServer.ThreadingTCPServer( ( HOST, PORT ), MCRequestHandler )
        ip, port = self.server.server_address        
        # Start a thread with the server
        # Future task: Make the server a QT-Thread...
        self.server_thread = threading.Thread( target = self.server.serve_forever )
        # Exit the server thread when the main thread terminates
        self.server_thread.setDaemon( True )
        self.textUpdated.emit( 'Server Started!' )
        print( 'Server Started!' )
        self.server_thread.start() 

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

    def creatMessage( self, type1 = 0, type2 = 0, message = ' ', extra = 0 ):        
        return pickle.dumps( {"type1":type1, "type2":type2, "message":message, "extra":extra} );

其中postbox['MasterClient']是包含序列化消息的队列。在

这是客户:

^{pr2}$

Tags: theselftrueserverrequestdefthreadprint
1条回答
网友
1楼 · 发布于 2024-10-02 20:30:14

当客户机试图读取这些消息时,服务器可能已经发送了多个消息,如果这些消息位于同一4k缓冲区中,recv()调用将同时获得这两个消息。在

您没有显示getMessage代码,但我猜您正在执行类似于pickle.loads(msg)的操作,但这只会给您第一条消息,并丢弃字符串的其余部分,因此将删除消息。如果在读取时缓冲了超过4096个字节,那么您还将遇到另一个问题,因为您可能最终得到一个消息片段,从而出现一个取消拾取的错误。在

您需要将获取的字符串拆分为单独的消息,或者更好的方法是将套接字视为一个流,并让pickle.load从中提取一条消息。在

相关问题 更多 >