RMI를 사용하여 서버와 클라이언트 간의 통신을 시도 할 때 문제가 있습니다. 내 코드는 아래에 첨부되어 있습니다. 서버가 잘 실행됩니다. PC 포트 목록에서 수신 대기 포트를 볼 수 있습니다. 클라이언트는 registry.lookup에서 실패합니다. 나는 비슷한 문제를 발견하지 못했다. 도와주세요.registry.lookup을 호출 할 때 테이블에 해당 객체가 없습니다.
서버 :
public class Main {
private static int port = Registry.REGISTRY_PORT;
private static Registry registry;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length == 1) {
try {
port = Integer.parseInt(args[0]);
}
catch (NumberFormatException e) {
System.out.println("Port number is not valid!");
System.exit(0);
}
}
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
String name = "DBInterface";
System.out.println("Starting server.");
try {
DBInterface DBInterface = new DBClass();
DBInterface stub = (DBInterface) UnicastRemoteObject.exportObject(DBInterface, 5000);
registry = LocateRegistry.createRegistry(port);
registry.rebind(name, stub);
}
catch (RemoteException e)
{
System.out.println(e.getMessage());
}
System.out.println("Server succesfully started.");
}
}
클라이언트 : 당신은 기본적으로 불가능 무엇을 설명
public class Client {
private static String ipAddress = "localhost";
private static int port = Registry.REGISTRY_PORT;
private static String confFile = "";
public static DBInterface dbServer = null;
public static String name = "DBInterface";
public static void main(String[] args) {
System.out.println("Starting client.");
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
if (args.length == 3) {
try {
ipAddress = args[0];
port = Integer.parseInt(args[1]);
confFile = args[2];
}
catch (NumberFormatException e) {
System.out.println("Port number is not valid!");
System.exit(0);
}
}
else
{
System.out.println("Some parameter is missing!");
System.out.println("Valid parameters are: IP(0) Port(1) Config_file_name(2).");
}
ArrayList<ArrayList<String>> commands = Tools.loadConfigFile(confFile);
Iterator<ArrayList<String>> commandsIterator = commands.iterator();
Registry registry;
try {
registry = LocateRegistry.getRegistry(ipAddress, port);
dbServer = (DBInterface) registry.lookup(name); //code fails here
} catch (RemoteException e) {
System.out.println(e.getMessage()); //"no such object in table" is printed on the screen
} catch (NotBoundException e) {
System.out.println(e.getMessage());
}
Tools tools = new Tools(dbServer);
...
'lookup()'을 호출 할 때 이것을 얻는다고 믿기 어렵습니다. 조회 결과 객체에 대한 원격 메소드를 호출 할 때 가져 오지 않았습니까? – EJP
빠른 답변을 주셔서 감사합니다. 내가 netbeans에서 클라이언트를 디버깅보다 명령 줄에서 서버를 실행합니다. 줄 단위로 이동하고 "dbServer = (DBInterface) registry.lookup (name);" try 블록에서 실패하면 catch는 "no such object in table"을 출력합니다. catch 문에 system.exit을 넣는 것을 잊었 기 때문에 프로그램이 계속되지만, 나중에 원격 메소드를 호출 할 때 실패합니다. – MBI
전체 스택 추적을 게시하십시오. 대답을 편집하십시오. – EJP