Java 启动我的RMI服务器(在ISP下)以便通过Internet接收远程呼叫时出现问题
我正在创建一个客户机/服务器应用程序,其中我的服务器和客户机可以在同一台机器上,也可以在不同的机器上,但都在ISP下 我的RMI计划:- -远程Intreface:-Java 启动我的RMI服务器(在ISP下)以便通过Internet接收远程呼叫时出现问题,java,client-server,rmi,Java,Client Server,Rmi,我正在创建一个客户机/服务器应用程序,其中我的服务器和客户机可以在同一台机器上,也可以在不同的机器上,但都在ISP下 我的RMI计划:- -远程Intreface:- //Calculator.java public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long su
//Calculator.java
public interface Calculator
extends java.rmi.Remote {
public long add(long a, long b)
throws java.rmi.RemoteException;
public long sub(long a, long b)
throws java.rmi.RemoteException;
public long mul(long a, long b)
throws java.rmi.RemoteException;
public long div(long a, long b)
throws java.rmi.RemoteException;
}
远程接口实现:-
//CalculatorImpl.java
public class CalculatorImpl
extends
java.rmi.server.UnicastRemoteObject
implements Calculator {
public CalculatorImpl()
throws java.rmi.RemoteException {
super();
}
public long add(long a, long b)
throws java.rmi.RemoteException {
return a + b;
}
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a - b;
}
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a * b;
}
public long div(long a, long b)
throws java.rmi.RemoteException {
return a / b;
}
}
服务器:-
//CalculatorServer.java
import java.rmi.Naming;
import java.rmi.server.RemoteServer;
public class CalculatorServer {
public CalculatorServer(String IP)
{
try {
Calculator c = new CalculatorImpl();
Naming.rebind("rmi://"+IP+":1099/CalculatorService", c);
} catch (Exception e)
{
System.out.println("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer(args[0]);
}
}
客户:-
//CalculatorClient.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c = (Calculator)Naming.lookup("rmi://"+args[0]+"/CalculatorService");
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
}
catch (MalformedURLException murle) {
System.out.println();
System.out.println("MalformedURLException");
System.out.println(murle);
}
catch (RemoteException re) {
System.out.println();
System.out.println("RemoteException");
System.out.println(re);
}
catch (NotBoundException nbe) {
System.out.println();
System.out.println("NotBoundException");
System.out.println(nbe);
}
catch (java.lang.ArithmeticException ae) {
System.out.println();
System.out.println("java.lang.ArithmeticException");
System.out.println(ae);
}
}
}
当服务器程序和客户端程序都在同一台计算机上时:-
我通过传递路由器静态IP地址来启动服务器程序:-192.168.1.35
在args[0]中,我的服务器启动…很好
通过在客户端的args中传递相同的静态IP地址[0]也可以正常工作
但是:-
当服务器程序和客户端程序都位于不同的计算机上时:-
现在,我试图通过在args[0]中传递服务器的公共IP地址59.178.198.247来启动服务器程序,以便它可以通过internet接收呼叫。
但我无法启动它
出现以下异常情况:-
Trouble: java.rmi.ConnectException: Connection refused to host: 59.178.198.247;
nested exception is:
java.net.ConnectException: Connection refused: connect
我认为这是由于NAT问题,因为我在ISP下
所以,我的问题是,如何在ISP下启动我的RMI服务器,以便它能够接收来自internet的远程呼叫 您的ISP可能正在阻止连接。您必须与他们交谈。尝试查看您的端口1099是否可见,例如,您可以使用。如果没有,请使用开放端口,或者编辑防火墙或路由器配置,您可能需要设置端口转发。如果是,请查看您的RMI安全策略。是的,我在no-ip.com上检查了我的端口号1099,结果是:-错误:我无法在端口号1099的59.178.84.207上看到您的服务原因:连接超时