1

новый для параллельных/распределенных вычислений и проблем с клиент-серверной программой, которую я пытаюсь написать. Предполагается, что сервер получит целое число от клиента и отправит обратно сумму всех номеров, которые приводят к ней (например, пользователь вводит 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"); 

Кто есть опыт устранение неисправностей этой ошибки?

Спасибо!

ответ

2

Проблема в том, что вы установили менеджера безопасности для всего (клиентского) приложения, которое не позволит вам изменять свойства системы.

Простым решением является установка системных свойств, которые необходимо установить перед установкой диспетчера безопасности RMI.

Кроме того, вы можете полностью избавиться от звонка System.setSecurityManager(...). Вы (возможно) нуждаетесь только в этом, если хотите, чтобы клиент мог загружать классы из вашей службы RMI.


Я попытался установить свойство системы перед менеджером безопасности и получил AccessControlException, отрицая разрешения сокетов.

Это не имеет смысла. Вы получили бы только AccessControlException, если бы там был менеджер безопасности. Там не должно быть ... если это не код апплета или аналогичный, запущенный в веб-браузере. Кроме того, я не знаю, почему в вызове установить свойство будет отказано в том, что у вас нет разрешений сокета.

Когда я взял менеджера безопасности полностью, я получил исключение UnmarshalException, указывающее на интерфейс.

Вам также необходимо добавить классы/интерфейсы для объектов, которые tou будет развязать с клиентским классом классов.


На самом деле, я только что заметил, что javadoc для RMISecurityManager говорит:

"RMISecurityManager реализует политику, идентичную политики, проводимой SecurityManagerRMI приложения должны использовать SecurityManager класс или другой соответствующий SecurityManager. вместо этого класса. "

+0

Спасибо за супер быстрый ответ. Я попытался установить системное свойство перед менеджером безопасности и получил исключение AccessControlException, отказав разрешения сокета. Когда я взял менеджера безопасности полностью, я получил исключение UnmarshalException, указывающее на интерфейс. Но я не могу добавить менеджера безопасности в интерфейс, не так ли? Добавление его не будет компилироваться. – bluebrooklynbrim

+0

Это означает, что вы не разложили класс интерфейса в RMI Registry CLASSPATH или на клиентский сервер, в зависимости от того, когда именно вы получили исключение. – EJP