Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1236599989
KillaTank
2009-03-09 14:59
2009.04.26
Поиск по DBF


2-1237123155
бобик
2009-03-15 16:19
2009.04.26
позиция курсора


8-1193418405
Саня
2007-10-26 21:06
2009.04.26
DirectX


4-1207967231
DevilDevil
2008-04-12 06:27
2009.04.26
Ассоциировать HDC со своей областью памяти


2-1236764497
Новичек
2009-03-11 12:41
2009.04.26
Программное изменение владельца файла.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский