简体   繁体   English

java.rmi.server.ExportException:端口已在使用:1099;

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

I am writing a Java RMI program to calculate the factorial of a number.我正在编写一个 Java RMI 程序来计算一个数字的阶乘。

This is the interface:这是界面:

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;
}

Then this is the class that implements the interface:那么这是实现接口的class:

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;
    }

}

Here is the server code:这是服务器代码:

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());
        }
    }
}

And here is the client code:这是客户端代码:

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());
        }
    }
}

I am not using eclipse.我没有使用 eclipse。 i am required to run this program in the bin folder of the jdk.我需要在 jdk 的 bin 文件夹中运行这个程序。 i am using jdk1.8我正在使用jdk1.8

to compile the java file i put these file in the bin folder and run the command:要编译 java 文件,我将这些文件放在 bin 文件夹中并运行命令:

javac *.java

then i run the commands然后我运行命令

rmic FactorialRMIImpl
start rmiregistry
start java FactorialRMIServer
start java FactorialRMIClient

in the last 2 command i get this error:在最后 2 个命令中,我收到此错误:

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

The command start rmiregistry gives me an error:命令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

How can I solve this?我该如何解决这个问题?

if you are running on windows, you can find the process running on port and kill that process using below command, so that port will be freed如果您在 windows 上运行,您可以找到在端口上运行的进程并使用以下命令终止该进程,以便释放该端口

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

For linux适用于 linux

lsof -i :1099
kill EnterProcessIdHere

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM