![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| JlOKu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 30.4.2006 Репутация: нет Всего: нет |
Есть куча вопросов: вот начал писать столкнулся с такой проблемой.
У меня структура чата такая есть сервер и клиенты . Все клиенты соеденены с сервером.
Для каждого клиента создается отдельный поток для чтения и записи. У меня ни как не получается прочитать сообщение от клиента. Я пытаюсь сделать это так.
message это обьект , который содержит в себе сообщение , код сообщения и и ник клиента , который положил это сообщение. Вот! Мне не понятно одно , как организовать общение между клиентом и сервером , когда неизвестно в какой момент времени клиент пошлет сообщение , и неизвестно в какой момент ответит сервер. Можно вместо BufferedReader написать InputStream и методом read (read блокирует поток , то есть ждет пока клиент что нить напишет , а это и нужно )прочитать сообщение по байтого , но так не пойдет потому , что чат должен поддерживать unicode. За любой совет буду рад , спасибо заранее. |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
1. Вот реализации Jabber Server и Jabber Client на Java, может проще взять их и адаптировать под свои нужды?
2. И у клиента и у сервера есть поток который ждет пока поступят данные, он может делать с блокировкой до тех пор пока не поступят данные, а может и не ждать, а проверять скажем другие соединения на предмет наличия данных. -------------------- 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. |
|||
|
||||
| JlOKu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 30.4.2006 Репутация: нет Всего: нет |
Спасибо ! Есть еще один вопрос , вот на днях написал чат на JAVA используя IMAP .Столкнулся с такой проблемой как кодировка , выяснил что на самом серваке русский шрифт не понимается. Я отправляю сообщение с помощю DataOutputStream , а принимаю соответственным Input, приходит клякса , может кто сталкивался с такой проблемой ?
Это сообщение отредактировал(а) JlOKu - 16.5.2006, 07:03 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
DataOutputStream пишет строки в кодировке UTF-8, возможно сервер требует себе другую кодировку. А вообще маловато данных, для того чтобы что-то советовать.
-------------------- 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. |
|||
|
||||
| JlOKu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 30.4.2006 Репутация: нет Всего: нет |
Всем спасибо за помощ , сдал все лабы удачно
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
in.read() вроде как ждет до опупения, т.е. пока данные не придут мы имеет блокировку, которую ничем нельзя убрать. Но это имхо, не проблема, т.к. на каждого подключенного клиента можно просто создать отдельный Thread, который только его слушать будет. Или можно как-то иначе? |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
У меня проблема в том, что когда стартует на каждого клиента по отдельному Thread на сервере для чтения, то чтение идет нормально.
Но как только я запускаю еще один Thread на сервере, который каждую секунду перебирает сокеты клиентов и шлет на них определенную информацию, то Thread в которых должно происходить считывание с клиентов - вообще ничего не читает с них. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 2 Всего: 159 |
вот мое скромное мнение по поводу чатов:
Создавать отдельные потоки и слушать сокеты - много лишней работы. Чтобы упростить данный процесс, можно использовать технологию Java RMI. Клиент и серевер в данном случае будут предоставлять удаленные объект друг другу. Сервер предоставит объект регистрации и входа в систему и объекты для отправки сообщений. Клиент - предоставит объект, методы которого сможет вызывать сервер, например для отправки сообщений клиенту. Общая схема такая: Сервер создает один общий для всех клиентов объект, предоставляющий услугу регистрации (входа в систему) клиенту. Все клиенты вызывают методы данного удаленного объекта, чтобы попасть в чат. Например, данный объект будет иметь метод login(String name, char [] password, MyCallbackObject clientCallback), а возвращать (в случае успешного входа) будет объект с методами sendMessage(String message). Клиент будет вызывать данный метод когда захочет отправить сообщение. Сервер создает пул объектов обратной связи с клиентами. В данный пул помещается информация о клиенте и MyCallbackObject clientCallback клиента. Как только серверу станет необходимо отправить некоторое сообщение клиенту, он выберет из пула объект clientCallback нужного ему клиента и вызовет его метод (например) sendMessage(String message). Так клиент получит свое сообщение. Плюсами данного подхода является отсутствие постоянного цикла прослушивания сокетов. Если говорить точнее, то это цикл будет скрыт от нас высокоуровневыми механизмами RMI. Извиняюсь, если сумбурно изложено. Желательно, сначало ознакомится с RMI, тогда картина сильно проясниться. Впрочем это лишь мои вольные мысли. |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Там есть несколько вариантов, метода read()
Без кода, сложно что-то сказать.
Можно, но тут есть некоторые проблемы: 1. Оптимизировать сервер по производительности будет проблематично (а RMI все таки довольно прожорливая до ресурсов технология) 2. Клиенты могут быть только на Java
Что-то я не понял, что он будет возвращать, что за объект? P.S. По теме рекомендую почитать: Instant Messaging in Java: The Jabber Protocols. У меня вроде где-то валялась в электронном виде. -------------------- 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. |
||||
|
|||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 2 Всего: 159 |
Согласен конечно, будут вопросы с производительностью. Тогда можно RMI компоненты заменить на EJB. Принцип один и тот же, но последний работает на сервере, который решает вопросы масштабируемости и производительности. Ну тогда CORBA ждет... Клиент подсоединяется к серверу, предает ему имя пользователя и пароль, на что сервер выполняет проверку клиента и в случае успеха создаёт у себя новый RMI объект, реализующий методы отправки сообщений, и возвращает ссылку на него клиенту. Клиент получает данную ссылку (объект реально находится на стороне сервера) и использует её (вызывает методы) для отправки сообщений. Получается что-то вроде RMI CallBack-а, но не он. Так для каждого клиента будет свой RMI объект работающий на сервере, методы которых будут использованны для отправки сообщений. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Тогда он должен зарегистрировать этот объект в RMI-registry под новым именем и отправить это имя клиенту, и тот тогда сможет сделать lookup. Но на самом деле это плохо, т.к. имена всех зарегистрированных в RMI-registry объектов можно узнать, и можно тогда писать от имени любого клиента. -------------------- 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. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 2 Всего: 159 |
Нет, этого не нужно делать. Достаточно вернуть ссылку на объект, который унаследован от UnicastRemoteObject. Это сообщение отредактировал(а) MoonCat - 2.7.2006, 20:43 |
|||
|
||||
| 02077461 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
||||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Так проще. Тред обслуживает только один сокет, т.е. читает данные до опупения. Если будешь работать с одним тредом, то будет проблема в том, что например не все данные от клиента пришли. Значит надо или ждать пока дойдут оствашиеся, что неприемлимо поскольку остальные клиенты будут ждать, и вообще не факт что данные дойдут вообще. Или создавать временный буфер куда класть данные полученные частично, но тут свои заморочки. -------------------- 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. |
|||
|
||||
| 02077461 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Спасибо, понял, когда писал для себя примерчик. Действительно так проще, и полностью покрывает потребности небольшой сети.
|
|||
|
||||
| FreakOnALeash |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 11.12.2007 Репутация: нет Всего: нет |
Добрый день, начал писать чат и столкнулся с такой проблемой - клиент подключается к серверу, сервер принимает сообщение и отправляет его обратно клиенту, НО , при подключении еще одного клиента сервер посылает ему только его сообщения, ВОПРОС: как сделать так, чтоб сервер посылал сообщение всем подключенным к нему клиентам? заранее спасибо и если можно, поделитесь примером
Это сообщение отредактировал(а) FreakOnALeash - 9.4.2008, 10:59 |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 1 Всего: 18 |
ОТВЕТ: сервер должен хранить список подключённых клиентов и рассылать сообщения по этому списку.
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| FreakOnALeash |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 11.12.2007 Репутация: нет Всего: нет |
Вопрос: а где можно взять информацию у сервера о том, какой именно клиент подключен и как отослать сообщение определенному клиенту?
Если можно пример |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 1 Всего: 18 |
Обычно в момент подключения клиента к серверу и надо сохранять информацию о клиенте.
Какие технологии для коммуникации клиента и сервера вы используете? Plain socket, RMI, CORBA? Это сообщение отредактировал(а) AlexeyVorotnikov - 10.4.2008, 09:50 -------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| FreakOnALeash |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 11.12.2007 Репутация: нет Всего: нет |
использую сокеты,сервер уже отправляет сообщение всем клиентам, НО доходят они к ним только тогда, когда клиенты послали сообщение на сервер, вопрос возник в следующем - как сделать так, чтоб клиенты могли прослушивать сервер и принимали сообщение в момент его отправки
|
|||
|
||||
| FreakOnALeash |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 11.12.2007 Репутация: нет Всего: нет |
Народ, дайте пример чата , если у кого есть
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |