tags:

views:

223

answers:

1

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!! :)

+1  A: 
interface MyInterface extends Remote {
  MyClass f(MyClass x) throws RemoteException;
}

class MyClass implements Serializable {
   private int value;
   public MyClass(int value) {
       this.value = value;
   }

   public int getValue() {
       return value;
   }
}

you need Serializable interface to tell that your class can be sent via network

server code

class Service extends UnicastRemoteObject  implements MyInterface {
   public Service() {
   }
   public MyClass f(MyClass v) throws RemoteException {
       return new MyClass(v.getValue() + 1)
   }

   public static void main(Strint arg[]) {
      Registry r = LocateRegistry.createRegistry(1099);
      r.rebind("service", new Service());
   }
}

client code

class Client {
       public static void main(Strint arg[]) {
          Registry r = LocateRegistry.getRegistry("localhost", 1099);
          MyInterface service = (MyInterface)r.lookup("service");

          MyClass result = service.f(new MyClass(123));
          System.out.println(result.getValue());  //print 124 here
       }
  }
antony
Thanks,So do you mean that by making MyClass Serializable, client side is able to create a MyClass object? Thus,the Remote Object that implements MyInterface (say it is called myRemoteObject) can call method f and takes MyClass Object as a parameter, for example: MyInterface myRemoteObject= (MyInterface)Naming.lookup(name);....myRemoteObject.f(new MyClass());is this right?
Great!!Just have one more question, do i need to copy MyClass.class to client package as i did for MyInterface.class ,or MyInterface.class will encapsulate MyClass in some format as it extends Remote.
you need MyClass in client side because it wouldn't compile without it. but in general, MyClass can also be interface, and client side needs only this interface, not implementation (which is defined only in server).
antony
So if MyClass is defined as an interface, then i think i need to bind it on registry( just like Naming.bind("rmi://localhost:9999/myClassObject", myClassObject); ).And, can you explain more about "client side needs only this interface", i thought we still the MyInterface if MyClass is changed to interface, so, there actually will be two services.
I had updates my question. Thanks!!
look at this example http://java.sun.com/docs/books/tutorial/rmi/index.html
antony
Thanks antony, problems are solved.