Hi,
I am just starting Java RMI and have some problems with when to use java.io.Serializable, so can anyone give me a RMI example that java.io.Serializable has to be implemented.
Thanks!!!
UPDATE: i had made a simple example, however, i think there are still problems as the output is not correct. Person Interface
package server; 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; }
Person Implementation
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; } }
Address Cless
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; } }
Server
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(); } } }
Client
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(); } } }
The output i got is
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
The address is not printed correctly PS: As you can see from Client class import
import server.PersonInterface; import server.Address;
I had copy PersonInterface.class and Address.class to client side to make Client compiled.
Final: So stupid!!! Add following code to Address.java
public String toString(){ return addre1+ " " + addre2; }
OK, problems are solved!! :)