Java-RMI-Client Zugriff verweigert
Habe ich ein kleines Java-RMI-Server-und-Client-Programm, das ich Schreibe. Ich habe einige Zeit damit verbracht zu versuchen, herauszufinden, die Fehlermeldungen ohne Erfolg.
Den Client generiert den folgenden Fehler:
Versucht zu verbinden: 127.0.0.1:3232
FEHLER!!!: StockClient: main: Konnte nicht mit dem server verbinden: java.rmi.UnmarshalException: Fehler unmarshaling return header; geschachtelte
Ausnahme ist:
java.rmi.UnmarshalException: Fehler unmarshaling return header; nested exception is:
java.io.EOFException
java.io.EOFException
bei der sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:209)
bei der sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
bei der sun.rmi.Registrierung.RegistryImpl_Stub.Suche(Unbekannte Quelle)
bei StockClient.StockClient.main(StockClient.java:44)
Verursacht durch: java.io.EOFException
bei java.io.DataInputStream.readByte(DataInputStream.java:250)
bei der sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:195)
... 3 mehr
Mit dem server die folgende Fehlermeldung nur, wenn der client versucht sich zu verbinden.
diese Adresse=localhost/127.0.0.1,port=3232
Exception in thread "RMI TCP Connection(Leerlauf)" java".Sicherheit.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:62586 accept,resolve)
bei java.Sicherheit.AccessControlContext.checkPermission(AccessControlContext.java:374)
bei java.Sicherheit.AccessController.checkPermission(AccessController.java:549)
bei java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
bei java.lang.SecurityManager.checkAccept(SecurityManager.java:1157)
bei der sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.checkAcceptPermission(TCPTransport.java:636)
bei der sun.rmi.transport.tcp.TCPTransport.checkAcceptPermission(TCPTransport.java:275)
bei der sun.rmi.transport.Transport$1.ausgeführt(der Transport.java:158)
bei java.Sicherheit.AccessController.doPrivileged(Native Method)
bei der sun.rmi.transport.Transport.serviceCall(Transport.java:155)
bei der sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
bei der sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
bei der sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
bei java.util.gleichzeitige.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
bei java.util.gleichzeitige.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
bei java.lang.Thread.run(Thread.java:680)
Weil der server Fehler ich bin ziemlich sicher, dass es ein Sicherheits-oder registry-Fehler, security-policy für den server ist:
grant {
permission java.Sicherheit.AllPermission;
};
und ausführen, mit dem folgenden argument
-Djava.Sicherheit.policy=client.Politik
Ich habe alles versucht ich finden kann, scheinen aber zu halten im Kreise herum.
relevanten Methoden:
Server:
public static void main(String[] args)
{//main(...) starts
//set up the data structures and data
//add users
//Users hard coded as this is an example proof on concept program
//Names and passwords not hashed for simplicity
User alpha = new User("Alpha", "AlphaPass");
User omega = new User("Omega", "OmegaPass");
users.add(alpha);
users.add(omega);
//startup the RMI server
try
{
System.setSecurityManager(new RMISecurityManager());
StockServer server = new StockServer();
StockServerInterface inter = (StockServerInterface)
UnicastRemoteObject.exportObject (server,0);
//create the registry and bind the name and object.
registry = LocateRegistry.createRegistry(thisPort);
registry.rebind("StockServer", inter);
}
catch (Exception e)
{
System.out.println("Unable to create StockServer: " + e);
e.printStackTrace();
System.exit(1);
}
}//main(...) ends
/**
* Constructor for StockServer
*
* @throws RemoteException
*/
public StockServer() throws RemoteException
{
//try to get the host machine's IP address
try
{
//get the address of this host.
thisAddress = (InetAddress.getLocalHost()).toString();
} catch (Exception e)
{
throw new RemoteException("can't get inet address. " + e);
}
//Set the port
thisPort = 3232;
//Print out the server address and port
System.out.println("this address=" + thisAddress + ",port=" + thisPort);
}
Client:
private static StockServerInterface stockServer;
static public void main(String args[])
{
Registry registry;
//get the server address from the args
String serverAddress = args[0];
//get the server port from the args
String serverPort = args[1];
//Let the user know we are about to try to connect
System.out.println("Trying to connect to: " + serverAddress + ":" + serverPort);
try
{
//get the registry
registry = LocateRegistry.getRegistry(
serverAddress,
(new Integer(serverPort)).intValue());
//look up the remote object
stockServer = (StockServerInterface) (registry.lookup("StockServer"));
//Authenticate the user
authenticate();
//setup the hashset
HashSet<Stock> hashStockSet = null;
//setup the hashset of desired stocks
try
{
hashStockSet = getHashSet();
} catch (IOException e)
{
e.printStackTrace();
System.exit(1);
} catch (ClassNotFoundException e)
{
e.printStackTrace();
System.exit(1);
}
//bit of a heavy handed infinte loop so we continue to get the loop
while(true)
{
//Run the ticker
ticker(hashStockSet);
}
//call the remote method
}
catch (RemoteException e)
{
System.out.println("ERROR!!!: StockClient: main: Could not connect to the server: "+e);
e.printStackTrace();
}
catch (NotBoundException e)
{
System.out.println("ERROR!!!: StockClient: main: Could not connect to the server: "+e);
e.printStackTrace();
}
Hi JSS, Danke für die Anregung. Ich bin mit einem mac und alle ports offen sind.
Warum ist der server ausgeführt wird, mit einer security-policy-Datei namens client.Politik? Warum ist es ausgeführt wird, mit einem security manager überhaupt?
AccessControlException wird verursacht durch die Java-SecurityManager, die nicht durch eine externe firewall.
InformationsquelleAutor Graeme T | 2012-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht eine
SecurityManager
in einem RMI-server, wenn der client setzt auf der Codebasis Funktion zur Versorgung der server mit Klassen. Entweder entfernen, oder Debuggen Sie die .policy-Datei. Klar, die, die Sie geschrieben habe, nicht geladen wird.Ihre server mit
-Djava.security.debug=access,failure
und Sie werden sehen, wo all die security domains werden immer Ihre Konfigurationen aus, und der Domäne, die sich nicht an der Stelle, wo die exception geworfen wird.InformationsquelleAutor user207421