2013-12-19 3 views
1

У меня есть этот код:Python3: Socket Receive получает все данные, в то же время

class SrvHandler(asyncore.dispatcher_with_send): 
    def handle_read(self): 
     data = self.recv(1024) 
     if data: 
      data = str(data, 'utf-8') 
      print("Received: " + data) 

Теперь, у меня есть VBasic приложения. Это приложение имеет 2 thread. Этот два потока работает одновременно, но использует одно и то же соединение (статическое соединение объявлено). Иногда эти 2 потока отправляют данные одновременно или в аренду задерживают между миллисекундами. Но проблема в том, что Python3 получает эти 2 разных данных одновременно, как одна строка данных.

Например:

VBasic Thread 1: socket.write("Hello") 
VBasic Thread 2: socket.write("12345") 

Python3 Data: 
    Expected Result: 
     First recv: Hello 
     Second recv: 12345 
    Actual Result: 
     First recv: Hello12345 

Почему Python3 действует как это? Что я могу сделать, чтобы предотвратить этот микс? В чем причина такого поведения? Это по дизайну? Как я могу предотвратить это? На python3 или VBasic (клиент или сервер)

Надейтесь, что этот пример и код достаточно информативны.

ответ

2

Ожидаемое поведение для потоковой службы, такой как TCP.

TCP не может передавать какое-либо сообщение длиннее одного байта.

Если вы хотите передать какую-либо структуру длиннее одного байта, вам нужен протокол поверх TCP - возможно, положить нуль или что-то в конце ваших строк и отправить его также. На принимающей стороне соедините все полученные байты, пока не найдете нуль.

+0

И ..... Сделано! Благодаря :) – xangr