3

相互に通信しようとするクライアントプログラムとサーバープログラムがあります。サーバーのポリシーファイルで、次のように指定しました。

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の範囲のポートを使用してローカルホスト上で相互に接続できるようにします。

この制限をどのように順守できますか?または、これはサーバーがリッスンするポートにのみ適用されますか?accept2231を超えるポートにパーミッションを付与すれば、それを機能させることができると思いresolveます。しかし、それが制限に違反しているかどうかはわかりません。

4

1 に答える 1

5

クライアントはローカルのtcpポートをランダムに選択するため(おそらく)、適切なアクセス許可を与える必要があります。

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

クライアントは着信接続をリッスンしておらず、「リッスン」および「アクセプト」の権限は必要ありません。サーバーでは、サーバーが発信tcp接続を行っていない限り、「接続」のアクセス許可を取り消すことができます。

于 2010-11-12T15:46:16.447 に答える