![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| webrider |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.8.2010 Репутация: нет Всего: нет |
Здравствуйте, мне снова нужна ваша помощь...
Нужно увидеть всех клиентов в сети и построить их список, чтобы потом можно было подключиться к выбранному посредством отправки запроса и его подтверждению на противоположном сокете. Всё это должно быть одном приложении, т.е. клиенты равнозначны, они должны увидеть друг друга. Итак, как я понял, для этого нужно использовать многопоточность. Как я это вижу: 1) Приложение пытается подключиться (пока на локалхосте) к порту 2012. 2) Если не получается, то создаётся сервер, который слушает подключения. 3) Если получается, то вынести подключение в отдельный поток (с одной стороны создаётся клиентский поток, с другой - серверный). Но я не совсем улавливаю логику, вот мои коды: Потоки практически одинаковые, можно смотреть один)
Прошу помощи, хотя бы советом, как это должно быть... По-идее, в консоли должен построиться список вида: Echoing: Socket[addr=localhost/127.0.0.1,port=2012,localport=64749] Echoing: Socket[addr=localhost/127.0.0.1,port=2012,localport=64750] ... А у мну ошибка
Это сообщение отредактировал(а) webrider - 24.12.2010, 20:14 |
||||||||
|
|||||||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
||||
|
||||
| webrider |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.8.2010 Репутация: нет Всего: нет |
COVD, спасибо за ссылку, но это нужно реализовать на сокетах...
Беда ещё в том, что это трудно проверить на локалхосте, а в локалке проверить не могу (роутер сдох:() Как я понимаю, каждое новое приложение, после коннекта со всеми предыдущими должно создать сервер сокет для того, чтобы к нему могли подключиться последующие. Т.е. у первого приложения только серверные сокеты, у второго - 1 клиентский с первым, остальные серверные... у последнего все клиентские, 1 серверный... Но при попытке создания второго приложения, возникает ожидаемая ошибка, т.к. они дерутся за 1 порт (на локалхосте, я имею ввиду)... Поправьте, пожалуйста, где я не прав и скажите, можно ли всю эту схему осуществить на одном компе? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Еще более простой пример Hazelcast. Это пример распределенной памяти, т.е. еще более высокий уровень абстракции и скорее всего это и есть конечная цель ваших усилий.
Если же хотите делать сами с нуля, то для поиска компьютеров в сети используют сокеты UDP, мультикастинг. Сначала запускается серверный сокет на любом свободном порту. Делается так - если порт занят и получено java.net.BindException, то номер порта увеличивается на 1 и попытка повторяется. Потом приложение рассылает по всем адресам сети номер порта своего серверного сокета. Другие, ранее запущенные приложения, в ответе сообщают свои серверные порты. Поскольку для открытия серверного сокета используется любой свободный порт, то все приложения группы могут быть запущены на одном компьютере. У всех будет один адрес, но разные номера серверных портов. Все же рекомендую посмотреть JGroup. Это opensource, там код доступен. Это сообщение отредактировал(а) COVD - 25.12.2010, 18:26 |
|||
|
||||
| webrider |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.8.2010 Репутация: нет Всего: нет |
Проблемы решил.
Запускаясь, приложение открывает серверный сокет в потоке, и начинает сканировать сеть (определяя её по своему ip), в диапазоне от 0 до 255, с найденными в отдельном потоке открывает соединение. формируется список ip'шников. После ввода нужного ip (аля выбор игрока), ему посылается команда и если на неё ответили, начинается партия (морской бой). Остался вопросик... Сеть сканируется очень медленно, можно ли установить время в течении которого приложение пытается подсоединиться, ну например, 1 секунда на 1 адрес? SetTimeout вроде делает не то... |
|||
|
||||
| webrider |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.8.2010 Репутация: нет Всего: нет |
Проблему решил, сделав попытку подключения в отдельном потоке.
Проблемы решены, дальше только нужно сделать всё красиво. Тему крою. Всех с Наступающим! |
|||
|
||||
![]()
|
| Правила форума "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. |