我试图用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}$
当客户机试图读取这些消息时,服务器可能已经发送了多个消息,如果这些消息位于同一4k缓冲区中,
recv()
调用将同时获得这两个消息。在您没有显示
getMessage
代码,但我猜您正在执行类似于pickle.loads(msg)
的操作,但这只会给您第一条消息,并丢弃字符串的其余部分,因此将删除消息。如果在读取时缓冲了超过4096个字节,那么您还将遇到另一个问题,因为您可能最终得到一个消息片段,从而出现一个取消拾取的错误。在您需要将获取的字符串拆分为单独的消息,或者更好的方法是将套接字视为一个流,并让
pickle.load
从中提取一条消息。在相关问题 更多 >
编程相关推荐