Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI error unmarshalling return; NotSerializableException / 17 сообщений из 17, страница 1 из 1
08.12.2015, 09:36
    #39122860
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Запустил серверную часть RMI.
Сделал клиента (куда прописал сам вызов и интерфейс как заглушку).

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

Если пытаться достучаться с другой машины, падает на:
Код: java
1.
MyRequest c = (MyRequest) Naming.lookup("rmi://111.111.111.111:2099/RemoteService");


(адрес, порт верные (хотя здесь адрес приведен условно), имя сервиса тоже ну и вообще разница только в том, что запуск с другой машины)
Ошибка:
Код: java
1.
2.
3.
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.tst.rmi.RemoteServiceImpl
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)



Есть версия, что надо все-таки на другой машине как-то подтянуть заглушку?
Ну вроде сделал stub, положил этот класс в классы клиентского проекта, но ничего не изменилось, может в проекте нетбинза надо еще как-то явно прицепить эту заглушку к проекту, если вообще в этом дело?
...
Рейтинг: 0 / 0
08.12.2015, 09:50
    #39122880
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
JDS,

Код: java
1.
2.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new org.tst.rmi.RemoteServiceImpl());
registry.rebind("TestService", rsstub);
...
Рейтинг: 0 / 0
08.12.2015, 10:22
    #39122911
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
0FD , изначально "сервер" так и пытался делать, но не вышло - сейчас например если так написать, ругается
Код: java
1.
2.
Exception in thread "main" java.lang.SecurityException: sealing violation: package org.tst.rmi is sealed
	at java.net.URLClassLoader.getAndVerifyPackage(URLClassLoader.java:388)


Поэтому в итоге написал без UnicastRemoteObject.exportObject, просто rebind new RemoteServiceImpl, но видимо, все-таки надо exportObject - это наверно, как выставить наружу скелет класса на приемнике.
По sealing violation нашел только такое
Прописал в манифест проекта в нетбинзе:
Name: org.tst.rmi
Sealed: false
Ошибка осталась.
Где-то еще встречал вариант с неким SecurityManagerom, может оно, но не найду теперь.
...
Рейтинг: 0 / 0
08.12.2015, 10:41
    #39122924
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Пишут еще:
A sealing violation means that some classes from a sealed package were loaded from two different locations (directories or jar files).

A sealed package is one that essentially says "I know that all classes in this package come from a single jar file. For security reason no other location may provide classes that are in this package".

Chances are you have two Oracle JDBC driver jars in your classpath

Что-то вроде все классы в пакете должны быть из одного jar-а, но суть все равно не ясна. При чем тут безопасность, мы ж берем вполне конкретный класс проекта? :/
...
Рейтинг: 0 / 0
08.12.2015, 11:14
    #39122964
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
JDS,

Чтобы запретить доступ к членам класс у которых доступ на уровне пакета, для этого sealed и нужен. Кто-то написал класс
pkg1.Clazz{static int i;}, а поместив свой класс в пакет pkg1 вы уже имеет доступ к i, а с sealed=true уже нельзя.
...
Рейтинг: 0 / 0
08.12.2015, 11:44
    #39123019
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
1. Кинь под спойлер весь исходный код.
2.
Что про секьюрити менеджер говорит в туториале:

https://docs.oracle.com/javase/tutorial/rmi/implementing.html

Creating and Installing a Security Manager

The main method's first task is to create and install a security manager, which protects access to system resources from untrusted downloaded code running within the Java virtual machine. A security manager determines whether downloaded code has access to the local file system or can perform any other privileged operations.

If an RMI program does not install a security manager, RMI will not download classes (other than from the local class path) for objects received as arguments or return values of remote method invocations. This restriction ensures that the operations performed by downloaded code are subject to a security policy.

Here's the code that creates and installs a security manager:

