编辑:更清楚地说,我基本上需要区分在服务器远程对象注册表中存储的对象中执行远程方法调用的不同客户端。我怎样才能做到这一点?
情况如下:
我目前正在创建一个客户端/服务器命令行界面应用程序,使用Java rmi 在客户端和服务器之间交换数据(存储在字符串中)。
我遇到问题,而我必须允许客户端使用用户/密码发送身份验证命令。此身份验证命令(例如:>user myUserName myPassword)必须通过用于发送服务器必须应答的所有其他命令的相同远程调用方法来发送。
我的问题:客户端必须严格只发送他的命令并显示从服务器收到的命令的文本结果。尽管客户端很简单,但它没有状态。
由于某些方法要求客户端登录,或者如果客户端登录或未登录,则有不同的服务器端实现,所以我需要跟踪服务器上的客户端登录状态(不是问题,我计划简单地在用户数据库中为每个用户保留时间戳并使用超时),并且还必须区分不同的客户端。
现在,我想我对远程对象的工作原理有了很好的了解,并且我已经能够在服务器端注册远程对象并使用客户端从中访问远程方法。
所以,我需要做更多,我不仅必须让客户端能够访问远程方法,我还需要远程方法(以及运行它们的服务器)来知道哪个网络客户端正在调用该方法(无需传递客户端用户名/传递作为远程方法中的参数)。
我认为必须习惯性地使用 rmiclientsocketfactory 和 rmiserversocketfactory 来执行此操作,但我不知道如何继续。
感谢大家抽出宝贵的时间。
最佳答案
对象不存储在注册表中。 stub 存储在注册表中。远程对象位于服务器主机中。
参见java.rmi.server.RemoteServer.getClientHost()
。
套接字工厂与此无关。
关于Java rmi,区分多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560511/