如何从服务器调用客户端上的方法?

Posted

技术标签:

【中文标题】如何从服务器调用客户端上的方法?【英文标题】:How to invoke method on the client from the server? 【发布时间】:2011-12-31 01:38:05 【问题描述】:

我正在开发一款同时使用套接字和 RMI 的游戏。现在套接字部分完成了,我正在启动 RMI 部分。我希望能够邀请某人玩(A->B)并获得响应(B->A)。

你能帮帮我吗?

提前致谢。干杯

编辑:我一直在研究,目前也将客户端实现为远程对象(定义接口并实现它)。我认为这称为回调。我走对了吗?

我在想的是 A 在 B 的计算机上调用远程对象上的方法。 B 上的服务器询问客户端(它也是同一台计算机中的服务器)是否想与 A 一起玩得到响应并将其返回给 A。就像我说的那样,我刚刚用 tcp 和 udp 套接字完成了这个游戏,现在我必须对 RMI 做同样的事情。两个客户端无法像通过 TCP 连接那样使用 RMI 直接通信,是吗?

【问题讨论】:

RMI 教程 - docs.oracle.com/javase/tutorial/rmi/index.html 我已经读过该教程很多次了。问题是它只告诉您如何调用远程对象上的方法并获得它返回的结果(如果有的话)。我希望能够在该对象上调用一个方法,并让它在用作服务器的同一台计算机上调用另一个方法。所以 A(Client)->B(Server 获取邀请请求)->B(Client 被提示并回复)->B(Server 接收响应并将其发送回 A)->A(Client) 我相信您需要先将 A 上的对象注册为服务器,然后再将其作为参数发送。它确实要求“客户端”可以侦听和接受连接。 (免责声明:我并没有真正使用 RMI。) @TomHawtin-tackline 我认为你是对的。除了在服务器上注册客户端从而实现“回调系统”之外,我没有看到任何其他解决方案。谢谢 【参考方案1】:

我一直在研究,目前也将客户端实现为远程对象(定义接口并实现它)。我认为这称为回调。我走对了吗?

RMI 通常实现为客户端和服务器。客户端在服务器上进行调用,服务器返回一个可以在客户端使用的对象。阅读 cmets 后,根据您描述问题的方式,它们是正确的,您需要使客户端也成为 RMI 服务器。但是,我不认为这是必要的。

例如,假设您有 2 个客户都在尝试玩游戏。协议可能如下所示:

    A 联系服务器 S。服务器存储地址 A,然后向 A 返回一条等待其他玩家类型的消息。 A 然后每隔几秒联系 S 以查看其他玩家是否出现。 B 然后联系 S 并在 A 和 B 之间开始游戏。S 向 B 返回一条开始游戏消息。S 将某种游戏对象存储在其内存(和/或磁盘上)中,用于跟踪游戏的进度游戏。 下次 A 联系服务器时,它还会收到一条开始游戏消息。

因此,服务器不需要联系 A 或 B,而是经常轮询以获取游戏更新等。

对 S 的方法调用也可以等待另一个玩家,直到有一个玩家才返回。我认为轮询选项更好,因为这样 S 知道 A 是否停止调用,A 不必担心 S 崩溃和挂起。

希望这会有所帮助。

【讨论】:

感谢您的意见。它现在正在工作,并且没有使用任何回调。 我不能投票。它说它需要15声望。另外我不知道如何关闭这个帖子你能帮我吗?

以上是关于如何从服务器调用客户端上的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从工作线程中调用 UI 线程上的方法? [复制]

远程客户端上的调用方法

如何从托管在另一台服务器上的 Web 应用程序调用客户端计算机托管的 Wcf 服务?

如何从 Meteor 中的服务器调用客户端方法?

从远程独立客户端调用 EJB

从单个服务多次调用多个微服务的最佳方法或设计模式是啥?