новый для параллельных/распределенных вычислений и проблем с клиент-серверной программой, которую я пытаюсь написать. Предполагается, что сервер получит целое число от клиента и отправит обратно сумму всех номеров, которые приводят к ней (например, пользователь вводит 5, сервер вычисляет 1 + 2 + 3 + 4 + 5, сервер отправляет обратно 15). Я все еще пытаюсь понять это, поэтому я жестко закодировал ввод на стороне клиента.Java, отказывающийся от доступа к разрешениям на свойства
Это то, что я на стороне сервера:
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");
} }
И я реализовал интерфейс на стороне клиента, а также.
ошибка, которую я получаю на стороне клиента является:
Исключение в потоке «главный» java.security.AccessControlException: доступ запрещен («java.util.PropertyPermission» «java.net .preferIPv4Stack» "запись") на java.security.AccessControlContext.checkPermission (AccessControlContext.java:472) на java.security.AccessController.checkPermission (AccessController.java:884) в 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");
Кто есть опыт устранение неисправностей этой ошибки?
Спасибо!
Спасибо за супер быстрый ответ. Я попытался установить системное свойство перед менеджером безопасности и получил исключение AccessControlException, отказав разрешения сокета. Когда я взял менеджера безопасности полностью, я получил исключение UnmarshalException, указывающее на интерфейс. Но я не могу добавить менеджера безопасности в интерфейс, не так ли? Добавление его не будет компилироваться. – bluebrooklynbrim
Это означает, что вы не разложили класс интерфейса в RMI Registry CLASSPATH или на клиентский сервер, в зависимости от того, когда именно вы получили исключение. – EJP