2010-07-01 6 views
6

Изучая технологии Java-сервера, пытаясь прояснить некоторые вещи. Существует несколько технологий, позволяющих приложениям Java взаимодействовать друг с другом.Как сервер может передавать данные клиенту?

1) Веб-сервисы (REST/SOAP) через HTTP

2) Простой POST/GET с использованием URLConnection через HTTP.

3) Розетки

4) RMI = Sockets + сериализации объектов + Некоторые утилиты

5) Различные медиа-сервера, как red5 = RTMP или RTMPT

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

Так что мне интересно, как работают сетевые игры? Возможно ли открывать соединение и обмениваться данными между сервером и клиентом на все время, не вытягивая запрос от клиента каждые 1-2 секунды, а сервер не будет знать IP-адрес клиента. Я не говорю о кометах и ​​других хаках.

Спасибо

ответ

6

Большинство двухсторонняя, настойчивые приложений открыть сетевой порт и держать его открытым. Сервер прослушивается на хорошо известном порту, и когда клиент подключается к этому порту, он получает постоянное TCP-соединение с сервером. Подобным соединением является в основном двунаправленная «труба», данные могут периодически поступать в обоих направлениях одновременно. Пока этот канал открыт, сервер прослушивает сообщения от клиента, а клиент слушает сообщения с сервера.

Общие API-интерфейсы ввода-вывода, используемые для TCP-протоколов, позволяют «разбудить» конец соединения: асинхронный запрос ввода-вывода выполняет зарегистрированную функцию обратного вызова из потока, управляемого операционной системой или библиотекой ввода-вывода или клиент/сервер связывает собственный поток с «блокирующим» вызовом, который возвращается, когда доступны данные. Никакая попытка опроса или повторного подключения не требуется с этой моделью, клиент и сервер «знают», когда доступны данные, и могут действовать немедленно.

+2

Также сетевые игры в реальном времени часто на самом деле «обманывают». Каждый клиент обновляет мир локально в реальном времени и выполняет некоторые трюки для повторной синхронизации общей имитации, когда приходит новое обновление с сервера. Когда вы стреляете в своего врага, возможно, он уклонится от вашего выстрела, получая только небольшой урон, а может и нет. Разумеется, именно сервер будет решать в зависимости от того, будет ли команда dodge от этого клиента прибыть до или после выстрела ... но атакующий игрок, вероятно, не заметит возможного несоответствия между показанной 3D-анимацией и количеством энергии бары вычитаются. – 6502

Смежные вопросы