0

对于我的游戏,我让它在两台服务器上运行(一台用于游戏,一台用于登录系统)。他们都需要相互交互,有时还需要询问有关另一台服务器中其他东西的状态的问题。

在本例中,游戏服务器将询问登录服务器是否有玩家尝试登录:

public boolean isLoggingIn(int accountId) {
//Form a packet to send.
int retVal = sendData();
return retVal > 0;
}

显然我会使用一个 int 所以可以返回布尔值以外的信息。

我的问题是,我如何让这种模态风格的编程工作?它就像 JFileChooser 的 getOpenDialog() 函数一样工作。

另外,我应该提一下,不止一个线程可以同时调用这个方法。

4

3 回答 3

2

我假设模态,你的意思是试图阻止除一个之外的所有动作。我强烈怀疑这种风格会给你带来麻烦。模态交互是一种锁定形式,因此对挂断和断开连接等不太容忍。为了使其具有容错性,您需要超时和清理代码,以应对有人进入模式但没有进一步发生的情况。(即他们关闭了笔记本电脑,或者游戏崩溃了,他们拔掉了网线等)。

如果我是你,我会尝试从身份验证和授权方面考虑问题。

于 2012-08-24T19:41:56.850 回答
0

如果你在一个应该在它之后处理其他请求的线程上使用这样的东西,如果游戏和登录服务器之间的延迟很高,它会在阻塞返回值时挂起所有这些请求。当然,您想要的是一个回调,以便您的线程可以在等待响应时处理其他请求。

在收到值之前,我认为没有理由停止线程的执行。如果您需要它之后的操作的值,那么只需复制您希望在回调中成为“模态”的调用之后的所有代码。如果您希望在等待响应的同时发送多个请求,请从请求方发送一个唯一的“responseId”,响应方可以将其包含在其响应中。使用“responseId”作为以 Runnables 作为值的 Map 的键。当您收到响应时,使用 responseId 键在 Map 上调用 remove 并在返回的 Runnable 值上调用 run()。MINA 应该是异步的,不应该阻塞响应数据包。

如果你有充分的理由想在同一个线程上处理这一切,你可以查看 java.util.concurrent 包。我将使用计数为 1 的 CountDownLatch 来实现它,在发送请求消息后调用 await(),并在收到 MINA 的响应时调用 countDown()。您必须使用 AtomicReference 或长度为 1 的数组来保存您在响应中收到的值,您可以将其读回等待线程。

PS,你还在做冒险岛的工作吗?

于 2012-08-24T20:15:45.023 回答
0

快速回答 - 您需要将两台服务器上的方法公开为支持 RMI,并简单地调用您描述的方法。

您可能会发现查看官方 Oracle RMI 教程很有用:http: //docs.oracle.com/javase/tutorial/rmi/index.html

尽管你的设计可能是错误的——这是你的设计,为什么不让你开枪呢?;)

此外,值得一看 Spring Security:http ://static.springsource.org/spring-security/site/

于 2012-08-24T20:20:00.643 回答