| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Работа с сетью > Заставить несколько клиентов увидеть друг друга |
| Автор: webrider 24.12.2010, 19:54 | ||||||||
| Здравствуйте, мне снова нужна ваша помощь... Нужно увидеть всех клиентов в сети и построить их список, чтобы потом можно было подключиться к выбранному посредством отправки запроса и его подтверждению на противоположном сокете. Всё это должно быть одном приложении, т.е. клиенты равнозначны, они должны увидеть друг друга. Итак, как я понял, для этого нужно использовать многопоточность. Как я это вижу: 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] ... А у мну ошибка
|
| Автор: COVD 25.12.2010, 03:08 |
| http://www.jgroups.org/ |
| Автор: webrider 25.12.2010, 13:19 |
| COVD, спасибо за ссылку, но это нужно реализовать на сокетах... Беда ещё в том, что это трудно проверить на локалхосте, а в локалке проверить не могу (роутер сдох:() Как я понимаю, каждое новое приложение, после коннекта со всеми предыдущими должно создать сервер сокет для того, чтобы к нему могли подключиться последующие. Т.е. у первого приложения только серверные сокеты, у второго - 1 клиентский с первым, остальные серверные... у последнего все клиентские, 1 серверный... Но при попытке создания второго приложения, возникает ожидаемая ошибка, т.к. они дерутся за 1 порт (на локалхосте, я имею ввиду)... Поправьте, пожалуйста, где я не прав и скажите, можно ли всю эту схему осуществить на одном компе? |
| Автор: COVD 25.12.2010, 18:06 |
| Еще более простой пример http://www.hazelcast.com/. Это пример распределенной памяти, т.е. еще более высокий уровень абстракции и скорее всего это и есть конечная цель ваших усилий. Если же хотите делать сами с нуля, то для поиска компьютеров в сети используют сокеты UDP, мультикастинг. Сначала запускается серверный сокет на любом свободном порту. Делается так - если порт занят и получено java.net.BindException, то номер порта увеличивается на 1 и попытка повторяется. Потом приложение рассылает по всем адресам сети номер порта своего серверного сокета. Другие, ранее запущенные приложения, в ответе сообщают свои серверные порты. Поскольку для открытия серверного сокета используется любой свободный порт, то все приложения группы могут быть запущены на одном компьютере. У всех будет один адрес, но разные номера серверных портов. Все же рекомендую посмотреть JGroup. Это opensource, там код доступен. |
| Автор: webrider 28.12.2010, 20:25 |
| Проблемы решил. Запускаясь, приложение открывает серверный сокет в потоке, и начинает сканировать сеть (определяя её по своему ip), в диапазоне от 0 до 255, с найденными в отдельном потоке открывает соединение. формируется список ip'шников. После ввода нужного ip (аля выбор игрока), ему посылается команда и если на неё ответили, начинается партия (морской бой). Остался вопросик... Сеть сканируется очень медленно, можно ли установить время в течении которого приложение пытается подсоединиться, ну например, 1 секунда на 1 адрес? SetTimeout вроде делает не то... |
| Автор: webrider 30.12.2010, 13:02 |
| Проблему решил, сделав попытку подключения в отдельном потоке. Проблемы решены, дальше только нужно сделать всё красиво. Тему крою. Всех с Наступающим! |