PDA

Просмотр полной версии : Socket+string


RadiationX
25.10.2006, 13:35
1. Есть сокет подключенный к серверу. Сервер отправляет пакет с некоторым количеством строк. Строка завершается 0. Как на AS3 прочитать строки?

2. Для того чтобы отправить строку из AS3 на сервер делаю так:


var s:String = "test";
var b:ByteArray = new ByteArray();
b.endian = Endian.LITTLE_ENDIAN;
b.writeObject(s);
b.writeByte(0);
socket.writeBytes(b);
socket.flush();


Почему в результате перед нулевым символом появляются два байта, каждый раз разные?

MerlinTwi
25.10.2006, 13:48
Если все передается с завершающим нуль-байтом и нет бинарных данных, то почему бы не работать с прежним XMLSocket?

RadiationX
25.10.2006, 13:56
Кроме строки могут быть любые другие данные.

MerlinTwi
25.10.2006, 14:15
Тогда нуль-байт тут вообще не причем. Метод writeObject записывает объект в виде последовательности байтов в формате AMF serialized format.
И для того чтобы корректно читать эту информацию на стороне сервера, не надо изобретать велосипед, а подключить библиотеку понимающую AMF.

Nirth
25.10.2006, 16:02
Зачем ты пишешь объект? напиши байты по одному.

RadiationX
25.10.2006, 16:59
Попробую сформулировать вопрос по другому:

1. Записать string в socket и завершить нулевым символом

2. Прочитать из socket с определенной позиции string, который завершается нулевым символом

Пункт 1 уже работает, через ByteArray, можно еще попробовать записывать каждый символ отдельно

С пунктом 2 пока не знаю, можно считывать по символу и добавлять к строке.

Кстати в документации сказано, что AS3 использует UTF16 строки (каждый символ по 2 байта). При получении строки, отправленной из AS3, на сервере, можно читать по одному байту и все будет правильно. Почему?

etc
25.10.2006, 17:13
А почему ты не юзаешь writeMultibyte, к примеру?

RadiationX
25.10.2006, 17:44
Проверил writeMultibyte, работает нормально. Остается чтение строки. Есть readMultibyte, но там необходимо указывать длину строки. Наверное придется ее указывать при отправке со стороны сервера.

etc
25.10.2006, 17:49
А bytesAvailable для чего?
Все ответы на вопросы описаны в хелпе, собственно.

RadiationX
25.10.2006, 17:51
А если отправляю целую структуру данных? Несколько различных строк, потом еще что-нибудь.

etc
25.10.2006, 17:53
Ну так посылайте некий байт, который указывает на то, что структура началось здесь и закончилась там. Собирайте всё в одну строку, затем можно парсить структуры.

RadiationX
25.10.2006, 18:20
Вопросов больше нет, спасибо за помощь!

Для отправки строк использую writeMultiByte + записываю нулевой символ, для получения - считываю длину строки, затем readMultiByte.

john
25.10.2006, 22:25
я шлю длину строки двумя байтами (short), потом строку в UTF-8, и нулевой байт не нужен.
тестировал с джава ByteBuffer работает замечательно.
и шлет и читает.