Задолбалась уже исправлять это, ничего не получается.
Значца, создаю соединение р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 говорят что порт надо другой ставить. Даже РМИ порт по умолчанию выдает то же самое. Что с этим делать?
1 марта 2010 в 21:03
мм.. попробую исправить…
знаете, если бы это была моя инициатива, я бы делала сервер-клиент. Но тогда меня все равно отправят это в один класс переписывать ))
спасибо!
1 марта 2010 в 21:02
я ж выше писала… у меня р2р, у меня нет классов клиент-сервер. Весь код лежит в одном классе TicTacToePlayerImp (ну и плюс GUI). То есть система что-то вроде того, что если р1 делает что-то в интерфейсе (например ставит галочку), то посылает эту самую галочку р2, у того обновляется интерфейс и т.д.
соответственно урл один, в нем прописан мой ай-пи.
motstander = opponent, когда так называемый "сервер" находит оппонента, он указывает что тот motstander. Соответственно оппонент так же указывает "сервер", как motstander. Ну и получается что-то типа р2р, без сервера и клиента. Любое действие приходится сначала рассматривать со стороны р1, потом "переворачивать" все и рассматривать с точки р2, там все симметрично
1 марта 2010 в 21:02
Ну так Вы делаете неправильно !
когда биндите надо использовать имя к примеру sti
bind(sti,motstande);
когда лукапите lookup("rmi://129.241.121.35:1234/sti")
А вот насчет того что все в одном классе вариться – меня это смущает, очень сильно. И зачем лукапить если у вас ссылка есть ??? Зачем вообще rmi юзать ??
1 марта 2010 в 21:01
public boolean lookup() throws RemoteException {
System.setSecurityManager(new LiberalSecurityManager());
try {
motstander = (TicTacToePlayer)Naming.lookup(url);
}
в смысле сложное имя? motstander?
1 марта 2010 в 21:01
Я делал одно время прогу на 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")
1 марта 2010 в 21:00
Зачем использовать такое сложное имя ?
url = "rmi://"+ ip + "/motstander";
Код лукапа в клиенте
1 марта 2010 в 20:05
вопрос 1. Какой объект реализует удаленный интерфейс ?
1 марта 2010 в 20:05
TicTacToePlayerImpmotstander
1 марта 2010 в 20:05
В студию строку где вы делаете bind
1 марта 2010 в 20:05
TicTacToePlayerImp server;
String url = "rmi://"+ ip + "/motstander";
public void opponentWait() throws RemoteException {
System.setSecurityManager( new LiberalSecurityManager() );
try {
Naming.rebind(url, server);
1 марта 2010 в 20:04
он ругается на конструктор java.io.NotSerializableException: TicTacToePlayerImp у которого входящие параметры String name, String ip, TicTacToeGui gui.
сервером становится тот кто ждет оппонента.
Я может туплю сильно, но по-русски мне вообще тяжко соображать, давно в России не живу…сори :/
1 марта 2010 в 20:03
Автор поста читай внимательно.
1. Тебесказали что ты вызывая какой то метод получаешь эксепшен ( error marshalling arguments). Он значит что не получилось с помощью JAXB сериализовать объект. Вопрос что вы передаете в виде параметра или возвращаемого значения ??
2. Запуск сервера ? Как именно ???
1 марта 2010 в 20:02
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 создает польз., смотрит,есть ли оппонент. Если нет, то использует тот код из первого сообщения
1 марта 2010 в 20:00
Rmiипросто p-2-p , это вообще совестимо ? Мне казалось что это клиент серверное приложение может быть. То-есть стартуем рмай реестр, стартуем сервак , с указанием файла политик (в нем bindобъекта).
А если хотите точка – точка – не проще ли вам использовать сокеты ?
1 марта 2010 в 20:00
Вообще, исключение говорит о том, что один объект пытается передать другому что-то, что не имплементирует Serializable.Без кода самих RMI объектов это понять сложно.
1 марта 2010 в 20:00
+ Код запуска , точнее как вы стартуете ?