gpt4 book ai didi

Java拒绝访问属性权限

转载 作者:行者123 更新时间:2023-11-30 02:47:03 25 4
gpt4 key购买 nike

并行/分布式计算新手,并且我正在尝试编写的客户端-服务器程序存在问题。应该发生的情况是,服务器从客户端接收一个整数,然后发回该整数之前的所有数字的总和(例如,用户输入 5,服务器计算 1+2+3+4+5,服务器发回 15)。我仍在尝试解决这个问题,因此我在客户端对输入进行了硬编码。

这是我在服务器端的内容:

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
import java.util.*;
public class Server {

public static void main(String[]args) {

try{
int port = 16790;
String host = "localhost";
CalculateSumServerImpl export = new CalculateSumServerImpl();
LocateRegistry.createRegistry(port);
String registryURL = "rmi://" + host + ":" + port + "/sum";
Naming.rebind(registryURL, export);
System.out.println("Server ready");
} catch (Exception e) {
e.printStackTrace();
}
} }


//to calculate the sum
import java.rmi.*;
import java.rmi.server.*;

public class CalculateSumServerImpl extends UnicastRemoteObject implements CalServerInterface {

public int n; //value entered
public int sum; //sum

protected CalculateSumServerImpl() throws RemoteException {
super();
}

@Override
public int calculateSum(int n) throws RemoteException {

n = (n*(n+1))/2; //sum of 1 + 2 + 3 + .. + n

sum = n;

return sum;
} }

//interface
import java.rmi.Remote;

public interface CalServerInterface extends Remote {

public int calculateSum(int n ) throws java.rmi.RemoteException;
}

在客户端:

import java.rmi.*;
import java.util.PropertyPermission;

public class Client {
public static void main(String[]args) {

System.setSecurityManager(new java.rmi.RMISecurityManager());
System.setProperty("java.net.preferIPv4Stack" , "true");

try {
int port = 16790;
String host = "localhost";
String registryURL = "rmi://" + host + ":" + port + "/sum";

Project4ServerInterface obj = (Project4ServerInterface)Naming.lookup(registryURL);
System.out.println("Lookup completed.");

int output = obj.calculateSum(3);
System.out.println("Sum is: " + output);

} catch (Exception e) {
e.printStackTrace();
}

System.setProperty("java.net.preferIPv4Stack","true");

} }

我也在客户端实现了该接口(interface)。

我在客户端遇到的错误是:

Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.net.preferIPv4Stack" "write") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.System.setProperty(System.java:792) at project04client.Client.main(Client.java:10)

错误指向包含以下代码的行:

System.setProperty("java.net.preferIPv4Stack" , "true");

有人有解决此错误的经验吗?

谢谢!

最佳答案

问题是您为整个(客户端)应用程序设置了一个安全管理器,不允许您修改系统属性。

简单的修复方法是在设置 RMI 安全管理器之前设置需要设置的系统属性。

或者,您可以完全摆脱 System.setSecurityManager(...) 调用。您(可能)仅当您希望客户端能够从 RMI 服务下载类时才需要它。

<小时/>

I tried setting the system property before the security manager and got an AccessControlException, denying socket permissions.

这没有多大意义。如果此时存在安全管理器,您只会收到 AccessControlException。不应该...除非这是在网络浏览器中启动的小程序代码或类似代码。另外,我不知道为什么设置属性的调用会被拒绝,说您没有套接字权限。

When I took the security manager out completely, I got an UnmarshalException pointing to the interface.

您还需要添加要解码到客户端类路径的对象的类/接口(interface)。

<小时/>

实际上,我刚刚注意到 javadoc对于 RMISecurityManager 说:

"RMISecurityManager implements a policy identical to the policy implemented by SecurityManager. RMI applications should use the SecurityManager class or another appropriate SecurityManager implementation instead of this class."

关于Java拒绝访问属性权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com