singlepost

Java RMI, error marshalling arguments << На главную или назад  

Задолбалась уже исправлять это, ничего не получается.
Значца, создаю соединение р2р, то есть без сервера и клиента.

String ip="129.241.121.35:1234";
String url = "rmi://"+ ip + "/motstander";

//ищем оппонента
public boolean lookup() throws RemoteException {
System.setSecurityManager(new LiberalSecurityManager());
try {
motstander = (TicTacToePlayer)Naming.lookup(url);
} catch (NotBoundException nbe) {
} catch (ConnectException ce) {
System.err.println(" ConnectException " +ip);
LocateRegistry.createRegistry(1234);
} catch (Exception e) {
System.err.println("Exception" + e.getMessage());
}

Открываю два GUI. (пользуюсь Эклипсом)
Первый выдает
error marshalling arguments; nested exception is:
java.io.NotSerializableException:

А второй -
ConnectException at 129.241.121.35:1234

По форумам говорят что пробелы где-то в именах папок (проверяла – нету)
Про connectException говорят что порт надо другой ставить. Даже РМИ порт по умолчанию выдает то же самое. Что с этим делать?

52 ответов в теме “Java RMI, error marshalling arguments”

  1. 16
    Алина Isaksen ответил:

    мм.. попробую исправить…

    знаете, если бы это была моя инициатива, я бы делала сервер-клиент. Но тогда меня все равно отправят это в один класс переписывать ))

    спасибо!

  2. 15
    Алина Isaksen ответил:

    я ж выше писала… у меня р2р, у меня нет классов клиент-сервер. Весь код лежит в одном классе TicTacToePlayerImp (ну и плюс GUI). То есть система что-то вроде того, что если р1 делает что-то в интерфейсе (например ставит галочку), то посылает эту самую галочку р2, у того обновляется интерфейс и т.д.

    соответственно урл один, в нем прописан мой ай-пи.

    motstander = opponent, когда так называемый "сервер" находит оппонента, он указывает что тот motstander. Соответственно оппонент так же указывает "сервер", как motstander. Ну и получается что-то типа р2р, без сервера и клиента. Любое действие приходится сначала рассматривать со стороны р1, потом "переворачивать" все и рассматривать с точки р2, там все симметрично

  3. 14
    Константин Конашенков ответил:

    Ну так Вы делаете неправильно !
    когда биндите надо использовать имя к примеру sti
    bind(sti,motstande);

    когда лукапите lookup("rmi://129.241.121.35:1234/sti")

    А вот насчет того что все в одном классе вариться – меня это смущает, очень сильно. И зачем лукапить если у вас ссылка есть ??? Зачем вообще rmi юзать ??

  4. 13
    Алина Isaksen ответил:

    public boolean lookup() throws RemoteException {
    System.setSecurityManager(new LiberalSecurityManager());
    try {
    motstander = (TicTacToePlayer)Naming.lookup(url);
    }

    в смысле сложное имя? motstander?

  5. 12
    Константин Конашенков ответил:

    Я делал одно время прогу на rmi.И что то не понимаю как у вас происходит.

    В классе на сервере
    TicTacToePlayerImp server;
    String url = "rmi://"+ ip + "/motstander";
    public void opponentWait() throws RemoteException {
    System.setSecurityManager( new LiberalSecurityManager() );
    try {
    Naming.rebind(url, server);

    в клиенте
    motstander = (TicTacToePlayer)Naming.lookup(url);

    Так ? В разных классах ? Значение Urlкакое в клиентском классе ?
    lookup.("rmi://"+ip address/+имя в вашем случае url – тоесть- "rmi://"+ ip + "/motstander")

  6. 11
    Константин Конашенков ответил:

    Зачем использовать такое сложное имя ?
    url = "rmi://"+ ip + "/motstander";

    Код лукапа в клиенте

  7. 10
    Константин Конашенков ответил:

    вопрос 1. Какой объект реализует удаленный интерфейс ?

  8. 9
    Алина Isaksen ответил:

    TicTacToePlayerImpmotstander

  9. 8
    Константин Конашенков ответил:

    В студию строку где вы делаете bind

  10. 7
    Алина Isaksen ответил:

    TicTacToePlayerImp server;
    String url = "rmi://"+ ip + "/motstander";

    public void opponentWait() throws RemoteException {
    System.setSecurityManager( new LiberalSecurityManager() );
    try {
    Naming.rebind(url, server);

  11. 6
    Алина Isaksen ответил:

    он ругается на конструктор java.io.NotSerializableException: TicTacToePlayerImp у которого входящие параметры String name, String ip, TicTacToeGui gui.

    сервером становится тот кто ждет оппонента.

    Я может туплю сильно, но по-русски мне вообще тяжко соображать, давно в России не живу…сори :/

  12. 5
    Константин Конашенков ответил:

    Автор поста читай внимательно.
    1. Тебесказали что ты вызывая какой то метод получаешь эксепшен ( error marshalling arguments). Он значит что не получилось с помощью JAXB сериализовать объект. Вопрос что вы передаете в виде параметра или возвращаемого значения ??

    2. Запуск сервера ? Как именно ???

  13. 4
    Алина Isaksen ответил:

    main лежит в GUI классе
    public static void main(String args[]) throws IOException {
    String ip = "127.0.0.1";
    if (args!=null && args.length >0) {
    ip = args[0];
    }
    TicTacToeGui hisGui = new TicTacToeGui(name, ip);
    }
    Стартует GUI, рисует программу и в конце конструктора создает первого пользователя:
    try {
    player = new TicTacToePlayerImp(myName,ip ,this);
    }

    Конструктор TicTacToePlayerImp создает польз., смотрит,есть ли оппонент. Если нет, то использует тот код из первого сообщения

  14. 3
    Константин Конашенков ответил:

    Rmiипросто p-2-p , это вообще совестимо ? Мне казалось что это клиент серверное приложение может быть. То-есть стартуем рмай реестр, стартуем сервак , с указанием файла политик (в нем bindобъекта).

    А если хотите точка – точка – не проще ли вам использовать сокеты ?

  15. 2
    Александр Чигринец ответил:

    Вообще, исключение говорит о том, что один объект пытается передать другому что-то, что не имплементирует Serializable.Без кода самих RMI объектов это понять сложно.

  16. 1
    Константин Конашенков ответил:

    + Код запуска , точнее как вы стартуете ?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.