2015-02-03 2 views
1

Я пытаюсь использовать this class, предоставленный скрученным в кадр моего потока tcp. Но формат по умолчанию, который у них есть, находится в байтовом порядке большого байта, но мне нужно читать в маленьком конце.twisted Int16StringReceiver little endian byte order

Так что я сделал:

class Player(basic.Int16StringReceiver): 
    structFormat = "<H" 

    def stringReceived(self, packet): 
     print ':'.join(x.encode('hex') for x in packet) 

Но по какой-то причине stringReceived редко вызывается. И клиент, и сервер находятся на одной машине, и я очень уверен, что клиент действительно отправил данные.

Так почему же stringReceived не вызывается каждый раз данные получены.

Я попытался перекрывая dataReceived:

class Player(basic.Int16StringReceiver): 
    structFormat = "<H" 

    def dataReceived(self, recd): 
     print ':'.join(x.encode('hex') for x in recd) 

И это делает печать каждый раз, когда клиент отправляет данные. Так почему же не вызывается stringReceived? Может быть, рама? Но почему?

+0

Могу я увидеть протокол клиента? –

ответ

2

Клиент должен отправить сообщение, как это:

len(string)string 

где Len (строка) - должны быть упакованы в соответствии с форматом, используемым сервером.

Вот что происходит в IntNStringReceiver.sendString

self.transport.write(
    pack(self.structFormat, len(string)) + string) 

Просто, чтобы подтвердить, Int16StringReceiver не целые отправителя/получателя. Он делает следующее: отправлять сообщения с байтами через транспорт в указанном выше формате. И это плохая идея переопределить dataReceived так, как вы это сделали. Этот метод довольно сложный, как вы можете видеть в исходном коде.

Советую: убедитесь, что клиент действительно отправляет len(string)string, где len(string) упакован с использованием формата <H.

Я протестировал клиента, который отличается от формата сервера, и сервер просто сходит с ума.

+0

А я вижу. поэтому он требует '|', но я фактически использую двоичный протокол, а не строку. Я просто использую данную библиотеку. В любом случае, я просто найду другую альтернативу. Мой протокол: '(len) (msg)'. – majidarif

+0

'' 'просто визуальный seperator –

+0

обновленный ответ и удаленный' | ' –

Смежные вопросы