相互に通信しようとするクライアントプログラムとサーバープログラムがあります。サーバーのポリシーファイルで、次のように指定しました。
grant signedBy "vivin" {
permission java.io.FilePermission "-", "read, write";
permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};
そして、私のクライアントのポリシーファイルには次のものがあります。
grant signedBy "vivin" {
permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};
サーバーを起動すると、ポート2225でリッスンします。次に、クライアントを起動すると、ポート2225でリッスンしているサーバーに接続しようとします。残念ながら、サーバーで次のエラーが発生します。
[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)
ポート番号は変化し続けます。これはクライアントのポート番号(サーバーがクライアントに接続する場所)であると想定しています。あれは正しいですか?この割り当てでは、ポート番号に制限が指定されています。
クライアントとサーバーはJavaSecurityManagerを使用する必要があり、プロジェクトには、実行に必要な権限を定義するそれぞれのポリシーファイルが含まれている必要があります。サーバーとクライアントが、 2220〜2230の範囲のポートを使用してローカルホスト上で相互に接続できるようにします。
この制限をどのように順守できますか?または、これはサーバーがリッスンするポートにのみ適用されますか?accept
2231を超えるポートにパーミッションを付与すれば、それを機能させることができると思いresolve
ます。しかし、それが制限に違反しているかどうかはわかりません。