java.rmi.ServerException:服务器线程中发生RemoteException
服务器:创建一个已解决的谜题,可以解决一个未解决的谜题java.rmi.ServerException:服务器线程中发生RemoteException,java,rmi,Java,Rmi,服务器:创建一个已解决的谜题,可以解决一个未解决的谜题 package server; import java.rmi.*; import java.rmi.server.*; import common.Puzzle; import server.puzzleObject.PuzzleSolved; import java.net.MalformedURLException; class PuzzleSolver { private static final String HOS
package server;
import java.rmi.*;
import java.rmi.server.*;
import common.Puzzle;
import server.puzzleObject.PuzzleSolved;
import java.net.MalformedURLException;
class PuzzleSolver {
private static final String HOST = "localhost";
public static void main(String args[]) {
try {
String serverName = args[0];
Puzzle puzzle = new PuzzleSolved();
String rmiObServer = "rmi://" + HOST + "/" + serverName;
Naming.rebind(rmiObServer, puzzle);
System.out.println("Server ready");
}
catch(ArrayIndexOutOfBoundsException ex) {
System.out.println("Error! E' necessario specificare il nome del server");
}
catch(RemoteException r) {
System.out.println("Error while rebind object");
r.printStackTrace();
System.exit(1);
}
catch(MalformedURLException m) {
System.out.println("Error! Malformed url require");
}
}
}
package client;
import java.rmi.*;
import java.io.Serializable;
import client.puzzleIO.*;
import common.Solvable;
import common.Puzzle;
import common.PuzzleUnsolved;
class PuzzleSolver {
private static final String HOST = "localhost";
public static void main(String args[]) {
PuzzleWriter writer = null;
PuzzleReader reader = null;
try {
String inputFile = args[0], outputFile = args[1], serverName = args[2];
writer = new PuzzleWriter();
reader = new PuzzleReader();
System.out.println("primo");
PuzzleUnsolved unsolved = new PuzzleUnsolved();
reader.read(unsolved, inputFile);
writer.write(unsolved, outputFile, false);
System.out.println("secondo");
Solvable ref = (Solvable) Naming.lookup("rmi://" + HOST + "/" + serverName);
ref.solve(unsolved);
writer.write(ref, outputFile, true);
System.out.println("fine");
}
catch(ArrayIndexOutOfBoundsException e) {
if(args.length == 0)
System.out.println("E' necessario specificare il file di input e di output");
if(args.length == 1)
System.out.println("File di output assente");
if(args.length == 2)
System.out.println("E' necessario specificare un nome per il server");
}
catch(ConnectException c) {
System.out.println("Problema di connessione con il server");
}
catch(Exception e) {
System.out.println("Si è verificato un problema nell'esecuzione");
e.printStackTrace();
}
}
}
客户:创建一个未解决的谜题,然后要求查找一个可解决的对象,然后运行“未解决的谜题解决”
package server;
import java.rmi.*;
import java.rmi.server.*;
import common.Puzzle;
import server.puzzleObject.PuzzleSolved;
import java.net.MalformedURLException;
class PuzzleSolver {
private static final String HOST = "localhost";
public static void main(String args[]) {
try {
String serverName = args[0];
Puzzle puzzle = new PuzzleSolved();
String rmiObServer = "rmi://" + HOST + "/" + serverName;
Naming.rebind(rmiObServer, puzzle);
System.out.println("Server ready");
}
catch(ArrayIndexOutOfBoundsException ex) {
System.out.println("Error! E' necessario specificare il nome del server");
}
catch(RemoteException r) {
System.out.println("Error while rebind object");
r.printStackTrace();
System.exit(1);
}
catch(MalformedURLException m) {
System.out.println("Error! Malformed url require");
}
}
}
package client;
import java.rmi.*;
import java.io.Serializable;
import client.puzzleIO.*;
import common.Solvable;
import common.Puzzle;
import common.PuzzleUnsolved;
class PuzzleSolver {
private static final String HOST = "localhost";
public static void main(String args[]) {
PuzzleWriter writer = null;
PuzzleReader reader = null;
try {
String inputFile = args[0], outputFile = args[1], serverName = args[2];
writer = new PuzzleWriter();
reader = new PuzzleReader();
System.out.println("primo");
PuzzleUnsolved unsolved = new PuzzleUnsolved();
reader.read(unsolved, inputFile);
writer.write(unsolved, outputFile, false);
System.out.println("secondo");
Solvable ref = (Solvable) Naming.lookup("rmi://" + HOST + "/" + serverName);
ref.solve(unsolved);
writer.write(ref, outputFile, true);
System.out.println("fine");
}
catch(ArrayIndexOutOfBoundsException e) {
if(args.length == 0)
System.out.println("E' necessario specificare il file di input e di output");
if(args.length == 1)
System.out.println("File di output assente");
if(args.length == 2)
System.out.println("E' necessario specificare un nome per il server");
}
catch(ConnectException c) {
System.out.println("Problema di connessione con il server");
}
catch(Exception e) {
System.out.println("Si è verificato un problema nell'esecuzione");
e.printStackTrace();
}
}
}
谜题:抽象类
package common;
import java.rmi.*;
import java.rmi.server.*;
import java.util.ArrayList;
import java.io.Serializable;
import common.Solvable;
import common.PuzzleTile;
import common.PuzzleUnsolved;
public abstract class Puzzle extends UnicastRemoteObject implements Solvable{
private int rows = 0, columns = 0;
protected ArrayList<PuzzleTile> tiles = new ArrayList<PuzzleTile>();
public Puzzle() throws RemoteException {
}
public int rows(){
return rows;
}
public int columns(){
return columns;
}
public void setColumns(int columns) {
this.columns = columns;
}
public void setRows(int rows) {
this.rows = rows;
}
public void addTile(PuzzleTile t) {
tiles.add(t);
}
protected PuzzleTile tile(int row, int column) {
return tiles.get(row * columns + column);
}
public ArrayList<PuzzleTile> tiles() {
return tiles;
}
public abstract String toString();
public abstract void solve(PuzzleUnsolved puzzleToSolve) throws RemoteException;
}
可解决-用于由客户端远程调用的接口
package common;
import java.rmi.*;
import common.Puzzle;
import common.PuzzleUnsolved;
public interface Solvable extends Remote {
public void solve(PuzzleUnsolved puzzleToSolve) throws RemoteException;
}
当我试图从客户端解决一个未解决的难题时,我得到了这个堆栈错误:(
远程接口与实际的远程方法不一致。您在未重建和重新部署整个系统的情况下更改了远程方法的签名。您认为如何向远程对象添加方法?PuzzleSolved有一个方法调用solve,否?可能我不懂这个问题(对不起,我的英语)我错了。我得到的正确错误是(java.lang.IllegalArgumentException)
package common;
import java.rmi.*;
import common.Puzzle;
import common.PuzzleUnsolved;
public interface Solvable extends Remote {
public void solve(PuzzleUnsolved puzzleToSolve) throws RemoteException;
}
primo
secondo
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$254(TCPTransport.java:683)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/323034826.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy0.solve(Unknown Source)
at client.PuzzleSolver.main(PuzzleSolver.java:33)