2014-09-25 90 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