0 / 0 / 0
Регистрация: 07.05.2008
Сообщений: 10
|
|
1 | |
Автоматическое определение кодировки клиента в Java-чате18.06.2008, 18:26. Показов 1676. Ответов 3
Метки нет (Все метки)
Структура системы в кратце:
есть апплет чата есть java-сервер, посредством которого апплеты чата общаются друг с другом. Трабл: нужно, чтобы, когда происходит коннект чата с сервером, на сервере при открытии inputstream сокета выставлялась правильная кодовая страница (т.е. код страницы (вроде Cp1251) должен передаваться апплетом серверу). Однако для того, чтобы что-то передать на сервер, нужно сначала проинициализировать сокет. Т.е. закмнутый круг - кодовую страницу нужно передать до инициализации, но передать ее можно только после инициализации. Плохо, что в Джаве нельзя менять encoding после открытия потока.... Пробовал заводить еще один сокет и по нему передавать кодовую страницу и имя пользователя. Но это ничего не дало, поотму что при последующем создании сокета, отвечающего за чат, нужно сначала как-то узнать имя пользователя, т.е. опять замкнутый круг. Сохранять IP-ник (т.е. определять пользователя не по имени, а по IP) в данной задаче нельзя, т.к. нужно поддерживать пользователей с динамическим IP.
0
|
18.06.2008, 18:26 | |
Ответы с готовыми решениями:
3
Автоматическое определение подходящей кодировки. Автоматическое переключение кодировки Автоматическое снятие дней у клиента Отправка массива с сервера Java на клиента Java android |
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 | |
23.06.2008, 09:12 | |
Помогаю со студенческими работами здесь
4
Умное определение кодировки Определение кодировки строки Определение кодировки текста Определение кодировки страницы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |