Java 试图找出如何制作一个简单的网络游戏需要一些帮助

Java 试图找出如何制作一个简单的网络游戏需要一些帮助,java,tcp,Java,Tcp,我正在写一个简单的读卡游戏。 这个想法是服务器将从游戏板位置1开始。然后,它将等待,直到它从所有玩家那里收到HTTP消息或超时。该回复将用于提供当前董事会职位的信息。因此,如果一个客户端最终发送了两条消息,它将得到两条具有相同游戏id的回复 每次它从客户端获得连接时,都会发送一个线程来处理消息,并等待下一次连接 问题:消息是在蛇线程上处理的。如果所有玩家都回复了消息。告诉主线程转到下一个板位置的最佳方式是什么??也许我只需要把它做成单线程?但是我担心一个bug会冻结服务器 然后是超时的问题 我的

我正在写一个简单的读卡游戏。 这个想法是服务器将从游戏板位置1开始。然后,它将等待,直到它从所有玩家那里收到HTTP消息或超时。该回复将用于提供当前董事会职位的信息。因此,如果一个客户端最终发送了两条消息,它将得到两条具有相同游戏id的回复

每次它从客户端获得连接时,都会发送一个线程来处理消息,并等待下一次连接

问题:消息是在蛇线程上处理的。如果所有玩家都回复了消息。告诉主线程转到下一个板位置的最佳方式是什么??也许我只需要把它做成单线程?但是我担心一个bug会冻结服务器

然后是超时的问题

我的一个想法是在套接字上设置一个超时,这样,如果没有建立连接,它将始终退出,然后可以检查超时或是否所有玩家都发送了消息

这是我第一次尝试网络游戏,我想有很多方法可以做到这一点


Ted

这里有一些代码可能会有所帮助

// 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 ...
您可能应该使用
Executors.newCachedThreadPool()
或另一个线程池为每个客户端连接派生一个处理程序


希望这能有所帮助。

我要做的是有一个主
服务器
类,每个客户端都有一个线程。线程被添加到代表每个客户端的
线程的
数组列表中

然后,您可以让
服务器
类在列表上迭代并检查值,例如
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;
}
服务器中的某个位置 ArrayList clients=新的ArrayList(); public void addClient(){ 添加(新ClientThread()); } 公共布尔值checkFormMessages(){ 用于(线程t:客户端) 如果(!t.hasMessage) 返回false; 返回true; }

ClientThread
类处理与每个客户机的对话,每个客户机都有自己的线程。

听说过信号量吗?如果您没有,在您知道多线程是什么以及如何使用它之前,我不会进一步研究多线程。
消息是在蛇线程上处理的。
问题是您使用的是蛇线程,这在调用pro/时是非常危险的。如果没有正式的培训,我会坚持使用.NET王国中的线程您好,谢谢您的帮助,我听说其他人使用数组将每个客户端对象存储在其他留言板中。
//...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;
}