Сокет сервера AS3, событие progress, readutfbytes - PullRequest
1 голос
/ 05 декабря 2011

здесь есть небольшая проблема.

Я работаю над многопользовательской игрой с flash и использую python для серверной части вещей. У меня работает сокетное соединение ... вроде, и довольно много работы над Python сделано, но я сталкиваюсь со странной проблемой.

Допустим, после входа в систему я отправляю клиенту некоторые данные, содержащие некоторую их информацию. После чего я отправляю некоторые данные, чтобы назначить их комнате.

Эти данные не считываются в AS3 как две разные вещи, вместо этого, после readUTFBytes, они все в одной строке.

var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable);

В python я определил методы для отправки данных, которые просто отправляют данные через transport.write (Twisted), и я получаю через событие данных сокета прогресса в сценарии действия. Есть идеи, что здесь может быть не так? Вот немного кода ...

if ( ! event.currentTarget.bytesAvailable > 0) {
            return;
        }
        var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable);
        var Char1:String = str.charAt(0);
        var Char2:String = str.charAt(1);
        str = str.replace(Char1, "");
        str = str.replace(Char2, "");

        // Various messages
        if (Char1 == "\x03") {
            if (Char2 == "\x03") {
                trace("Got ping thread");
            }
            else {
                trace("x03 but no secondary prefix handled");
            }
            return;             
        }

Довольно неряшливо, я знаю, но я пытаюсь просто определить проблему.

Все данные поставляются с двумя префиксами, например, \ x02 и \ x09, чтобы я мог определить, что делать, затем большая часть данных в строке разделяется на \ x01 для получения значений.

Проблема, по сути, в том, что когда я должен получить данные / x08 / x08, я получу данные / x08 / x08 data / x05 / x03, когда это должны быть две разные вещи.

1 Ответ

2 голосов
/ 05 декабря 2011

TCP-соединения надежны, упорядочены, ориентированы на поток . Поток - это последовательность байтов без внутренних границ сообщения. Если вы хотите разделить свои байты на отдельные сообщения, сами байты должны указать вам, как выполнить это разбиение (или вам нужно какое-то внешнее правило, которое всегда применяется, например, «сообщение имеет длину 5 байтов») .

Это относится ко всем TCP-соединениям, независимо от того, на каком языке вы их используете, или какой странный API, специфичный для библиотеки, сбрасывается поверх них (например, readUTFBytes).

Существует множество опций для протоколов , которые могут помочь вам frame ваших сообщений. Например, вы можете использовать префикс длины. Тогда ваши сообщения будут выглядеть так:

\x07 \x08 \x08 h e l l o \x05 \x05 \x03 m a n

\x07 дает длину первого сообщения, 7 байтов: \x08 \x 08 h e l l o. Следующий байт после этого сообщения, \x05, определяет длину второго сообщения: \x05 \x03 m a n.

Вы можете использовать префиксы многобайтовой длины, если ваши сообщения должны быть длиннее, или netstrings, которые используют десятичное представление и разделитель : для поддержки префиксов произвольного размера. Есть также более сложные протоколы, которые предлагают больше возможностей, чем просто разделение ваших байтов на сообщения. Например, есть AMP , который дает вам форму RPC с аргументами и ответами.

...