2010-11-12 19 views
3

J'ai un client et un programme serveur qui tentent de communiquer les uns avec les autres. Dans mon fichier de stratégie pour le serveur, je l'ai indiqué ce qui suit:Java SocketPermission question de politique

grant signedBy "vivin" { 
    permission java.io.FilePermission "-", "read, write"; 
    permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin"; 
}; 

Et dans la politique dossier de mon client, j'ai:

grant signedBy "vivin" { 
    permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin"; 
}; 

je démarre mon serveur et il écoute sur le port 2225. Je puis commencer mon client et il essaie de se connecter au serveur qui est à l'écoute sur le port 2225. Malheureusement, je reçois cette erreur sur le serveur:

[java] Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:45944 accept,resolve) 
[java] at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
[java] at java.security.AccessController.checkPermission(AccessController.java:546) 
[java] at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
[java] at java.lang.SecurityManager.checkAccept(SecurityManager.java:1157) 
[java] at java.net.ServerSocket.implAccept(ServerSocket.java:457) 
[java] at java.net.ServerSocket.accept(ServerSocket.java:421) 

le numéro de port ne cesse de changer; Je suppose que c'est le numéro de port pour le client (où le serveur se connecte au client?). Est-ce exact? Pour cette mission, il y a une restriction spécifiée sur les numéros de port:

Votre client et le serveur doivent utiliser le gestionnaire de sécurité Java, et votre projet doit inclure des fichiers de stratégie pour chaque qui définit les autorisations nécessaires à leur exécution. Autorisez votre serveur et votre client à se contacter sur localhost en utilisant les ports de la plage 2220-2230.

Comment puis-je respecter cette restriction? Ou est-ce que cela ne s'applique qu'au port sur lequel le serveur écoute? Je me dis que je peux le faire fonctionner si je donne accept et resolve autorisations pour les ports supérieurs à 2231. Mais je ne sais pas si cela va à l'encontre de la restriction.

Répondre

5

Parce que le client choisit son port tcp locale au hasard (je suppose), vous devez lui donner l'autorisation appropriée:

grant signedBy "vivin" { 
    permission java.net.SocketPermission "localhost:1024-", "connect, resolve", signedBy "vivin"; 
}; 

Le client n'écoute pour les connexions entrantes et n'a pas besoin des autorisations pour « écouter » et "accepter". Sur le serveur, vous pouvez probablement supprimer l'autorisation pour "connecter" tant que le serveur n'effectue pas de connexion TCP sortante.

+0

Oui, c'est à peu près le chemin que j'ai pris. Merci! Je suppose qu'il n'y a pas moyen de contourner cela alors. –

+0

La plage de ports éphémères peut également être spécifiée avec 0 (par exemple, localhost: 0) –