Débutante JAVA : Erreur

Fermé
Gaëlle - 26 déc. 2003 à 09:50
 soregh - 7 mars 2012 à 21:08
Bonjour à tous,

Je viens de faire un petit pgm "hello world" en java (C'est ma 1ere expérience en matière de prog).
Quand je lance le serveur j'ai l'erreur suivante :

java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


J'ai trouvé sur le Net la solution, mais je n'arrive pas à comprendre ce qu'il faut faire (créer des fichiers? où ça? juste les modifier?..etc) Est ce quelqu'un pourrait me traduire de façon simple le etxte ci dessous pour savoir ce que je dois faire? merci d'avance...c'est un projet que je dois avoir terminé mercredi :(

Lorsque l'on essaie d'utiliser un SecurityManager, on obtient le message d'erreur suivant :
java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


Modification par programme
System.setSecurityManager (new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}
});



Le fichier .java.policy
Les permissions du SecurityManager sont spécifiées dans l'ordre :

dans le fichier java.policy de ${java.home}/lib/security/java.policy

puis dans

${user.home}/.java.policy (attention au point !)

Les instructions du fichier policy
Le serveur doit pouvoir accepter des connexions d'un hôte particulier :

permission java.net.SocketPermission "sace.essi;fr", "accept";

ou de tous les hôtes et pouvoir faire resolve également :

permission java.net.SocketPermission "*", "accept, resolve";

Pour définir cela, lancer la commande (sous jdk/bin) (voir aussi "A quick look at policytool"):

policytool

et éditer le fichier .java.policy (sous Linux sous ~, sur PC sur c:\winnt\profiles\votreNomuser)


Merci encore pour votre aide

Gaëlle
A voir également:

45 réponses

silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
28 déc. 2003 à 18:29
Salut,

Il me semble que le port que tu utilises n'est pas le même dans le fichier HelloImpl (port 1000) et le fichier java.policy (port 1024 et suivant) ...
De plus, le port normalement utilisé par RMI est le 1099 ...
As-tu essayé le port par defaut (1099) à la fois dans le fichier java.policy et la classe HelloImpl ?
De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ...

Et n'oublie pas d'arrêter et de redemarrer le rmiregistry à chaque fois que tu modifies et donc recompile tes classes (de même si tu modifies le fichier java.policy)

J'espere que ça t'aideras ...

sfx
6
donc j'ai essayé en lancant rmiregistry sur le port 1000

C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
HelloServer enregistrÚ dans le registry



c'est bien ce que j'avais mis dans HelloImpl

public static void main(String args[])
{
//
//cré et installe un security manager
//
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManagerPermissif());
}
try{
HelloImpl obj = new HelloImpl("HelloServer");
Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
System.out.println("HelloServer enregistré dans le registry");
}
catch (Exception e){
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}
alors après je lance index.html parce que c'est fait avec un applet

//HelloApplet.java
//
package rmidemo;
import java.awt.Graphics;
import java.rmi.Naming;
public class HelloApplet extends java.applet.Applet {
String message = "";
public void init() {
try {
Hello obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");
message = obj.sayHello();
} catch (Exception e) {
System.out.println("HelloApplet exception: " +
e.getMessage());
e.printStackTrace();
}
}
public void paint (Graphics g) {
g.drawString(message, 25, 50);
}
}


Il me dit que l'applet est démarré mais ya rien qui s'affiche et là ya une console java qui lance et dedans j'ai un msg d'erreur :

HelloApplet exception: Connection refused to host: 192.168.0.5; nested exception is:
java.net.ConnectException: Connection refused: connect

java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested exception is:
java.net.ConnectException: Connection refused: connect

java.net.ConnectException: Connection refused: connect

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.PlainSocketImpl.doConnect(Unknown Source)

at java.net.PlainSocketImpl.connectToAddress(Unknown Source)

at java.net.PlainSocketImpl.connect(Unknown Source)

at java.net.Socket.<init>(Unknown Source)

at java.net.Socket.<init>(Unknown Source)

at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)

at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)

