2014-09-25 130 views
0

您好,我有多个系统通过使用TCP连接的消息进行通信。TCP套接字无法在突发中发送消息

我的发送功能如下所示

def _send(self, message, dest): 

    self.sendLock.acquire() 
    message = pickle.dumps(message) 
    #sending length 
    message_length = len(message) 
    self.outChan[dest].send('<MESSAGELENGTH>%s</MESSAGELENGTH>' 
          % str(message_length)) 

    for message_i in range(0, message_length, 1024): 
     self.outChan[dest].send(message[:1024]) 
     message = message[1024:] 

    self.sendLock.release() 

和接收线程是这样的:该消息是从self.rec确认消息读取发送给发件人

def readlines(self, sock): 

    while True: 

     msg = '' 

     opTag = '<MESSAGELENGTH>' 
     clTag = '</MESSAGELENGTH>' 

     while not all(tag in msg for tag in (opTag, clTag)): 
      msg = sock.recv(1024) 

     msglen = int(msg.split(clTag)[0].split(opTag)[1]) 
     msg = msg.split(clTag)[1] 

     while len(msg) < msglen: 
      msg += sock.recv(msglen-len(msg)) 

     self.rec.put(pickle.loads(msg)) 

后。

我已经实现了我自己的缓冲区来控制网络中的流量。在任何时候,我都会发送几乎没有收到确认的MAX_BUFFER_SIZE消息。

下面是问题:程序启动时,它会发送MAX_BUFFER_SIZE消息而不等待确认。但是只有少数这些MAX_BUFFER_SIZE消息被接收。

在其中一个MAX_BUFFER_SIZE = 5的仿真中,共发送了100条消息,未接收到m2,m3和m4。所有其他消息都已收到(按照它们发送的顺序)。

我怀疑错误是在最初的发送突发,但我无法找出确切的问题。

回答

1

有在接收线程的几个误区:

  1. 在考察的开始和结束标记收到的消息,你是不是追加到已经收到一部分,但覆盖它。

  2. 检测到消息长度后,您将丢失后续消息,它们的结束标记已经收到,但尚未分析。

  3. 您可能会将几条消息放在一起放入self.rec

这里是一个经校正的形式,用注释解释的变化:

def readlines(self, sock): 

    msg = '' # initialize outside since otherwise remiander of previous message would be lost 

    opTag = '<MESSAGELENGTH>' # no need to repeat this in each iteration 
    clTag = '</MESSAGELENGTH>' # no need to repeat this in each iteration 

    while True: 

     while not all(tag in msg for tag in (opTag, clTag)): 
      msg += sock.recv(1024) # += rather than = 

     msglen = int(msg.split(clTag)[0].split(opTag)[1]) 
     msg = msg.split(clTag, 1)[1] # split just once, starting from the left 

     while len(msg) < msglen: 
      msg += sock.recv(msglen-len(msg)) 

     self.rec.put(pickle.loads(msg[:maglen])) # handle just one message 
     msg = msg[msglen:] # prepare for handling future messages 
+0

它的工作原理。谢谢 :) – user1396267 2014-09-25 11:28:43