2011-08-11 8 views
5

के साथ सॉकेट को सुनना ठीक है, इसलिए जब भी सर्वर एक कनेक्शन स्वीकार करता है तो मेरे पास 'क्लाइंट' नामक एक थ्रेड क्लास होता है जो यह एक नया क्लाइंट बनाता है .... रन विधि क्लाइंट से संदेशों के लिए सुनती है और मैं ObjectInputStream ..जावा - ऑब्जेक्टइनपुटस्ट्रीम

का उपयोग कर रहा हूँ
do {    
     ObjectInputStream in = null; 

     try { 
      in = new ObjectInputStream(socket.getInputStream()); 
      String message = (String) in.readObject(); 
      System.out.println(message); 
      } 
      catch (ClassNotFoundException ex) { 
       isConnected = false; 
       System.out.println("Progoramming Error"); 
      } 
      catch (IOException ex) { 
       isConnected = false; 
       System.out.println("Server ShutDown"); 
       System.exit(0); 
      } 
    } while(isConnected); 

समस्या मेरे पास है यही कारण है कि मैं एक नया ObjectInputStream हर बार, यह लूप बनाने के लिए करते हैं ... और अगर मैं पाश के अंत में इनपुट धारा को बंद करने और यह लूप फिर एक और संदेश के लिए मुझे एक त्रुटि मिलेगी ... कृपया कोई मदद करें

+2

आपको नहीं करना है, और आपको नहीं करना चाहिए। –

+1

और क्लास नॉटफाउंड अपवाद प्राप्त करना न तो एक संकेत है कि अब आप कनेक्ट नहीं हैं और न ही प्रोग्रामिंग त्रुटि। यह एक * तैनाती * त्रुटि इंगित करता है। – EJP

+0

क्या आप पिछले त्रुटियों को प्राप्त कर सकते हैं और यदि आप क्लाइंट कोड भी पोस्ट करते हैं तो इससे भी मदद मिलेगी। – beny23

उत्तर

6

क्लाइंट कनेक्शन के लिए केवल एक बार (लूप के बाहर) ऑब्जेक्ट इनपुटपुट बनाएं, फिर उसे डालें लूप में readObject विधि पढ़ें।

यहाँ एक काम कर परीक्षण वर्ग है:

public class TestPrg { 

    public static void main(String... args) throws IOException { 
     ServerListener server = new ServerListener(); 
     server.start(); 

     Socket socketToServer = new Socket("localhost", 15000); 
     ObjectOutputStream outStream = new ObjectOutputStream(socketToServer.getOutputStream()); 

     for (int i=1; i<10; i++) { 
      try { 
       Thread.sleep((long) (Math.random()*3000)); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Sending object to server ..."); 
      outStream.writeObject("test message #"+i); 
     } 
     System.exit(0); 

    } 

    static class ServerListener extends Thread { 

     private ServerSocket serverSocket; 

     ServerListener() throws IOException { 
      serverSocket = ServerSocketFactory.getDefault().createServerSocket(15000); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        final Socket socketToClient = serverSocket.accept(); 
        ClientHandler clientHandler = new ClientHandler(socketToClient); 
        clientHandler.start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    static class ClientHandler extends Thread{ 
     private Socket socket; 
     ObjectInputStream inputStream; 

     ClientHandler(Socket socket) throws IOException { 
      this.socket = socket; 
      inputStream = new ObjectInputStream(socket.getInputStream()); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Object o = inputStream.readObject(); 
        System.out.println("Read object: "+o); 
       } catch (IOException e) { 
        e.printStackTrace(); 

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

} 

इस उदाहरण स्ट्रिंग्स में ObjectStream गर्त भेजा जाता है। यदि आपको ClassNotFoundException (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()) मिलता है और आप एक स्वतंत्र क्लाइंट और सर्वर प्रोग्राम का उपयोग कर रहे हैं तो आप जांच सकते हैं कि क्या क्लाइंट और सर्वर दोनों को कक्षा के वर्ग में भेजने के लिए ऑब्जेक्ट का वर्ग होता है।

+0

ओह, मैं देख रहा हूं ... उस दोस्त के लिए धन्यवाद .. मैं इसे बाद में कोशिश करूंगा .. और आपको बताता है कि यह कैसे जाता है .... – MurWade

+0

मैंने कोशिश की और यह काम नहीं किया .... – MurWade

+1

नींद व्यर्थ है, और पढ़ें लूप को 'EOFException' पकड़ना चाहिए और पकड़े जाने पर रीडिंग लूप से बाहर होना चाहिए। 'सॉकेटटाइम एक्सेप्शन 'को छोड़कर अन्य सभी' IOExceptions 'कनेक्शन के लिए भी घातक हैं और रीडिंग लूप से बाहर निकलना चाहिए। रीड लूप किसी भी कारण से बाहर निकलने के बाद सॉकेट बंद होना चाहिए। यहां बहुत खराब अभ्यास है। – EJP