Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sockets, Отправка нулевого байта 
:(
    Опции темы
IvanB
Дата 30.3.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Суть вопроса отображена в названии.
У меня сокет-сервер, написанный на Java и сокет-клиент, написанный на ActionScript.
И у этого клиента для всх входящих сообщений есть требование, чтобы они оканчивались нулевым байтом.
В функции write :
Код

// wr здесь - new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));, где 
//  sock = server.accept();
public void writeData(String data) throws IOException
{
    wr.write(data);
//----------Добавление нулегого байта как-то
    wr.flush();
}

Пробовал прописывать отправку следующим образом:
Код

        wr.write(0x00);
        // а также
        wr.write(0);

Также пробовал извлекать последний символ из входящих сообщений (Которые сервер вполне воспринимает) и отправлять его.
Но Клиент такие сообщения не воспринимает.
Есть какие нибудь предложения, кроме того, чтобы использовать другой клиент?smile
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
LSD
Дата 30.3.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Вообще SocketOutputStream работает в бинарном режиме, и если в него записать 0, то он и передаст нулевой байт. Что это за переменная wr у тебя в примере?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RazIv
Дата 31.3.2006, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Цитата

Что это за переменная wr у тебя в примере?

Код

BufferedWriter wr=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));

у меня таже проблема((

Это сообщение отредактировал(а) RazIv - 31.3.2006, 04:10
PM MAIL   Вверх
IvanB
Дата 31.3.2006, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Цитата
Что это за переменная wr у тебя в примере?

Это переменная для ввода данных в выходной поток сервера.
Если прописать просто 0 - клиент не воспринимает.

--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
Alexandr87
Дата 31.3.2006, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



IvanB, вопрос наверное был, касаемо о типе(классе) данного объекта, если это BufferedWriter, как у RazIv, то, это символьный поток, и твой 0, перед тем как отправляться конвертиться и посылается соответствующим кодом. Лучше как сказал LSD, использовать SocketOutputStream, или можешь попробовать
char buf[]=new char[1];
buf[0]=0;
wr.write(buf);
или
wr.write("\0");
попробуй, может получиться

ЗЫ. Только сейчас увидел, что
Цитата

wr здесь - new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));


Это сообщение отредактировал(а) Alexandr87 - 31.3.2006, 08:27
PM Jabber   Вверх
LSD
Дата 31.3.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Попробуй так:
Код
Socket socket;
OutputStream out = socket.getOutputStream();
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(out));

public void writeData(String data) throws IOException
{
  wr.write(data);
  wr.flush();
  out.write(0);
  out.flush();
}

Добавлено @ 11:01
Да, и еще один момент. Ты не указал явно кодировку для OutputStreamWriter, а это значит что он будет использовать умолчальную в системе. Если клиент и сервер будут на систмах с разными системными кодировками, будут проблемы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RazIv
Дата 1.4.2006, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



Цитата

Если клиент и сервер будут на систмах с разными системными кодировками, будут проблемы.


Здесь сервер и клиент отправляют пакеты с UTF строками
пример:
00000002|0000000F|00000004user00000003pas
заголовок пакета|длина даных пакета|данные

Это сообщение отредактировал(а) RazIv - 1.4.2006, 03:29
PM MAIL   Вверх
IvanB
Дата 1.4.2006, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



Код

Здесь сервер и клиент отправляют пакеты с UTF строками
пример:
00000002|0000000F|00000004user00000003pas
заголовок пакета|длина даных пакета|данные 

По-моему проще было-бы с кодировками.
Тем более даже в этом случае они понадобятся.
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
LSD
Дата 1.4.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(RazIv @ 1.4.2006, 04:26 Найти цитируемый пост)
Здесь сервер и клиент отправляют пакеты с UTF строками
пример:
00000002|0000000F|00000004user00000003pas
заголовок пакета|длина даных пакета|данные

1. OutputStreamWriter по умолчание использует не UTF. И вообще какую именно кодировку ты используешь UTF-8, UTF-16LE, UTF-16BE?
2. Пакет у тебя имеет бинарный формат: вначале идет заголовок (четыре фиксированных байта), затем длинна (4-х байтовое целое big-endian), затем уже данные в некоторой фиксированной кодировке.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RazIv
Дата 3.4.2006, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.3.2006

Репутация: нет
Всего: нет



попробуй так
Код

wr.write+=(char)0x00;

PM MAIL   Вверх
IvanB
Дата 3.4.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



По-моему ты что-то не то написал.....
Т.к. wr.write - это метод, а не параметр.
А если
Код
 wr.write((char)0x00); 
, то так не пашет.
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
COVD
Дата 3.4.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Странная проблема. Речь идет о символе "конец строки"? Он должен быть одинаков везде и java его вроде ставит автоматически. Надо наверное использовать класс PrintStream, заточенный под строки.
PM MAIL   Вверх
IvanB
Дата 3.4.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



По-моему всё-таки это не одно и тоже.....Или я не прав?
А можно поподробнее?
Добавлено @ 16:16
Цитата(COVD @ 3.4.2006, 15:37 Найти цитируемый пост)
Он должен быть одинаков везде

А вот это по-моему неверно.....
Поправьте, если не так.

Это сообщение отредактировал(а) IvanB - 3.4.2006, 16:39
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
COVD
Дата 3.4.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

По-моему всё-таки это не одно и тоже.....


Вы же пишете, что требуется чтобы сообщения кончались нулевым байтом. Если вы пишете в поток текстовую строку, то она обычно кончается специальным символом. Конец строки или перевод строки. И читающая сторона берет строку целиком. Для работы со строками специальные методы есть в java, наверное и во Флаше тоже (типа readLine, println).

Символы конца строки конечно могут быть разными для разных операционных систем. Но вы то пользуетесь средствами программирования для интернета, здесь должно быть уже согласовано или есть возможность согласовать через выбора нужного класса или настройки. Вручную конец текстовой строки писать - это немного странно выглядит. Или клиент на Флаше написан без использования стандартного протокола?

Это сообщение отредактировал(а) COVD - 3.4.2006, 18:09
PM MAIL   Вверх
LSD
Дата 3.4.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(COVD @ 3.4.2006, 19:07 Найти цитируемый пост)
Символы конца строки конечно могут быть разными для разных операционных систем. Но вы то пользуетесь средствами программирования для интернета, здесь должно быть уже согласовано или есть возможность согласовать через выбора нужного класса или настройки. Вручную конец текстовой строки писать - это немного странно выглядит. Или клиент на Флаше написан без использования стандартного протокола?

PrintStream заканчивает строку line separator-ом принятым на той платформе где запущена JVM. Он не предназначен для гетерогенного обмена данными.


IvanB, ты пробовал тот код, что я написал?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1384 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.