Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

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

Discussion in 'Xây dựng ứng dụng server-client desktop' started by vampirevp, 7/9/11.

  1. vampirevp

    vampirevp New Member

    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;
    }
    
     
  2. tauit_dnmd

    tauit_dnmd Member

    Ðề: [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.rebindregistrationCalculService);
                
            }
            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);
     
  3. vampirevp

    vampirevp New Member

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

    Cảm ơn bạn rất nhiều!. Một ngày vui vẻ nhé!.
     
  4. Ðề: [Help] Căn bản về RMI

    Chạy được chưa chú chúc làm dề =)) .
     
  5. vampirevp

    vampirevp New Member

    Ðề: [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 bthrows 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 bthrows 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 aint bthrows 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 aint bthrows 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 = (RMICalcul1remote1;

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

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

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


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

    tauit_dnmd Member

    Ðề: [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à.
     
  7. greenforest

    greenforest New Member

    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!
     

Chia sẻ trang này

Loading...