Форум: "Прочее";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
ВнизПроэктирование сервера для обмена пакетами двух пользователей Найти похожие ветки
← →
alex-drob © (2009-02-22 01:43) [0]Решил сделать онлайн игру морской бой длz сотового. Хотел чтоб один сотовый конектился к другому напрямую, ну получив от сервака IP другого сотового, но проблема в том что на сотовом при попытки создать ServerSocket всё виснет хотя на эмуляторах работает. Вот и решил сделать сервак на Java чтоб через него обменивались пакетами телефоны.
Что получилось:
Мидлет подключается к серву, на серве запускается новый поток для каждого клиента.
Передаю в поток ссылку на объект типа Vector (вообщем типа Tlist в делфи) созданный в основном классе, чтобы был доступ из любого потока.
После подключения проверяется есть ли в Vector запись IP адреса, если нет то записывается и ждёт. Если есть то считывает и удаляет IP с Vector.
Т.е. когда появляются два клиента у серва, то второй знает IP первого.
Имеем (например) :
Сервер с IP 10.10.10.100
Поток А (клиент IP 10.0.0.1)
Поток B (клиент IP 10.0.0.2)
Потоку B известен IP потока A
Как организовать обмен пакетами между клиентами?
В голову пока пришло только Создание ещё одного вектора и в него писать объект с двумя полями писать в него IP получателя и пакет и всеми потоками его постоянно читать. Но это долго будет, я думаю, потому что придётся постоянно перебирать в цикле весь вектор выбирать объекты и сравнивать IP каждого объекта. Для 2х клиентов норм было бы, а если их 100 будет))
← →
Медвежонок Пятачок © (2009-02-22 01:58) [1]сотовые - они все за натом опсоса. если не оплачено за иное.
← →
Медвежонок Пятачок © (2009-02-22 02:04) [2]так что только через BT
← →
alex-drob © (2009-02-22 02:25) [3]через БТ не интересно)) мне интересно сам серв написать, чтоб знать хоть как это делается, вдруг пригодится в жизни)
← →
Медвежонок Пятачок © (2009-02-22 02:28) [4]не выйдет. точнее написать выйдет, а подключиться - фик.
← →
alex-drob © (2009-02-22 02:35) [5]ну подключиться с телефона к другому то и не получаеться, по этому я и пишу серв, к серву конектиться.
Только что ещё идея пришла.
ссылка на потоки хранится в массиве, передаю ссылку на масив в сам поток и потом в потоке ищу в масиве поток с IP нужным и беру ссылку на него, а в потоке сделал публик процедуру посылки данных))
так что с потока А передаю данные клиенту потока Б через функцию потока Б)) не уверен конечно что так норм будет работать но пока другой способ не нашел.
← →
Медвежонок Пятачок © (2009-02-22 02:40) [6]ты не сможешь установить снаружи ни тсп соединение с телепоном, ни удп пакет ему послать.
он за натом провайдера.
вот и все.
← →
alex-drob © (2009-02-22 02:54) [7]та я не устанавливаю снаружи, я же говорю что потому что нельзя по этому и решил сервер сделать.
телефон конектится к компу на котором сервер на java запущен, и второй конектится, и уже через сервер они общаются. Ну как ася или маил агент. все клиенты а сервер комп.
← →
Eraser © (2009-02-22 02:58) [8]> [7] alex-drob © (22.02.09 02:54)
т.е. предполагается, что сервер вообще не будет вмешиваться в потоки данных? тогда подход тот же, что и при простейшем port-mapping"е. несколько строк кода.
← →
alex-drob © (2009-02-22 03:02) [9]
> т.е. предполагается, что сервер вообще не будет вмешиваться
> в потоки данных?
будет, нужно если телефон один подключился ждать второго, потом их соеденить, если еще 3й подключится то ждать 4го.....
← →
Eraser © (2009-02-22 03:06) [10]> [9] alex-drob © (22.02.09 03:02)
тогда не понятно в чем сложности? все вручную делать прийдется. продумать алгоритм взаимодействия и реализовать.
PS идентифицировать клиентов лучше не по IP, а по уникальному ID. IP это уровнем ниже.
← →
alex-drob © (2009-02-22 03:22) [11]по ID это хорошая идея, и поиск быстрей будет и с одного IP могут нсколько клиентов конектится.
> все вручную делать прийдется. продумать алгоритм взаимодействия
> и реализовать.
так вот в продумывании и проблемма, ну ща вроде более менее придумал.
передавать потоку ссылку на другой поток в котором выполнять функцию writeSocket и тогда она уходит как раз тому кто к тому потоку подключен.
а за совет с ID ещё раз спасибо
← →
Медвежонок Пятачок © (2009-02-22 03:37) [12]они все с одного ип придут.
я что дома, что в командировке, через гпрс ип один и тоже.
внешний натовский естественно имеется ввиду.
← →
Медвежонок Пятачок © (2009-02-22 03:37) [13]если оператор конечно один и тот же
← →
alex-drob © (2009-02-22 03:43) [14]Всё переделал чтоб не по IP разделять клиентов, проверил с одного ип всё норм работает.
← →
Сергей М. © (2009-02-22 11:07) [15]
> Всё переделал чтоб не по IP разделять клиентов
Протокол IP уже содержит все необходимое для уникальной идентификации источника и приемника инф.пакета - IP-адрес И номер порта.
Нет никакой необходимости изобретать велосипед с ID.
← →
alex-drob © (2009-02-22 12:16) [16]А я ID и не вводил, есть массив указателей на потоки в которых открыты сокеты с клиентами, для каждого соединения он уникальный.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c