我正在制作我的第一个RMI服务器(也包括在我正在进行的项目中)。这是我的错误:
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.11.1;
nested exception is:
java.net.ConnectException: Connection refused: connect
这是主要的:
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class mainServidor {
public static void main(String[] args) throws Exception{
utils.setCodeBase(IServidor.class);
Servidor_Cubo servidor = new Servidor_Cubo();
IServidor remote = (IServidor)UnicastRemoteObject.exportObject(servidor, 8888);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("retoAleatorio", remote);
System.out.println("servidor corriendo, presione enter para terminar");
System.in.read();
registry.unbind("retoAleatorio");
UnicastRemoteObject.unexportObject(servidor, true);
}
}
这是Server类 不要注意所有的FILEREADING东西
import java.io.File;
import java.io.FileNotFoundException;
import static java.lang.Math.abs;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
/**
*
* @author Emmanuel
*/
public class Servidor_Cubo implements IServidor {
ArrayList<Reto> ArrayRetos;
Map<Integer,String> mapaJugadores_Integer = new HashMap<Integer,String>();
Map<String,Integer> mapaJugadores_String = new HashMap<String,Integer>();
public static int sesion = abs(new Random().nextInt());
@Override
public int AgregarUsuarioNuevo(String nombre) throws RemoteException {
int id = sesion++;
mapaJugadores_Integer.put(id, nombre);
mapaJugadores_String.put(nombre, id);
return id;
}
@Override
public Integer autenticar(String nombre){
return mapaJugadores_String.get(nombre);
}
@Override
public String TraerRetoAleatorio(int num){
return leerArchivoMovimientos(num);
}
public void agregarGanador(String Nombre, int Mov,int num){
int id = mapaJugadores_String.get(Nombre);
}
public void cargarServidor( ){
File fReto = new File ("D:/repos/RubikFX-master/Retos/ListadoDeRetos.txt"); //Ingresa ruta del .txt de retos
File fJugadores = new File("D:/repos/RubikFX-master/Retos/Jugadores.txt"); //Ingresa ruta del .txt de jugadores
Scanner scanReto;
Scanner scanJugador;
try {
System.out.println("SI FUNCIONAAA!!!");
scanReto = new Scanner(fReto);
scanJugador = new Scanner(fJugadores);
ArrayList<Reto> retos = new ArrayList<>();
while(scanReto.hasNext()){
Reto reto = new Reto();
ArrayList<Jugador> lista = new ArrayList<>();
reto.setReto(scanReto.nextLine());
String[] datoReto = scanJugador.nextLine().split(";");
for(int i = 0; i < datoReto.length; i++ ){
Jugador jug = new Jugador();
String str = datoReto[i];
String[] datosJugador = str.split(",");
jug.setNombre(datosJugador[0]);
//int foo = Integer.parseInt("1234");
jug.setId (Integer.parseInt(datosJugador[1]));
jug.setMovimientos(Integer.parseInt(datosJugador[2]));
lista.add(jug);
}
reto.setGanadores(lista);
retos.add(reto);
}
} catch (FileNotFoundException ex) {
System.out.println("NO FUNCIONA!!!");
}
}
这是界面IServidor
package servidor_cubo;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IServidor extends Remote {
public Integer autenticar(String nombre) throws RemoteException;
public int AgregarUsuarioNuevo(String nombre) throws RemoteException;
public String TraerRetoAleatorio(int num) throws RemoteException;
}
我使用这个utils类来设置类路径(在教程中看到)
public class utils {
public static final String CODEBASE = "java.rmi.server.codebase";
public static void setCodeBase(Class<?> c) {
String ruta = c.getProtectionDomain().getCodeSource()
.getLocation().toString();
String path = System.getProperty(CODEBASE);
if (path != null && !path.isEmpty()) {
ruta = path + " " + ruta;
}
System.setProperty(CODEBASE, ruta);
}
}
我已经在cmd中“javaw rmiregistry”....所以......我不知道该怎么做。拜托,帮助我。
使用win8.1 ...
答案 0 :(得分:0)
在你的问题的最后,你说你正在运行Windows 8.1。从Windows 7开始,默认情况下启用防火墙。我的钱在防火墙上阻止了你的RMI服务的流量。
您有几个选择:
Windows防火墙更喜欢您按应用程序在应用程序上打开端口。这样做要比自己打开端口容易得多。我建议以这种方式管理它,因为它更容易使用。如果是一次性设置,则可以通过控制面板取消阻止应用程序,在“系统和安全部分”中,您应该看到“防火墙”选项。其中一个选项是“允许程序通过Windows防火墙”。您还应该能够通过搜索窗口防火墙并在左侧命令中找到相同的选项来找到它。
如果要自动执行该过程,例如在安装脚本中,您可以manage the firewall through the command line。如需快速参考:
netsh advfirewall firewall add rule name="Secure App" dir=in action=allow program="C:\Program Files\SecureApp.exe" enable=yes