at sun.rmi.server.UnicastRef.newCall(Unknown Source)

at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

at java.rmi.Naming.lookup(Unknown Source)

at rmidemo.HelloApplet.init(HelloApplet.java:10)

at sun.applet.AppletPanel.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)



Tu me dis "De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ... "...euh..faudrait que j'écive quoi alors?????


Gaëlle
3
Salut,

Tu doit aller dans MSDOS
vas dans demrrer/excuter/et tape command puis click ok
pour aller à la racine tape cd.. quand tu est dans la racine
soit C:\tape edit autoexec.bat editeur apparait en bleu
et faut rajouter un ligne de code qui est :
path=C:\JDK ou SDK autre\bin puis enregistrer le fichier
et redamarrer l'ordinateur.

toto.java compiler avec javac.toto.java
pour le fichier class.

Joyeux noël et bonne année vlt
1
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
27 déc. 2003 à 09:28
Salut,

Est-ce que le serveur et le client sont une seule et même machine ?
Si non, le serveur est-il derrière un firewall ?

sfx
1
Bonjour..
Je croie que vous pouvais m'aider ..
Comment compiler un programme ecris en JAVA
Répondez moi SVP..
0
javac className.java
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut et merci à tous,

vlt, j'ai déjà ajouter les cmd java dans la variable d'environnement PATH. Pour "toto.java compiler avec javac.toto.java
pour le fichier class. " je ne vois pas le rapport.

sfx, le client et le serveur sont sur la même machine, mais le but de ce programme car c'est du java avec RMI c'est que n'importe quel client puisse y accéder .

idsp23, pour compiler un programme java, en ligne de commande tu tapes javac repertoireparent.nomduprogramme

Sinon est ce que quell'un a réussi à décoder la soluce de mon probleme que j'ai trouvé sur le net?

Gaëlle
1
Merci Daëlle pour ta réponse, j'ai trouvé dans jcreator l'option de compilation, mais voilà j'ai un message d'erreur qui me demande de créer d'abord le "JDK Profile" ..?
C quoi encore cela ?
Merci d'avance..
Idsp23
0
rameur Messages postés 135 Date d'inscription lundi 8 avril 2002 Statut Membre Dernière intervention 21 janvier 2009 21
27 déc. 2003 à 20:08
configurer les variables d env sous windows :
tu ouvres c:\autoexec.bat
tu ajoutes les lignes
set path = %path%;= $jdk_home$\bin
set classpath = $jdk_home$\lib\tools.jar;. ($jdk_home$=
rep ou java est installe et . le rep courant)
tu redemarre ensuite et maintenant tu peux compiler ou excuter tes classes a partir de n importe quel rep

pour compiler ton prg a partir de msdos tu te places dans le rep qui contient tes classes par ex toto.java et tu tapes
javac toto.java
pour executer
java toto (pas d extension !)
tu peux utiliser un editeur de texte comme textpad (fait 1 recherche sur le web)qui est gratuit et vachement pratique pour deboguer et executer tes prg (tu regardes dans le menu tools\run tu changes le rep courant et les champs adequats)
la ligne de commande est fastidieuse surtout quand tu fais trop d erreur
1
bonsoir tout le monde et merci pour toutes vos réponses,

mais jevais devoir recentrer le sujet...je n'ai pas de probleme de varaible d'environnement et ttou et tout.

je viens de créer mon 1er prog en java - rmi, point d'erreur à la compile ..mais une au lancement du serveur (tous les fichiers se trouvent sur la meme machine) :
java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

j'ai donc trouvé sur le net ce qui pourrait etre la solution mais du haut de mes 5 jours de java (c'est pour un projet pour mon école) je ne trouve pas ce que j'ai trouvé très claire..je demandais donc si quelqu'un saurait mexpliquer ce qui est dit dans le 1er msg de ce sujet en gras de façon claire. Si quelqu'un connait RMI (remote method invocation) merci de me faire un grand signe!! merci à tous et bisous

Gaëlle
1
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
28 déc. 2003 à 08:29
Salut,

