java服务器中的模态风格编程

nukf8bse  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(197)

对于我的游戏,我在两个服务器上运行它(一个用于游戏,一个用于登录系统)。它们都需要彼此交互,有时还需要询问其他服务器中其他服务器的状态。
对于本例,游戏服务器将询问登录服务器是否有玩家尝试登录:

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

很明显,我会使用int来返回布尔以外的信息。
我的问题是,如何让这种模态风格的编程工作?它的工作原理与jfilechooser的getopendialog()函数类似。
另外,我应该提到多个线程可以同时调用这个方法。

busg9geu

busg9geu1#

如果在一个线程上使用这样的东西,该线程应该在它之后处理其他请求,那么如果游戏和登录服务器之间的延迟很高,那么它会在阻塞返回值时挂起所有这些请求。当然,您需要的是回调,这样您的线程就可以在等待响应时处理其他请求。
我认为没有理由在收到值之前停止线程的执行。如果您需要操作后的值,那么只需在回调中复制您希望成为“模态”的调用后的所有代码。如果您希望在等待响应的同时发送多个请求,那么从请求方发送一个唯一的“responseid”,响应方可以将其包含在响应中。使用“responseid”作为值为runnables的Map的键。当收到响应时,使用responseid键调用map上的remove,并对返回的runnable值调用run()。mina应该是异步的,不应该阻塞响应包。
如果您有一个很好的理由来解释为什么要在同一个线程上处理它,那么您可以查看java.util.concurrent包。我将使用count 1的countdownlatch实现它,在发送请求消息后调用await(),在收到mina的响应时调用countdown()。必须使用atomicreference或长度为1的数组来保存在响应中收到的值,以便读回等待的线程。
你还在写故事吗?

pcrecxhr

pcrecxhr2#

快速回答-您需要将两个服务器上的方法都公开为支持rmi的方法,并且只需像您描述的那样调用方法。
您可能会发现查看oracle rmi官方教程很有用:http://docs.oracle.com/javase/tutorial/rmi/index.html
虽然你的设计可能是错误的-这是你的设计,为什么不让你开枪打死你的头?;)
另外,值得一看spring security:http://static.springsource.org/spring-security/site/

bpsygsoo

bpsygsoo3#

我假设你所说的模态,是指试图阻止除一个动作之外的所有动作。我强烈怀疑这种风格会给你带来麻烦。模态交互是锁定的一种形式,因此对挂断和断开等不太宽容。为了使其具有可容忍性,当有人进入某个模式,然后什么也没有发生时,需要超时和清除代码(i、 e他们关闭了笔记本电脑,或游戏崩溃,他们拔掉了网络电缆等)。
如果我是你,我会试着从身份验证和授权的Angular 来考虑问题。

相关问题