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

如何通过Internet向服务器进行Java RMI调用

宰父衡
2023-03-14

我尝试了一个简单的java rmi程序,其中客户端对服务器进行远程调用,服务器返回字符串。它与通过LAN连接的两台计算机完美配合通过局域网,但服务器和客户端都连接到互联网?我尝试了以下简单的代码,将Client.java中的localhost更改为服务器的ip地址。没用。我打这么远的电话需要什么?

//远程接口-

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyInterface extends Remote
{
    public String SaySomething() throws RemoteException;
}

//客户。JAVA

import java.rmi.*;
import java.rmi.registry.*;

public class Client
{
    public static void main(String []args)
    {
        System.setProperty( "java.security.policy", "client.policy" );
        if (System.getSecurityManager() == null)
                    System.setSecurityManager(new RMISecurityManager());
        try {
                        String name = "MyInterface";
                        Registry registry = LocateRegistry.getRegistry("localhost",4501);
                        MyInterface mi = (MyInterface) registry.lookup(name);
            System.out.println(mi.SaySomething());
                } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

//Server.java

import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.UnicastRemoteObject;

public class Server implements MyInterface
{
    public Server()
    {
        super();
    }
    public String SaySomething()
    {
        return "Server Speaking";
    }
    public static void main(String []args)
    {
        System.setProperty( "java.security.policy", "server.policy" );
        if(System.getSecurityManager() == null)
           System.setSecurityManager(new RMISecurityManager());
            try {
                        String name = "MyInterface";
                        MyInterface mi = new Server();
                        MyInterface stub =(MyInterface) UnicastRemoteObject.exportObject(mi,4501);
                        Registry registry = LocateRegistry.createRegistry(4501);
                        registry.rebind(name, stub);
                        System.out.println("Server bound");
            } catch (Exception e) {
            System.out.println("oops");
                }
    }
}

我得到了以下例外:java。安全AccessControlException:在java上拒绝访问(“java.net.SocketPermission”“x.x.x:4501”“连接,解析”)。安全AccessControlContext。java上的checkPermission(AccessControlContext.java:366)。安全访问控制器。在java上检查权限(AccessController.java:555)。lang.SecurityManager。java上的checkPermission(SecurityManager.java:549)。lang.SecurityManager。java上的checkConnect(SecurityManager.java:1051)。网插座在java上连接(Socket.java:574)。网插座在java上连接(Socket.java:528)。网插座(Socket.java:425)在java。网插座(Socket.java:208)太阳报。rmi。运输代理我是袜子工厂。在sun上创建Socket(RMIDirectSocketFactory.java:40)。rmi。运输代理这是一家袜子工厂。在sun上创建套接字(rmistersocketfactory.java:146)。rmi。运输tcp。Tpendpoint。sun上的newSocket(TCPEndpoint.java:613)。rmi。运输tcp。TCP频道。在sun上创建连接(TCPChannel.java:216)。rmi。运输tcp。TCP频道。sun上的newConnection(TCPChannel.java:202)。rmi。服务器UnicastRef。sun的newCall(UnicastRef.java:340)。rmi。注册处。注册Impl_存根。在客户端查找(未知源)。main(Client.java:14)

共有2个答案

漆雕正奇
2023-03-14

你应该检查一下你的权限。

如果你的服务器是你的家用电脑,你应该检查以确保你的路由器允许传入连接(默认情况下是被阻止的)。

如果您的服务器是office PC,则可能会被防火墙阻止。

弘承业
2023-03-14

除非您正在使用代码库功能,否则您不需要RMI的安全管理器。移除它。

 类似资料:
  • 据我所知,我的服务器运行正常,因为我(仅在我自己的计算机上)可以连接到服务器。 当我试图让任何其他计算机连接到它,它从来没有连接,我感到茫然和需要想法。 我使用谷歌chrome连接,就像我之前说的,它工作很好,但只在我的电脑上

  • 问题内容: 我目前正在使用HTTP方法来调用一些URL,这将导致JIRA问题。 现在,我想使用Apache Camel,该如何使用? 我需要通过骆驼调用以下链接: 由于我是Camel的新手,因此也请提出一些解决方案和示例。 谢谢 问题答案: 您可以轻松使用CXFRS组件;如果出于某种原因需要使用HTTP组件进行操作,则也可以轻松地使用它: 当然,在到达路由的这一部分之前,您将需要使用标头来丰富您的

  • 我想通过客户端中MethodDescriptor的InputStream调用grpc服务器,但我没有成功。这是我的代码: grpc all dependency的版本为: 在服务器中,我的EchoServiceImpl扩展了EchoServiceGrpc。EchoServiceImplBase,重写echo rpc方法。我在构建服务器之前导出inputstream服务。 在客户机中,我创建了Inp

  • 我尝试使用Wildfly-maven-plugin构建示例服务。源代码是: https://github.com/wildfly/quickstart/tree/10.x/helloworld-html5 我想简单地在maven pom中使用wildfly maven插件。xml: 要构建类似于测试服务器的命令: 运行服务器。 我可以找到自述文件。但是写的网址似乎是错的。 我测试链接: http:

  • 本程序是利用Socket编程将陀螺仪和加速度计信息(6位)发送到服务器。 我的问题是如何做套接字连接和从Android Wear发送数据到服务器(使用套接字连接) 以下是完整的程序:: 相关问题:Android wear不启动线程 我也阅读了http://developer.android.com/training/wearables/data-layer/index.html,但仍然在尝试最好的

  • 我正在Java开发一个游戏,使用RMI进行所有网络通信。RMI允许我在服务器上调用方法,但对我来说还不够。我还希望服务器能够在连接的客户端之间传播消息。 我的客户机查找服务器(它的接口扩展为远程)并在其上注册。它允许服务器知道谁已连接。我的客户机还实现了一个扩展远程的接口。这是我的代码的一部分: 接口声明: 服务器端: 客户端: 此解决方案适用于本地,但当我尝试通过Internet使用它时则不起作