2012-03-08 11 views
9

बनाते समय त्रुटि मैं अपना पहला, बहुत आसान आरएमआई क्लाइंट-सर्वर एप्लिकेशन बना रहा हूं।

इंटरफेस "ICommunication"

package itu.exercies.RMI.server; 

    import java.rmi.Remote; 
    import java.rmi.RemoteException; 

public interface ICommunication extends Remote 
{ 
    public String doCommunicate(String name) throws RemoteException; 

} 

इंटरफेस कार्यान्वयन "CommunicationImpl":

यहाँ कोड है

package itu.exercies.RMI.server; 

import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class CommunicationImpl extends UnicastRemoteObject implements ICommunication { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public CommunicationImpl() throws RemoteException { 
     super(); 

    } 

    @Override 
    public String doCommunicate(String name) throws RemoteException { 

     return "Hello this is server , whats up " +name+ " ?!\n"; 
    } 

} 

यहाँ है अपने सर्वर "CommunicationServer" के मुख्य वर्ग:

package itu.exercies.RMI.server; 

import java.net.MalformedURLException; 
import java.rmi.Naming; 
import java.rmi.RemoteException; 


public class CommunicationServer { 
    /** 
    * @param args 
    * @throws RemoteException 
    * @throws MalformedURLException 
    */ 
    public static void main(String[] args) throws RemoteException, MalformedURLException { 
     CommunicationImpl imp = new CommunicationImpl(); 
     Naming.rebind("CommunicationImpl", imp); 
     System.out.println("Server started..."); 
     System.out.println("Object successfully registered. It is bound to the name 'CommunicationImpl'."); 

    } 

} 

और यह मेरे मुवक्किल "CommunicationClient" है: टर्मिनल का उपयोग

  1. मैं अपने प्रोजेक्ट की बिन निर्देशिका के लिए नेविगेट
  2. मैं वहाँ से rmiregistry चलाएँ: जब मैं इसे चलाने के लिए कोशिश अब

    package itu.exercies.RMI.client; 
    
    import java.net.MalformedURLException; 
    import java.rmi.Naming; 
    import java.rmi.NotBoundException; 
    import java.rmi.RemoteException; 
    
    import itu.exercies.RMI.server.CommunicationImpl; 
    
    public class CommunicationClient { 
        public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { 
    
         String url = new String("rmi://localhost/CommunicationImpl"); 
         CommunicationImpl comm = (CommunicationImpl)Naming.lookup(url); 
         String reply = comm.doCommunicate("Wiktor"); 
         System.out.println(reply); 
    
    
        } 
    
    } 
    

  3. मैं अपने टर्मिनेशन सर्वर को नई टर्मिनल विंडो से चलाता हूं (और यह संदेशों को प्रिंट करता है, इसलिए यह काम करता है)
  4. मैं तीसरी टर्मिनल विंडो खोलता हूं और जब मैं कोशिश करता हूं मेरे संचार क्लाइंट को चलाने के लिए यह एक अपवाद फेंकता है। सूत्र में

जावा itu.exercies.RMI.client.CommunicationClientException "मुख्य" java.lang.ClassCastException: $ Proxy0 itu.exercies.RMI.server.CommunicationImpl को itu.exercies में ढाला नहीं जा सकता। RMI.client.CommunicationClient.main (CommunicationClient.java:14)

अब तक मैं rmic का उपयोग कर 'CommunicationImpl' वस्तु का एक ठूंठ बनाकर उसे ठीक करने के लिए '$ Proxy0' के स्थान पर त्रुटि दर्शाता है की कोशिश की, लेकिन अब है 'CommunicationImpl_Stub' के लिए:

धागे "मुख्य" java.lang.ClassCastException: itu.exercies.RMI.server.CommunicationImpl_Stub में अपवाद को itu.exercies.RMI.server.CommunicationImpl itu.exercies.RMI.client.CommunicationClient.main पर अपवाद नहीं किया जा सकता है (CommunicationClient.java:14)

इस बिंदु पर मुझे कोई त्रुटि नहीं है कि त्रुटियों को देखना है। क्या कोई मुझे कोई सुझाव दे सकता है?

उत्तर

18

ICommunication comm = (ICommunication) Naming.lookup(url); 

CommunicationImpl साथ

CommunicationImpl comm = (CommunicationImpl) Naming.lookup(url); 

बदलें ICommunication के सर्वर कार्यान्वयन है। क्लाइंट न तो कार्यान्वयन, केवल इंटरफेस के बारे में जानता है और न ही परवाह करता है।

+2

@ बॉयएच बिल्कुल ठीक है। CommunicationImpl ऑब्जेक्ट दूरस्थ है। आपके पास स्थानीय रूप से नहीं है। आपके पास कुछ और है जो एक ही रिमोट इंटरफेस लागू करता है। रिमोट इंटरफेस के लिए यही है। – EJP

संबंधित मुद्दे