我有一个尝试相互通信的客户端和服务器程序。在我的服务器的策略文件中,我指定了以下内容:
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
权限,我可以使它工作。但我不知道是否违反了限制。
答案 0 :(得分:5)
因为客户端随机选择了本地tcp端口(我猜)你应该给它适当的权限:
grant signedBy "vivin" {
permission java.net.SocketPermission "localhost:1024-", "connect, resolve", signedBy "vivin";
};
客户端没有侦听传入连接,也不需要“listen”和“accept”的权限。在服务器上,只要服务器没有进行传出tcp连接,您就可以删除“connect”权限。