[Help] Căn bản về RMI

vampirevp

New Member
25/7/10
18
0
1
Mình mới bắt đầu học RMI, mình chạy CalculServer trên môi trường NetBeans và eclipse đều báo lỗi, lý do là tại sao, mong mọi người giúp, thanks!. :D
Error - java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect

CalculServer
Code:
import java.rmi.*;
import java.rmi.server.*;
public class CalculServer
{
    public static void main(String args[])
    {
        try
        {
            // Load the service
            RMICalculimpl CalculService = new RMICalculimpl();
            String registration = "rmi://localhost/RMICalcul";
            // Register with service so that clients can find us
            Naming.rebind( registration, CalculService);
        }
        catch (Exception e)
        {
            System.err.println ("Error - " + e);
        }
    }
}
CalculClient
Code:
public class CalculClient
{
    public static void main(String args[])
    {
        try
        {
            String registration = "rmi://localhost/RMICalcul";
            // Lookup the service in the registry, and obtain a remote service
            Remote remoteService = Naming.lookup (registration );
            // Cast to a RMICalcul interface
            RMICalcul calculService = (RMICalcul) remoteService;
            // call remote  method :add (..), sub
            System.out.println ("sum = "+calculService.add(3,5));
            System.out.println ("sub = "+calculService.sub(3,5));
        }
        catch (Exception e)
        {
            System.out.println ("Error - " + e);
        }
    }
}
RMICalculimpl
Code:
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class RMICalculimpl extends UnicastRemoteObject implements RMICalcul
{
    public RMICalculimpl() throws RemoteException
    {
    }

    public int add (int a, int b) throws RemoteException
    {
    return (a+b);
    }

    public int sub(int a, int b) throws RemoteException
    {
    return (a-b);
    }
}
RMICalcul
Code:
import java.rmi.*;
public interface RMICalcul extends Remote
{
    public int add (int a, int b) throws RemoteException;
    public int sub(int a, int b) throws RemoteException;
}
 

tauit_dnmd

Member
7/11/10
114
1
16
UIT
Ðề: [Help] Căn bản về RMI

Bạn đã chạy RMIRegistry trước chưa?? Phải chạy nó trước để bind object
Bạn cug có thể chạy RMI register bằng code như sau
PHP:
Registry r=LocateRegistry.createRegistry(1234); // Chạy dịch vụ RMI registry tại port 1234,, bạn chọn port khác cũng đc
Đoạn code bind object bên phía server bạn sửa thành như sau:
PHP:
import java.rmi.*;
import java.rmi.server.*;
public class CalculServer
{
    public static void main(String args[])
    {
        try
        {
            // Load the service
            Registry r=LocateRegistry.createRegistry(1234);
            RMICalculimpl CalculService = new RMICalculimpl();
            String registration = "rmi://localhost:1234/RMICalcul";
            // Register with service so that clients can find us
            Naming.rebind( registration, CalculService);
            
        }
        catch (Exception e)
        {
            System.err.println ("Error - " + e);
        }
    }
}
O trên bạn dùng Naming để bind ,phải nhớ cái đường dẫn rmi://... j j đó ,đôi khi quên quên không nhớ ( mình thì rất hay quên)
Thì bạn xài Chính Registry để bind/rebind cú pháp đơn giản hơn.Bạn đỡ phải nhớ cái đường dẫn
Bạn có thể thay bằng : r.rebind( "RMICalcul", CalculService);
 

vampirevp

New Member
25/7/10
18
0
1
Ðề: [Help] Căn bản về RMI

Cảm ơn bạn rất nhiều!. Một ngày vui vẻ nhé!.
 

vampirevp

New Member
25/7/10
18
0
1
Ðề: [Help] Căn bản về RMI

@Hứa Thiên Phong: rồi bạn ah.
Ví dụ mình muốn chạy 2 Server, 1 Server tính cộng, 1 Server tính trừ, nhưng đều dùng chung RMI Registry thì phải làm sao? Mình viết code thế này, nhưng hình như ko đúng lắm. Giúp mình với.

CalculServer1
PHP:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class CalculServer1 {
    public static void main(String [] args){
        try{
            Registry registry = LocateRegistry.createRegistry(6789);

            RMIimpl1 rmiimpl1 = new RMIimpl1();
            String registration = "rmi://localhost:6789/RMICalcul1";

            registry.rebind("RMICalcul1", rmiimpl1);

        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
RMICalcul1
PHP:
import java.rmi.Remote;
import java.rmi.RemoteException;

interface  RMICalcul1 extends Remote{
    public int add(int a,int b) throws RemoteException;
}
RMIimpl1
PHP:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class RMIimpl1 extends UnicastRemoteObject implements RMICalcul1{
    public RMIimpl1() throws RemoteException{

    }

    public int add(int a,int b) throws RemoteException{
        return a+b;
    }
}
CalculServer2
PHP:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class CalculServer2 {
    public static void main(String [] args){
        try{
           Registry registry = LocateRegistry.createRegistry(9876) ;

           RMIimpl2 rmiimpl2 = new RMIimpl2();
           String registration = "rmi://localhost:9876/RMICalcul2";

           registry.rebind("RMICalcul2", rmiimpl2);

        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
RMICalcul2
PHP:
import com.sun.corba.se.spi.transport.ReadTimeouts;
import java.rmi.Remote;
import java.rmi.RemoteException;

interface RMICalcul2 extends Remote{
    public int sub(int a, int b) throws RemoteException;
}
RMIimpl2
PHP:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class RMIimpl2 extends UnicastRemoteObject implements RMICalcul2{
    public RMIimpl2() throws RemoteException{

    }

    public int sub(int a, int b) throws RemoteException {
        return a-b;
    }
}
CalculClient
PHP:
import java.rmi.Naming;
import java.rmi.Remote;

public class CalculClient {
    public static void main(String [] args){
        try{
            String registration1 = "rmi://localhost:6789/RMICalcul1";

            Remote remote1 = Naming.lookup(registration1);
            RMICalcul1 rmicalcul1 = (RMICalcul1) remote1;

            System.out.println("sum= "+rmicalcul1.add(10, -2));

            String registration2 = "rmi://localhost:9876/RMICalcul2";

            Remote remote2 = Naming.lookup(registration2);
            RMICalcul2 rmicalcul2 = (RMICalcul2) remote2;
            System.out.println("sub= "+rmicalcul2.sub(10, -2));


        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
 

tauit_dnmd

Member
7/11/10
114
1
16
UIT
Ðề: [Help] Căn bản về RMI

Bạn không thể chạy 2 RMI Registry trên cùng 1 cổng đc. Giống như không thể mở 2 ServerSocket cùng lắng nghe trên 1 công đc á.
ở trên bạn chạy trên 2 cổng khác nhau, vậy đc mà.
 

greenforest

New Member
24/8/13
13
0
1
30
Bạn ai có thể demo cho mình 1 chương trình đơn giản RMI sử dụng Swing được không? Kiểu như click vào button thì client gửi 1 nhãn (Hello) sang JFrame của Sever.Cảm ơn bạn!