2015-11-26 3 views
2

Я пытаюсь преобразовать this пример websocket для использования в Python 2.5, но я запутался в ошибках с использованием типа bytearray.Backporting bytearray to Python 2.5

код перестает работать для Python 2.5 здесь (в send_text методом websocket_server/websocket_server.py):

FIN = 0x80 
    OPCODE = 0x0f 
    def send_text(self, message): 
     header = bytearray(); 
     payload = encode_to_UTF8(message) 
     payload_length = len(payload) 
     header.append(FIN | OPCODE_TEXT) 
     header.append(payload_length) 

     self.request.send(header + payload) 

Сообщение переменной хранит входные строки, которые отправляются клиентам.

Он пытается создать массив байтов и отправить его с использованием метода self.request.send. Как я могу изменить это, чтобы он работал в Python 2.5, который не имеет типа байтов или bytearray?

+0

В чем причина использования Python 2.5 вместо обновления? – tglaria

+0

В настоящее время я разрабатываю библиотеку Jython 2.5.3. – MashterYoda

+0

У вас есть структура? – tglaria

ответ

1

Использование функции struct MIGHT, я не тестировал это.

Что бы я сделал, в качестве обходного пути было бы использовать struct.pack для пакетного байта.

mensaje = "saludo" 
FIN = 0x80 
OPCODE = 0x0f 
payload = '' 
for c in mensaje: 
    payload += struct.pack("H", ord(c)) 

msj = struct.pack("H",FIN | OPCODE) 
msj+= struct.pack("H",len(payload)) 
print msj + payload 

Я использую «Н» в качестве параметра «FMT» в функции struct.pack, но лучше проверить, как отправляется ваш пакет и сколько байт на символ «» (так как я предполагаю, вы используете unicode, я использую «H», unsigned short = 2 байта).

Дополнительная информация: https://docs.python.org/2/library/struct.html, раздел 7.3.2.1 и 7.3.2.2.

EDIT: Отвечу здесь, что же я имею в виду, используя 'Chr()' вместо 'struct.pack()':

mensaje = "saludo" 
FIN = 0x80 
OPCODE = 0x0f 
payload = mensaje 
msj = chr(FIN | OPCODE) 
msj+= chr(len(payload)) 
print msj + payload 

если вы печатаете сообщение, то вы должны см. тот же вывод при использовании struct.pack("B", ord(something)), чем при использовании ord(something), я просто использовал struct.pack(), потому что я думал, что ваше сообщение было два байта на символ (как unicode).

+0

Большое вам спасибо! Этот обходной путь работал с использованием fmt = "B" вместо "H". Похоже, сервер теперь может отправлять текст. – MashterYoda

+1

Рад это услышать. Итак, вы отправляете байты ascii? (B - один символ, в этом случае вместо структуры вы можете просто использовать 'ord (c)' – tglaria

+0

Да, похоже, что я отправляю байты ascii. Что вы понимаете, заменив struct на ord (c)? – MashterYoda