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)

端口号不断变化;我假设它是客户端的端口号(服务器连接回客户端的位置?)。那是对的吗?对于此分配,对端口号指定了限制:

您的客户端和服务器应该使用 Java 安全管理器,并且您的项目必须为每个定义了运行所需权限的策略文件。允许您的服务器和客户端使用2220-2230范围内的端口在 localhost 上相互联系。

我怎样才能遵守这个限制?还是这仅适用于服务器侦听的端口?我想如果我给予大于 2231 的端口的权限,我可以让它工作。但我不知道这是否违反了accept限制。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 回答