2011-12-13 33 views
7

tôi đang làm việc trên một trò chơi RMI dòng lệnh nhưng, bất cứ khi nào tôi cố gắng dịch vụ của tôi, tôi nhận được một lỗi như thế này:Java RMI Connect Ngoại lệ: kết nối từ chối đăng cai/timeout

java.rmi.ConnectException: Connection refused to host: 192.168.56.1; nested exception is: 
    java.net.ConnectException: Connection timed out: connect 

Đây là lớp chính cho Server tôi:

public class RMIWar { 

    public static void main(String[] args) throws RemoteException, MalformedURLException { 
     try { 
      Controle obj = new Controle(4); 
      Registry reg = LocateRegistry.createRegistry(1099); 
      System.out.println("Server is ready"); 
      reg.rebind("CtrlServ", obj); 
     } 
     catch (Exception e) { 
      System.out.println("Error: " + e.toString()); 
     } 
    } 
} 

các chính cho Client lớp học của tôi:

public class RMIWarClient { 
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException { 
     try { 
      Registry registry = LocateRegistry.getRegistry("localhost"); 
      ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ"); 
      System.out.println("CtrlServ found...\n"); 
      BioRMI bio = new BioRMI(null, 5,5,5); 
      ctrl.thRegister("Test", bio.atk, bio.def, bio.agi); 

     } 

     catch (Exception e) { 
      System.out.println("Error: " + e); 
     } 
    } 
} 

Bất kỳ đề xuất nào?

Trả lời

10

Kiểm tra xem cổng 1099 của bạn có khả dụng không. Ngoài ra, bạn đã không đề cập đến hệ điều hành bạn đang sử dụng và nếu bạn bắt đầu đăng ký trước khi thực hiện máy chủ của bạn.

này RMI tutorial giải thích:

Trước khi bắt đầu động cơ tính toán, bạn cần phải khởi động RMI registry. Sổ đăng ký RMI là một tên máy chủ khởi động đơn giản có tên là , cho phép các máy khách từ xa lấy một tham chiếu đến đối tượng từ xa ban đầu .

Theo mặc định, sổ đăng ký chạy trên cổng 1099, như cổng của bạn. Như các báo cáo hướng dẫn, chỉ cần mở một dấu nhắc lệnh (trên Windows) hoặc một thiết bị đầu cuối vỏ (trên UNIX-like OS) và gõ:

Đối với Windows (sử dụng javaw nếu bắt đầu là không có sẵn):

start rmiregistry 

Solaris OS hay Linux:

rmiregistry & 

CẬP NHẬT

012.

Tôi nhận thấy, theo hướng dẫn của Oracle và một dự án của tôi về thời gian trước đây, rằng trong lớp Server, bạn đã không xuất khẩu đối tượng vào thời gian chạy RMI. Sau đó, bạn nên chỉnh sửa những dòng này:

Controle obj = new Controle(4); 
Registry reg = LocateRegistry.createRegistry(1099); 
System.out.println("Server is ready"); 
reg.rebind("CtrlServ", obj); 

tới:

Controle obj = new Controle(4); 
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0); 
Registry reg = LocateRegistry.createRegistry(1099); 
System.out.println("Server is ready"); 
reg.rebind("CtrlServ", stub); 

Bởi vì các báo cáo hướng dẫn:

Phương pháp UnicastRemoteObject.exportObject tĩnh xuất khẩu các đối tượng từ xa cung cấp để nó có thể nhận được lời mời của các phương thức từ xa từ các máy khách từ xa.

Ngoài ra, nếu bạn đang sử dụng cùng một máy chủ cho một invocation RMI, nó không phải là cần thiết trong lớp Client:

Registry registry = LocateRegistry.getRegistry("localhost"); 

Đơn giản chỉ cần gọi:

Registry registry = LocateRegistry.getRegistry(); 

Bởi vì Oracle báo cáo :

Quá tải không đối số của LocateRegistry.getReg istry tổng hợp một tham chiếu đến một registry trên host nội bộ và trên cổng mặc định registry , 1099. Bạn phải sử dụng một quá tải mà có một tham số int nếu registry được tạo ra trên một cổng khác hơn 1099.

+0

Không có điều nào trong số này sẽ gây ra thời gian chờ kết nối. – EJP

+2

cổng được tường lửa sẽ –

+0

@EJP Giới thiệu về thời gian chờ kết nối, tôi đã viết: "Kiểm tra xem cổng 1099 của bạn có khả dụng hay không". Điều này có nghĩa là để kiểm tra xem cổng có sẵn hoặc tường lửa hay không. Lưu ý của tôi về sự bắt đầu của rmiregistry là vì OP đã không viết bất cứ điều gì về điều đó, và bởi vì, đôi khi việc không thực hiện các dịch vụ là lý do của một kết nối từ chối. Nếu Client muốn thực thi một phương thức của Server, nhưng nếu Server không chạy cục bộ với dịch vụ, Client sẽ không bao giờ thực thi phương thức này. –

0

Hãy cẩn thận về các cổng khiến chúng có thể bị chặn cho tường lửa, ví dụ nếu bạn đang làm việc trên một khu vực an toàn như bạn làm việc hoặc đại học, quản trị viên có thể đã thực hiện một số biện pháp bảo vệ ...

0

Tôi không xem cách bạn có thể nhận được ngoại lệ từ mã đó. Theo mã máy chủ và máy khách của bạn đang chạy trên cùng một máy chủ và bạn không nhận được thời gian chờ kết nối trong cùng một máy chủ lưu trữ. Vì vậy, giả sử đó không phải là mã thực của bạn và bạn đang tìm kiếm sổ đăng ký chính xác (đối số máy chủ để getRegistry()), tôi sẽ hỏi liệu 192.168.56.1 là địa chỉ IP bạn mong đợi để xem được cấu trúc liên kết mạng của bạn hay chưa. Đó là một địa chỉ LAN nội bộ và nếu máy khách của bạn ở bên ngoài mạng LAN, nó sẽ cố gắng kết nối với một địa chỉ IP công khai hơn. Nếu địa chỉ không phải là những gì bạn mong đợi, tôi giới thiệu bạn đến item A.1 on the RMI FAQ.

Các vấn đề liên quan