当前位置: 首页 > 知识库问答 >
问题:

Javarmi通过互联网

师成弘
2023-03-14

我正在Java开发一个游戏,使用RMI进行所有网络通信。RMI允许我在服务器上调用方法,但对我来说还不够。我还希望服务器能够在连接的客户端之间传播消息。

我的客户机查找服务器(它的接口扩展为远程)并在其上注册。它允许服务器知道谁已连接。我的客户机还实现了一个扩展远程的接口。这是我的代码的一部分:

接口声明:

public interface IServer extends Remote {
    void connect(IClient Client) throws RemoteException, ExistingItemException;
    //...
}

public interface IClient extends Remote {
    public void notify(Notification Notification) throws RemoteException;
    //...
}

服务器端:

//int RMIPort = 1099, ServerPort = 1100;
IServer Server = new RMIServer();
IServer Proxy = (IServer) UnicastRemoteObject.exportObject(Server, ServerPort);
LocateRegistry.createRegistry(RMIPort).rebind("//" + LocalIP + ":" + 
        RMIPort + "/xxx", Proxy);

客户端:

//Sets the local reference to IServer and creates the IClient
setInstance(new Client(Login, (IServer) LocateRegistry.getRegistry(RemoteIP).
        lookup("//" + RemoteIP + ":" + RMIPort + "/xxx")));
//Gets the IClient and makes it available for the IServer to call notify(...)
Proxy.connect((IClient) (UnicastRemoteObject.exportObject(getInstance(), 0)));

此解决方案适用于本地,但当我尝试通过Internet使用它时则不起作用。

我已经设置了路由器,将我的计算机暴露给一个固定的IP地址,并转发1099和1100端口。这个解决方案允许其他开发人员“查找”我的服务器并获得有效且可用的代理,但是不允许他们导出他们的IClient。JVM似乎试图将对象导出到他们的本地网络,执行在这里停止。

因此,我尝试将 -Djava.rmi.server.hostname=my-external-IP JVM 参数传递给我的服务器,同时传递客户端的本地参数。这样做,exportObject 会将 ConnectException 抛到远程 IP 而不是本地 ip。

共有3个答案

卓雅达
2023-03-14

您可能会考虑使用RMI的替代解决方案,因为我相信它是为Intranet应用程序(即本地网络中的企业应用程序)而不是Internet设计的。

我建议在客户机和服务器之间使用一个长时间运行的TCP连接,这样在任何时候服务器想要进行通信时,它只需要将一条消息推送到这个连接上。

在这种情况下,启动连接将始终是客户端任务。这与邮件客户端连接到imap或pop3服务器的方式非常相似。

冷宏茂
2023-03-14

还有一种选择:

http://dev.root1.de/projects/simon/wiki#Why-SIMON-is-better-than-

该协议与RMI不兼容,但用法几乎相同。从RMI到SIMON的转换通常并不难。我从用户那里听说,切换到SIMON只需30分钟。

柳才良
2023-03-14

没关系。通过 Internet 使用回调需要每个客户端配置其防火墙/NAT 盒/任何内容,以允许入站连接和可能的端口转发。其中许多根本无法配置,其中许多是由网络管理员运行的,他们只是不会这样做。

注意,你也必须在一个固定的端口上输出。

 类似资料:
  • 在此输入图像描述 仅仅询问我们是否可以使用maven命令或其他工具进行部署就只取决于没有互联网的隧道。不管怎么说。穆勒斯福特。com是块。

  • 全程问项目 八股 条件变量原理 线程优先级 编程题 链表求和 给个二面吧

  • 在外出地点可经由互联网连接自己家中的PS3™。即使是远离自己家中的场所、或是海外皆可进行遥控操作。 A ) PS3™ 有线或无线连接互联网 B ) ADSL调制解调器、缆线调制解调器、光纤终端设备(ONU)等 C ) 互联网连接 D ) 接入点或无线路由器 E ) 以Wi-Fi连接 F ) 以移动网络连接 经由互联网进行遥控操作时,可能会因您使用的网络设备而出现无法操作的现象。详细请参阅PS3™用

  • 问题内容: 这是一个样本表数据 我尝试连接表列值以获取以下内容 有没有办法查询此或存储过程?像Concatenate over(partition by)之类的东西,我对存储过程了解不多。谢谢! 问题答案: OP在Oracle 10g上运行 ,而 LISTAGG 在 11g第2版 中引入。 因此,在Oracle版本 11克之前, 那里是不支持,你可以使用 ROW_NUMBER() 和 SYS_CO

  • 到目前为止,我已经了解到如果我需要在Android应用程序中实现从Internet服务器检索数据的方法,最好使用Java的HttpUrlConnection,如下所示: 但是在这里YouTube一个男人告诉热检索位图只需打电话: 我想指出的是,这里我们从url获取内容,而不需要调用HttpURLConnection.class和openConnection()方法。 我遵循了这个教程,代码可以编译

  • 在面试之前一定要做足准备,可以参考以下这几个方向 1.了解好岗位JD,公司的产品,公司的方向,公司最近的一些新闻,也可以去官方网看看公司对新人的培养制度,或者公司的口号,这些在面试的时候大多数都能排上用场。在面试之前还需要2.了解好自己将要面试的对象的什么谁,是主管?还是是hr?还是总监?很多同学会刻板印象的认为第一面就是主管、最后一面就是hr,其实并不是(例如广州乐牛第一面是hr,诗悦第二面是h