Java 如何为RMI区域设置自定义端口?

Java 如何为RMI区域设置自定义端口?,java,rmi,Java,Rmi,在我的RMI程序中,我想在端口8080上设置我的RMI注册表,但当我这样做时,我得到一个异常 这是我的服务器代码 public class Server { public static void main(String[] args) { try { LocateRegistry.createRegistry(8080); MathServerImpl mathServer = new MathServerImpl();

在我的RMI程序中,我想在端口8080上设置我的RMI注册表,但当我这样做时,我得到一个异常

这是我的服务器代码

public class Server {
    public static void main(String[] args) {
        try {
            LocateRegistry.createRegistry(8080);
            MathServerImpl mathServer = new MathServerImpl();
            Naming.rebind("MathServer", mathServer);
            System.out.println("Math Server has started and is running");
        } catch (RemoteException | MalformedURLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
代码在端口1099上正常工作,据我所知,这是它的默认端口,但在本例中,它给了我一个java.net.ConnectException,下面是日志

java.rmi.ConnectException: Connection refused to host: 10.100.25.173; nested exception is: 
    java.net.ConnectException: Connection refused
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:177)
    at server.Server.main(Server.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 11 more
java.rmi.ConnectException:拒绝连接主机:10.100.25.173;嵌套异常是:
java.net.ConnectException:连接被拒绝
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(tcpcchannel.java:216)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(tcpcchannel.java:202)
位于sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知源)
位于java.rmi.Naming.rebind(Naming.java:177)
位于server.server.main(server.java:16)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
原因:java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:579)
位于java.net.Socket.connect(Socket.java:528)
位于java.net.Socket。(Socket.java:425)
位于java.net.Socket(Socket.java:208)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
位于sun.rmi.transport.proxy.rmismastersocketfactory.createSocket(rmismastersocketfactory.java:147)
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 还有11个

如果您是linux Ubuntu用户,则在启动RMI注册表时使用以下命令

RMI8080&

窗户


启动rmiregistry 8080

您正在端口8080上创建注册表,但随后尝试在端口1099的默认注册表中重新绑定对象。您需要:

  • 将完整URL传递到
    Naming.rebind
    ,包括端口号,即
    //localhost:8080/MathServer
  • 保存对
    LocateRegistry.createRegistry
    返回的
    注册表
    对象的引用,并使用该注册表的实例方法而不是
    命名的静态方法绑定该对象
类似地,当客户机
查找对象时,您需要在客户机中使用完整的
//localhost:8080/MathServer
URL表单,以确保他们与正确的注册表对话

Naming.rebind("MathServer", mathServer);
换成

Naming.rebind("//localhost:8080/MathServer", mathServer);

我是mac用户,但我想在代码中完成,而不是从终端。您能告诉我如何定义这两种情况下的客户端查找吗?这两种解决方案都正确启动了服务器,但是客户端现在没有连接,只是忘记了在客户端设置端口号,就是这样,再次感谢