Попытка выяснить, как сделать простую сетевую игру Нужна помощь - PullRequest
0 голосов
/ 07 декабря 2011

Я пишу простую игру для чтения карт.Идея состоит в том, что сервер будет запускаться в позиции 1 игровой доски. Затем он будет ждать, пока не получит HTTP-сообщение от всех игроков или тайм-аут.Ответ будет для информации о текущей позиции Совета.Таким образом, если клиент в конечном итоге отправит 2 сообщения, он получит два ответа с одним и тем же идентификатором скучной игры.

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

ПРОБЛЕМА: сообщения обрабатываются в потоке змея.Если все игроки ответили сообщением.Что было бы лучшим способом сказать основной теме, чтобы перейти к следующей позиции платы ??Может быть, мне просто нужно сделать это одной нитью?Но тогда я боюсь, что ошибка может заморозить сервер.

Тогда возникает проблема времени ожидания.

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

Это моя первая попытка сетевой игры, я предполагаю, что есть много способов сделать это.

Тед

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

То, что я делаю, - это основной класс Server с потоком для каждого клиента.Поток добавляется к ArrayList из Threads, представляющему каждого клиента.

Затем вы можете сделать так, чтобы класс Server перебрал список и проверил значение, например hasMessage.Если каждый из них верен, продолжайте игру.

Вот небольшой код, который делает это:

//...Somewhere in the Server
ArrayList<Thread> clients = new ArrayList<Thread>();

public void addClient() {
  clients.add(new ClientThread());
}

public boolean checkForMessages() {
  for(Thread t : clients)
    if(!t.hasMessage)
      return false;
  return true;
}

Класс ClientThread обрабатывает общение с каждым клиентом, когда каждый включенсвой собственный поток.

0 голосов
/ 07 декабря 2011

Вот код, который может помочь.

// use an atomic integer so all threads can count their moves
AtomicInteger moveCounter = new AtomicInteger();

// main thread is in a loop
long timeoutMillis = System.currentTimeMillis() + MOVE_TIMEOUT_MILLIS;
while (moveCounter.get() < NUMBER_OF_CLIENTS) {
    synchronized (moveCounter) {
        // wait a second
        moveCounter.wait(timeoutMillis - System.currentTimeMillis());
    }
    if (System.currentTimeMillis() >= timeoutMillis) {
        // we timed out, break
        break;
    }
}
// now go ahead and process the move ...

Каждый обработчик клиента будет делать:

// read the move from the client ...
// store the move somewhere in the server...
moveCounter.decrementAndGet();
// exit

Вы, вероятно, должны использовать Executors.newCachedThreadPool() или другой пул потоков для разветвления обработчика для каждого из ваших клиентских подключений.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...