Ton problème vient du security manager que tu as mis en place ...
Est-ce que tu lui précises quel fichier policy utiliser ? Pour être plus précis, est-ce que tu lui donne, dans ta ligne de commande, le fichier policy à utiliser ?
(tu as un mot clé à utiliser dans ta ligne de commande)

@+

sfx
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
28 déc. 2003 à 09:05
Salut,

Il faut rajouter, dans ta ligne de commande qui démarre ton serveur, le texte suivant :
-Djava.security.policy=<chemin relatif ou absolu de ton fichier java.policy>

@+

sfx
0
Salut,

merci à tous pour vos réponses, sfx je vais essayer ce que tu m'as dit ...idsp23 je ne connais pas la solution à ton problème...

Merci également à la personne (désolée j'ai oublié le pseudo) qui m'as mit un lien vers un problème similaire.

Je me penche dessus et je vous tiens au courant.

A bientot
Gaëlle
0
Re les jeunes,
alors voilà j'ai effectué quelques modifications en fonction de ce que j'ai trouvé sur Internet mais j'ai toujours un problème....

j'ai modifié le java.policy avec la ligne

permission java.net.SocketPermission "192.168.0.5:1024-", "listen,connect,resolve";

J'ai créé dans mon package le fichier SecurityManagerPermissif.java

package rmidemo

import java.rmi.*;
import java.security.*;

public class SecurityManagerPermissif extends RMISecurityManager {

public void checkPermission(Permission p) {
//ne fait rien
}
}

Je l'ai compilé sans difficulté.

Et j'ai modifié le main de mon fichier HelloImpl.java

public static void main(String args[])
{
if (System.getSecurityManager()== null) {
System.setSecurityManager(new SecurityManagerPermissif());
}
try{
HelloImpl obj = new HelloImpl("HelloServer");
Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
System.out.println("HelloServer enregistré dans le registry");
}
catch (Exception e){
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}


Quand je lance la commande:
java -Djava.security.policy=policy rmidemo.SecurityManagerPermissif
j'ai l'erreur suivante :

Exception in thread "main" java.lang.NoSuchMethodError: main

Je ne sais vraiment plus quoi faire...
Un coup de main serait vraiment le bienvenu

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
28 déc. 2003 à 17:06
Salut Gaelle,

La méthode main n'est pas dans ta classe SecurityManagerPermissif mais dans la classe HelloImpl ....

Tu dois donc executer le fichier rmidemo.HelloImpl et non SecurityManagerPermissif (qui est appelé par HelloImpl)

sfx
0
Re sfx, merci encore pour toutes réponses, ça me panique un peu moins , je me sens moins seule ;)

Alors j'ai donc éxecuter ceci

C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl

et voici l'erreur (nouvelle )

Exception in thread "main" java.lang.Error: ProblÞme de compilation non rÚsolu :

Erreur de syntaxe sur le mot clÚ "import"; ";" attendu

at rmidemo.SecurityManagerPermissif.<init>(SecurityManagerPermissif.java
:3)
at rmidemo.HelloImpl.main(HelloImpl.java:21)


pour la premier erreur à propos de import c'est bien rédigé je comprends pas, je te mets ci dessous le SecurityManagerPermissif

package rmidemo

import java.rmi.*;
import java.security.*;

public class SecurityManagerPermissif extends RMISecurityManager {

public void checkPermission(Permission p) {
//ne fait rien
}
}


Poiur l'autre erreur dans le main, il est dans mon msg précédent mais je vois pas non plus pourquoi ça coinceet ce qu'il faut faire.

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
28 déc. 2003 à 17:45
Salut,

Il faut un ';' à la fin de la ligne
package rmidemo

@+

sfx
0
Merci sfx ,

bon après avoir corrigé cette erreur, voilà on msg qui revient :

C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
HelloImpl err: Connection refused to host: 192.168.0.5; nested exception is:
java.net.ConnectException: Connection refused: connect
java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested excep
tion is:
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Unknown Source)
at rmidemo.HelloImpl.main(HelloImpl.java:25)


