Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 07.05.2008
Сообщений: 10
1

Автоматическое определение кодировки клиента в Java-чате

18.06.2008, 18:26. Показов 1676. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Структура системы в кратце:
есть апплет чата
есть java-сервер, посредством которого апплеты чата общаются друг с другом.

Трабл: нужно, чтобы, когда происходит коннект чата с сервером, на сервере при открытии inputstream сокета выставлялась правильная кодовая страница (т.е. код страницы (вроде Cp1251) должен передаваться апплетом серверу). Однако для того, чтобы что-то передать на сервер, нужно сначала проинициализировать сокет. Т.е. закмнутый круг - кодовую страницу нужно передать до инициализации, но передать ее можно только после инициализации.

Плохо, что в Джаве нельзя менять encoding после открытия потока....

Пробовал заводить еще один сокет и по нему передавать кодовую страницу и имя пользователя. Но это ничего не дало, поотму что при последующем создании сокета, отвечающего за чат, нужно сначала как-то узнать имя пользователя, т.е. опять замкнутый круг. Сохранять IP-ник (т.е. определять пользователя не по имени, а по IP) в данной задаче нельзя, т.к. нужно поддерживать пользователей с динамическим IP.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2008, 18:26
Ответы с готовыми решениями:

Автоматическое определение подходящей кодировки.
Есть текст, который может содержать любые символы. Как определить для него наиболее подходящую...

Автоматическое переключение кодировки
Есть ли такой тег?

Автоматическое снятие дней у клиента
Здравствуйте форумчане, я недавно познакомился с mysql и хотел бы попросить у вас помощи, вот...

Отправка массива с сервера Java на клиента Java android
Подскажите, пожалуйста, как объявить массив на сервере и затем передать этот массив на экран...

3
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
19.06.2008, 10:54 2
То ли я чего-то не понял, то ли где... При получении InputStream/OutputStream из сокета не нужно указывать кодировку. Кодировка нужна для получении Reader/Writer из потока, и передается конструктору InputStreamReader/OutputStreamWriter. Так что же мешает сначала получить потоки, запросить через них кодировку (весь обмен проводить символами < 127), затем на этих же потоках открыть Reader и Writer?
0
0 / 0 / 0
Регистрация: 07.05.2008
Сообщений: 10
19.06.2008, 14:55  [ТС] 3
Я так тоже пробовал. Трабл в том, что в таком случае (т.е. работая непосредственно с InputStream) я не могу определить границы между сообщениями. Каждая мессага, выдаваемая чатом в Socket, кончается символом '
'. Представление этого символа в байтах мне неизвестно (тем более, оно, кажется, может вырьироваться. Например, передаваться двумя байтами(Unicode) или одним). В JDK docs слишком мало говорится о таких вещах, к сожалению.

Сейчас я думаю над тем, что, может быть, вообще отказаться от '
', и на стороне апплета тоже перейти к байтовым потокам, а в конце каждой мессаги ставить какой-нибудь уникальный разделитель.
В таком случае весь обмен будет байтовый, а строки будут получаться уже в конструкциях вида String s = new String(byteArray);
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
23.06.2008, 09:12 4
Я, вообще-то, не совсем это имел в виду. Сервер должен иметь два протокольных модуля: один - для поддержки чата - он расчитан на использование reader/writer, и использует в качестве разделителя например
, а второй - для поддержки служебного обмена. В этом служебном модуле ты можешь использовать совсем другие соглашения, вплоть до того, что открыть на этих потоках ObjectInputStream/ObjectOutputStream, или например не пользоваться текстовыми сообщениями, а писать бинарные данные через write(byte[]...) (в байты можно загонять ASCII коды символов названия кодировки). Сразу после установления соединения работает служебный модуль, и вопрос об интерпретации тех или иных символов в нем можно решать независимо от того, как это делается в основном модуле. Например, можно в качестве разделителя взять символ 'x0D' ;-) После того, как получено все требуемое, протокольный модуль отдает управление основному, который работает уже без всяких извратов.
0
23.06.2008, 09:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2008, 09:12
Помогаю со студенческими работами здесь

Умное определение кодировки
Хочется, чтобы кодировка выбранного пользователем файла определялась автоматически, как это делает...

Определение кодировки строки
Делаю программу, суть которой в отправке и получении смс. Столкнулся с такой проблемой: как...

Определение кодировки текста
Решил попробовать создать Декодер Текста, вот у меня возникло несколько вопросов... 1) все ли...

Определение кодировки страницы
Мне необходимо определить кодировку страницу, решение нашёл, но возникла проблема. HttpClient...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru