java.rmi.server.ExportException : Port already in use: 1099;

标签 java server rmi

我正在编写一个 Java RMI 程序来计算数字的阶乘。

这是界面:

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

public interface FactorialRMI extends Remote{

    public void setNumber(int val) throws RemoteException;
    public int calculateFactorial() throws RemoteException;
}

那么这是实现该接口(interface)的类:

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class FactorialRMIImpl extends UnicastRemoteObject implements FactorialRMI{
    private int number;
    public FactorialRMIImpl(String name) throws RemoteException {
        super();
        try {
            Naming.rebind("myFactorial",this);
        }catch(Exception e) {
            System.out.println("Exception: "+e.getMessage());
        }
    }

    @Override
    public void setNumber(int val) throws RemoteException {
        this.number=val;
    }

    @Override
    public int calculateFactorial() throws RemoteException {
        int p=1;
        for(int i=1;i<=this.number;i++)
            p=p*i;
        return p;
    }

}

这是服务器代码:

public class FactorialRMIServer {

    public static void main(String [] args) {
        try {
            FactorialRMIImpl myFactorial=new FactorialRMIImpl("myFactorial");
            System.out.println("Server is ready...");
        }catch(Exception e) {
            System.out.println("Exception: "+e.getMessage());
        }
    }
}

这是客户端代码:

import java.rmi.Naming;
import java.util.*;

public class FactorialRMIClient {

    public static void main(String [] args) {
        try {
            FactorialRMI myFact=(FactorialRMI)Naming.lookup("myFactorial");
            Scanner scan=new Scanner(System.in);
            System.out.println("Enter a number to calculate its factorial: ");
            int n=scan.nextInt();
            myFact.setNumber(n);
            System.out.println("The factorial of this number is: "+myFact.calculateFactorial());
        }catch(Exception e) {
            System.out.println("Exception: "+e.getMessage());
        }
    }
}

我没有使用 Eclipse。 我需要在jdk的bin文件夹中运行这个程序。 我使用的是jdk1.8

为了编译 java 文件,我将这些文件放入 bin 文件夹中并运行命令:

javac *.java

然后我运行命令

rmic FactorialRMIImpl
start rmiregistry
start java FactorialRMIServer
start java FactorialRMIClient

在最后 2 个命令中我收到此错误:

Exception: Connection refused to host: 127.0.0.1; nested exception is: 
java.net.ConnectException: Connection refused: connect

命令start rmiregistry给我一个错误:

java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
java.net.BindException: Address already in use: NET_Bind
at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:243)
at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
at java.rmi/sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
at java.rmi/sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:234)
at java.rmi/sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:220)
at java.rmi/sun.rmi.registry.RegistryImpl$2.run(RegistryImpl.java:196)
at java.rmi/sun.rmi.registry.RegistryImpl$2.run(RegistryImpl.java:193)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:689)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:873)
at java.rmi/sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:193)
at java.rmi/sun.rmi.registry.RegistryImpl$5.run(RegistryImpl.java:531)
at java.rmi/sun.rmi.registry.RegistryImpl$5.run(RegistryImpl.java:529)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:689)
at java.rmi/sun.rmi.registry.RegistryImpl.createRegistry(RegistryImpl.java:528)
at java.rmi/sun.rmi.registry.RegistryImpl.main(RegistryImpl.java:551)
Caused by: java.net.BindException: Address already in use: NET_Bind
at java.base/java.net.PlainSocketImpl.bind0(Native Method)
at java.base/java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:132)
at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:436)
at java.base/java.net.ServerSocket.bind(ServerSocket.java:386)
at java.base/java.net.ServerSocket.<init>(ServerSocket.java:248)
at java.base/java.net.ServerSocket.<init>(ServerSocket.java:140)
at java.rmi/sun.rmi.transport.tcp.TCPDirectSocketFactory.createServerSocket(TCPDirectSocketFactory.java:45)
at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:666)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:324)
... 15 more

我该如何解决这个问题?

最佳答案

如果您在 Windows 上运行,您可以找到在端口上运行的进程并使用以下命令终止该进程,以便释放该端口

netstat -ano | findstr :1099
taskkill /pid "EnterProcessIdHere" /F

对于Linux

lsof -i :1099
kill EnterProcessIdHere

关于java.rmi.server.ExportException : Port already in use: 1099;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67213865/

相关文章:

java - 使用 vaadin 7.3 和 valo 主题编译我的主题时出错

java - 如何更改java打开的浏览器中的tab名称

抽象类中的 Java 延迟加载单例

c - 使用 select() 在现有客户端或新客户端之间进行选择 (C)

java - 通过防火墙的 VisualVM - RMI 故障排除

java - JPanel 仅在调整窗口大小时显示(JFrame)

node.js - 如何在node.js中获取IP地址

linux - Samba 服务器安装过程中的问题 - 可能是权限

Java RMI - 了解 Oracle 教程

java - 如何拒绝客户端解除RMI注册中心的绑定(bind)?