Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Проэктирование сервера для обмена пакетами двух пользователей   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
11-1200031270
armor85
2008-01-11 09:01
2009.04.26
Использование обычного компонента


2-1236523735
Руслан
2009-03-08 17:48
2009.04.26
Работа с DBF


3-1219996681
KirillRepin
2008-08-29 11:58
2009.04.26
сортировка в DBGrid по клику на названии колонки


15-1235242573
Kerk
2009-02-21 21:56
2009.04.26
Задачка про поезд


3-1219951541
Евгений Р.
2008-08-28 23:25
2009.04.26
Изменение текущего значения генератора