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