Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Коммуникация Клиент-Клиент, Клиент-Сервер (http://forum.oszone.net/showthread.php?t=209225)

pivster 17-06-2011 13:58 1696335

Коммуникация Клиент-Клиент, Клиент-Сервер
 
Привет всем, для начала хочю сказать всем спасибо, кто поддерживает данный проэкт.

А теперь о моей проблеме.

По проэкту в университете моей группе (6 человек) было поставлено следующее задание.
Мы должны создать игру в шашки, у нас должен быть клиент, в котором можна играть и отсилать сообщения с помощью общего чата.
Есть также сервер который должен сохранять информацию по поводу игроков, которые зарегестрированы, какие игры в шашки они выиграли, проиграли и т.д., в общем итоге ведение простой статистики.
Игроки же играют не локально друг с другом, а через интернет.

Вопрос который у меня возникает, это как осуществить коммуникацию в общем в проэкте.

Ах да забыл сказать, что на одном клиенте можна играть максимум 5 игр одновременно, причём для каждой игры открыт новый Таб, но это не важно. Важен сам факт что я вижу две возможности коммуникации через сокеты:
1) Для отправки сообщений в чат, исползуеться коммуникация Клиент <-> Сервер <-> Клиенты, которые находяться в онлайне(тоесть броудкаст)
Для отправки актуальной доски (тоесть позиций фишек, после того как человек сделал свой ход) используеться коммуникация Клиент(я) <-> Сервер <-> Клиент (противник).
Для сохранения статистики победивший, отсылает информацию на Сервер, которую сервер сохраняет в БД.

2) Для отправки сообщений в чат, исползуеться коммуникация Клиент <-> Сервер <-> Клиенты, которые находяться в онлайне(тоесть броудкаст)
Для отправки актуальной доски (тоесть позиций фишек, после того как человек сделал свой ход) используеться коммуникация Клиент(я) <-> Клиент (противник).
Для сохранения статистики победивший, отсылает информацию на Сервер, которую сервер сохраняет в БД.


Так как я пока что не очень разбираюсь в программировании сокетов, у меня такой будет вопрос, какой из вариантов лучше для коммуникации ?
Если брать второй вариант, нужны ли для коммуникации многие порты, в данном случае 5, так как можно вести 5 игр одновременно, или всё можно делать через один порт ?

Надеюсь я компакто и понятно обьеснил свою проблему, и надеюсь на ваши ответы и помощь.

П.С. я не нуждаюсь в чистом соурс коде, мне просто нужна помощь в понятии самого процесса этой коммуникации.

Заранее спасибо.

lxa85 17-06-2011 14:06 1696348

Цитата:

Цитата pivster
П.С. я не нуждаюсь в чистом соурс коде, мне просто нужна помощь в понятии самого процесса этой коммуникации. »

http://download.oracle.com/javase/tu...rking/sockets/
Как отладишь механизм передачи сообщений, все остальное станет делом техники и аккуратного программирования.

pivster 17-06-2011 14:35 1696378

Спасибо огромное за ответ, я обязательно ещё раз пройдусь по этому туториалу.

Если не сложно, скажи, с твоей точки зрения, какая из архитектур лучше ?

lxa85 17-06-2011 14:54 1696397

pivster, я честно сказать не понял, в чем у них принципиальная разница. По реализации и то и то возможно. Самое критичное, что я могу предположить - нехватка времени в конце партии. Соотв. лучше отдать приоритет игре, и свести общение клиентов только с теми кто играет в первую очередь и с наблюдающими во вторую. Чат - ну так, некритичное баловство.

pivster 17-06-2011 15:04 1696406

Принципиальной разницы как таковой в принципе и нету. Просто мне кажеться чтобы разгрузить сервер, лучше делать отправку ходов между клиентами, а не через сервер, что уменьшит загружаемось сервера.
Давай я попробую описать своё понимание коммуникации между клиентами, возможно у меня просто напросто проблема в мишлении.

И так, состояние доски передаёться только между клиентами которые друг с другом играют.
5 открытых игр.

У каждого клиента значит должен быть лисенер на порт. Вопрос, чтобы вести 5 игр, или ожидать подключение от 5 клиентов, надо 5 паралельных лисенеров на разных портах ? или же соединения с 5 клиентами будет проходить через один порт, и каждому клиенту надо только один лисенер ?

лисенер в смысле ожидания подключения естественно.

Ах да по поводу чата, это не некритичное баловство, чат должен быть, такое задание проэкта. Наблюдателей у партии небудет, только два игрока. Остальные же знают только, что некий игрок ведёт некоторое количество партий, с кем именно, знать им не обязательно.

lxa85 17-06-2011 15:34 1696422

Цитата:

Цитата pivster
Ах да по поводу чата, это не некритичное баловство, чат должен быть, такое задание проэкта. »

Я несколько в другом смысле :) Ко времени - это не критичное баловство. Т.е. исход игры не зависит от того, прочтет ли игрок сообщение сейчас или секунду, две после. А вот партия - зависит. Т.к. в конце партий (5 минутка допустим) время будет пиковой характеристикой.
Цитата:

Цитата pivster
У каждого клиента значит должен быть лисенер на порт. Вопрос, чтобы вести 5 игр, или ожидать подключение от 5 клиентов, надо 5 паралельных лисенеров на разных портах ? или же соединения с 5 клиентами будет проходить через один порт, и каждому клиенту надо только один лисенер ? »

Опять таки это реализуемо и так и так. Можно в дальнейшем 5 различных портов адресовать 5 различным потокам программы, но это в большей степени будет относится к игре с искусственным интеллектом.
Передачу доски - можно свести к оправке 64х байт с избытком, т.е. не такое уж и большое сообщение, чтобы "забивать" канал связи. Соотв. не столь сложный алгоритм синтеза и разбора сообщения. Можно конечно поиграть со скоростями синтеза/разбора на синтетических тестах, и выбрать оптимальный. Это добавить работе плюсов.

pivster 17-06-2011 15:51 1696444

По поводу передачи самой доски:
мы собираемся только передавать 3 ключа длиной в 32 знака.
Тоесть:

Black = {0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
White = {0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}
King = {0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}

Первые два ключа это позиция фишек на доске, третий ключ, если сопоставить один из первых двух с третим, определяет где стоит дамка. Простая логика, так сказать.

Для начала я думаю, создам сегодня тестовые клиенты, чтобы увидеть просто как в действительности работать с сокетами при подключении клиент <-> клиенты. Практика всё таки я думаю сможет помочь продвинуться в этом направление ;)


Время: 15:13.

Время: 15:13.
© OSzone.net 2001-