if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
...
Рейтинг: 0 / 0
08.12.2015, 12:03
    #39123056
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Чтобы запретить доступ к членам класса, у которых доступ на уровне пакета
Т.е. в пакет входит кучка классов с методами объявленными как: public со static и просто.
Нам надо выставить для пакета sealed=true, чтобы если кто-то как-то добавит в наш пакет свой класс, у него бы не было возможности достать public-методы классов, которые уже были там ранее?
Механизм не понятен пока, но как в нетбинзе выставить этот sealed=true? Руками в манифесте?
Пробовал прописать в manifest.mf проекта:
Name: org\tst\rmi\
Sealed: true
не решило. Или надо создать отдельный файл в src проекта?
...
Рейтинг: 0 / 0
08.12.2015, 12:22
    #39123077
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
JDS,

Я про publiс ничего не говорил, только про protected и без модификатора.
Дайте код и как разбито по проектам.
В одном месте Name: org.tst.rmi, в другом Name: org\tst\rmi\, но кажется должно быть Name: org/tst/rmi/ и Sealed: false
...
Рейтинг: 0 / 0
08.12.2015, 12:23
    #39123078
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Leonid KudryavtsevЧто про секьюрити менеджер говорит в туториале
Спасибо. Попробовал запустить, как описано там в примере, просто дописав:
Код: java
1.
2.
3.
if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }


В итоге получилась процедура регистрации:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...  {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }

        Registry registry = LocateRegistry.createRegistry(2099);
        
        RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl(), 1);
        registry.rebind(SERVICE_NAME, rsstub);
        System.out.println("Service started.");
}


И теперь ошибка другая на той же строке:
Код: java
1.
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1" "listen,resolve")


Нужно еще давать права какие-то? Ничего не ясно. Как вообще работал тогда "клиент", кот. запускался на этой же машине )
...
Рейтинг: 0 / 0
08.12.2015, 12:34
    #39123097
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Точно, туплю.
Код: java
1.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl(), 1);


Просто:
Код: java
1.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl());



Запустился.

Но теперь при запросе с клиента тоже ругается на java.net.SocketPermission
...
Рейтинг: 0 / 0
08.12.2015, 12:49
    #39123116
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
JDS...И теперь ошибка другая на той же строке
на следующей, на rebind.
У меня так же. т.ч. я тоже без сеьюрити

