Я только запускаю Java RMI, и у меня возникают некоторые проблемы с тем, когда использовать java.io.Serializable, поэтому кто-нибудь может дать мне пример RMI, в котором должен быть реализован java.io.Serializable.
Спасибо !!!
ОБНОВИТЬ:
я сделал простой пример, однако, я думаю, что все еще есть проблемы, поскольку вывод не верен.
Персональный интерфейс
пакетный сервер;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public interface PersonInterface extends Remote
{
public void setName(String name) throws RemoteException;
public String getPerson() throws RemoteException;
public void setAddress(Address address) throws RemoteException;
}
Персона реализации
package server;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.rmi.Naming;
import java.rmi.Remote;
class Person extends UnicastRemoteObject implements PersonInterface
{
private String name;
private int age;
private Address address;
Person() throws RemoteException {super();}
Person(String name,int age, Address address) throws RemoteException {
this.name = name;
this.age = age;
this.address = address;
}
public void setName(String name) throws RemoteException {
this.name = name;
}
public void setAddress(Address address) throws RemoteException{
this.address = address;
}
public String getPerson() throws RemoteException {
return "Person : " + name + " age : " + age + " address : " + address;
}
}
Адрес класса
package server;
import java.io.Serializable;
public class Address implements Serializable
{
private static final long serialVersionUID = 227L;
private String addre1;
private String addre2;
public Address() {}
public Address(String addre1,String addre2){
this.addre1 = addre1;
this.addre2 = addre2;
}
}
Сервер
package server;
import java.rmi.Naming;
class Server
{
public static void main(String[] args)
{
try{
//create an instance of the RemoteDatabaseServer
Person person = new Person();
//rmi://[host][:port]/object
String namePerson = "rmi://localhost:9999/person";
//bind this instance to localhost port999 with name database
Naming.bind(namePerson, person);
System.out.println("Server is running...");
}catch(Exception ex){
System.out.println("Server Exception...");
ex.printStackTrace();
}
}
}
Клиент
package client;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import server.PersonInterface;
import server.Address;
class Client
{
public static void main(String[] args)
{
try{
System.setSecurityManager(new RMISecurityManager());
String namePerson = "rmi://localhost:9999/person";
PersonInterface person =
(PersonInterface)Naming.lookup(namePerson);
person.setName("myName");
System.out.println(person.getPerson());
person.setName("myNewName");
Address address = new Address("123","123");
person.setAddress(address);
System.out.println(person.getPerson());
}catch(Exception ex){
System.out.println("Client failure...");
ex.printStackTrace();
}
}
}
Вывод, который я получил,
D:\java -Djava.security.policy=d:\Client\policy\client.policy client.Client
Person : myName age : 0 address : server.Address@1d6776d
Person : myNewName age : 0 address : server.Address@10a2d64
Адрес напечатан неправильно
PS:
Как вы можете видеть из клиентского класса import
import server.PersonInterface;
import server.Address;
Я скопировал PersonInterface.class и Address.class на клиентскую сторону, чтобы скомпилировать клиента.
Финал:
Так глупо!!!
Добавьте следующий код в Address.java
public String toString(){
return addre1+ " " + addre2;
}
ОК, проблемы решены !! :)