retour à la case départ on dirait! :(

Gaëlle
0
en tapant
java -Djava.security.policy=java.policy rmidemo.HelloImpl

la meme erreur qu'au msg ci-dessus... ;(

Merci pour ton attention sfx...je commence à désespérer là!

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
29 déc. 2003 à 08:48
Salut Gaelle,

Essaie de changer le numéro de port ... essaie avec 1099 ( les ports en dessous de 1024 posent un problème quelque fois ...)

sfx
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
29 déc. 2003 à 11:07
Resalut,

Tu peux aussi modifier ton fichier java.policy en mettant comme unique permission celle-ci :

grant {
permission java.security.AllPermission;
};

Ce qui donne tous les droits pour n'importe quel port ... c'est juste un test ... A ne surtout pas utiliser dans le cadre d'une appli réelle ... ;-))

@+

sfx
0
Salut,

ça fonctionne en faisaint tout passer par le port 1099, merci :)

Mais maintenant j'ai un autre problème, moi j'ai fait ça avec un applet mais en fait il faut un client applicatif tout court parce que le but c'est qu'à partir d'un autre poste et bien ça m'affiche Hello World...Je me mets sur le client de suite et je vous teins au courant, car je pense rencontrer (encore!!) des difficultées.

Gaëlle
0
Resalut,

voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

//HelloMain.java
//
package rmidemo;

import java.rmi.Naming;

public class HelloMain {
public static void main(String[] args) {
try {
Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
message = obj.sayHello();
System.out.println("Le message est: "+message);
} catch (Exception e) {
System.out.println("HelloMain exception: "+e.getMessage());
e.printStackTrace();
}
}

}


Les erreurs sont à aux lignes suivantes:

message = obj.sayHello();
System.out.println("Le message est: "+message);


on me dit que message ne peut pas être résolu :(

Gaëlle
0
Resalut,

voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

//HelloMain.java
//
package rmidemo;

import java.rmi.Naming;

public class HelloMain {
public static void main(String[] args) {
try {
Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
message = obj.sayHello();
System.out.println("Le message est: "+message);
} catch (Exception e) {
System.out.println("HelloMain exception: "+e.getMessage());
e.printStackTrace();
}
}

}


Les erreurs sont à aux lignes suivantes:

message = obj.sayHello();
System.out.println("Le message est: "+message);


on me dit que message ne peut pas être résolu :(

Gaëlle
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
29 déc. 2003 à 14:59
Salut,

Une bonne chose de faite ... Les ports en dessous de 1024 sont (en général) réservés pour d'autres protocoles et uniquement accessibles par des processus systèmes (sous Unix ... sous Windows, je suppose que c'est plus ou moins la même chose)
Peux-tu donner le message d'erreur (complet) que tu as maintenant ?

sfx
0
ça c'est parceque la vble message n'est pas déclarée d'avance
0
RE tout le monde et surtout toua sfx ;)

pour windows aussi les ports jusqu'à 1024 sont en général réservés mais je n'y avais pas pensé ;)

En fait, c'était une erreur , j'ai trouvé, il fgallait mettre
String message = obj.sayHello(); y'avait pas le String.

Par contre maintenant je sais pas comment me connecter avec le client...j'ai lancé le registry, le serveur tout passe..

mais alors et pour le client?? dans un premier temps à partir de mon poste où il y a le serveur qui tourne, et puis bien sur à partir d'un autre pc connecté sur le même Lan? Tu sais comment je dois faire?

Gaëlle
0
re,

en lançant le client comme ça ( à partir du pc où il y a tout)

C:\TEST>java rmidemo.HelloMain

voilà l'erreur :

HelloMain exception: null
java.lang.ArrayIndexOutOfBoundsException
at rmidemo.HelloMain.main(HelloMain.java:10)


Gaëlle
0
silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
29 déc. 2003 à 15:20
Salut Gaelle,

C'est normal ... tu dois donner en paramètre le serveur à contacter ... (c'est args[0] de ton client) ....

java demormi.HelloMain localhost
ou
java demormi.HelloMain 127.0.0.1

sfx
0