Сейчас сам с RMI занимаюсь... До этого на одной машинке игрался, сейчас пытаюсь на Amazon EC2 порты для RMI в I-net открыть, пока не получается (((
...
Рейтинг: 0 / 0
08.12.2015, 12:57
    #39123123
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Leonid Kudryavtsev , теперь убрал из кода запуска "сервера" инициализацию SecurityManager и теперь тоже нормально запускается, уже не ругаясь package org.tst.rmi is sealed и на клиенте на пемишн теперь тоже не ругается, теперь ругается на заглушку или что там еще:
Код: java
1.
Exception in thread "main" java.lang.AbstractMethodError: org.tst.rmi.RemoteServiceImpl_Stub.runTask(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;


Т.е. ругается уже на вызов метода, коннект прошел.
Про SecurityManager так и не ясно что это было.
...
Рейтинг: 0 / 0
08.12.2015, 13:32
    #39123179
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Пробился через Internet... полет нормальный. Без секьюрити. Никаких ошибок. Что на одном хосте, что на разных.

Как пробивался:
1. Открыл порт для RMI регистри (у меня 7000) и порты для RMI классов-серверов (у меня 7001-....) для доступа извне через Amazon EC2 Console
2. Т.к. на сервере у Amazon EC2 два IP адреса:
внутренний (собственно адрес сервера)
внешний статический IP адрес Amazon Elastic IPs
То, что бы клиент правильно лез на внешний IP адрес, пришлось сделать финт ушами и создать классы ServerSocketFactory (просто заглушка) и ClientSocketFactory.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;

public class ClientSocketFactory implements RMIClientSocketFactory, Serializable {

	@Override
	public Socket createSocket(String host, int port) throws IOException {
		// TODO Auto-generated method stub
		System.out.println( "ClientSocketFactory host="+host+" port="+port );		
		System.out.println( "Rewrite host to <my external ip censored>" );
		host = "<my external ip censored>";
		return new Socket( host, port );
	}
}



3. Создаю личную registry и регистрирую класс в ней

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	public void register() throws RemoteException, AlreadyBoundException {
		ServerSocketFactory ssf;
		ClientSocketFactory csf;
		ssf = new ServerSocketFactory ();
		csf = new ClientSocketFactory();
		I_GF_Host stub = (I_GF_Host)UnicastRemoteObject.exportObject(
			this, 
			DISPATCHER_REGISTER_PORT+1,
			csf,
			ssf
			);
		
		Registry registry = LocateRegistry.createRegistry( DISPATCHER_REGISTER_PORT );
		registry.bind( "I_GF_Host", stub );
	}



4. Получаю его на клиенте

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
System.out.println( "Connect to "+ DISPATCHER_REGISTER_PORT);	            
	            Registry registry = LocateRegistry.getRegistry(
"<my external IP censored>",
DISPATCHER_REGISTER_PORT
);
System.out.println( "getRegistry OK");	            
	            I_GF_Host host = (I_GF_Host) registry.lookup( "I_GF_Host" );
System.out.println( "lookup OK");	            
	            host.test();
System.out.println( "Test OK" );
	            //
	            RD_Request rd;
	            RD_RequestPacket packet;
	            packet = new RD_RequestPacket();
	            packet.arr = new RD_Request[3];
	            packet.arr[ 0 ] = new RD_Request();
	            packet.arr[ 1 ] = new RD_Request();
	            packet.arr[ 2 ] = new RD_Request();
	            
	            packet.arr[ 0 ].request = "Request 1...";
	            packet.arr[ 1 ].request = "Request 2...";
	            packet.arr[ 2 ].request = "Request 3...";
	            host.doRequests( packet );
	            System.out.println( "doRequests OK" );




И все работает. Никаких секьюрити менеджеров
...
Рейтинг: 0 / 0
08.12.2015, 13:38
    #39123188
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
JDSjava.io.NotSerializableException

Ты уверен, что у тебя все классы которые ты передаешь в remote объявлены как:

class MyClass implements java.io.Serializable {
...
}

Ошибка выглядит совершенно банальной: не смог сделать marshal'инг объекта, т.к. он NotSerializable.
...
Рейтинг: 0 / 0
08.12.2015, 13:57
    #39123207
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Если есть не null ссылка на объект (если null то ошибок нет) и класс объекта не Serializable, то получаю ошибку:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
	java.io.NotSerializableException: <MY CLASS NAME>
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:158)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
	at com.sun.proxy.$Proxy0.doRequests(Unknown Source)
        <censored>
Caused by: java.io.NotSerializableException: <MY CLASS NAME>
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:294)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:153)
	... 4 more


...
Рейтинг: 0 / 0
08.12.2015, 16:45
    #39123429
JDS
JDS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Leonid Kudryavtsev , это читал и изначально сделал класс с имплементом Serializable.
В конечном итоге все получилось (опять))), когда по-человечески сгенерил заглушку с помощью rmic,
указал -classpath и -d (куда класть).
Потом получившиеся класс *Impl, интерфес и заглушки положил в классы проекта клиента на другой машине и все пошло.
Возможно, дело в том, что ранее до меня rmic-ом была сгенерирована заглушка класса того же имени, что создал я, поэтому когда генерил заглушку почему-то подхватывался старый класс. В общем темные пятна еще остались, но немного лучше )
Надо теперь научиться как в нетбинзе несколько классов проекта засунуть в отдельный Jar, если это вообще реально )
...
Рейтинг: 0 / 0
08.12.2015, 17:20
    #39123485
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI error unmarshalling return; NotSerializableException
Я заглушки не генерю (и генерить не буду). Мне RMI нужен просто как связь между различными JVM (в дальнейшем серверами). Т.ч. все классы проекта будут доступны на всех машинах - не жалко )))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI error unmarshalling return; NotSerializableException / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]