2013-01-01 7 views
5
public class SerProg { 


    static ServerSocket ser=null; 
    static Socket cli=null; 
    static ObjectInputStream ins=null; 
    static ObjectOutputStream outs=null; 


    public static void main(String[] args) { 

     try { 

      ser=new ServerSocket(9000,10); 
      cli=ser.accept(); 

      System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); 

      ins=new ObjectInputStream(cli.getInputStream()); 
      outs=new ObjectOutputStream(cli.getOutputStream()); 

      String str=(String)ins.readObject(); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

और ग्राहकनई ObjectInputStream() ब्लॉक

public class SerProg { 

    /** 
    * @param args 
    */ 
    static ServerSocket ser=null; 
    static Socket cli=null; 
    static ObjectInputStream ins=null; 
    static ObjectOutputStream outs=null; 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     try { 

      ser=new ServerSocket(9000,10); 
      cli=ser.accept(); 

      System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); 

      ins=new ObjectInputStream(cli.getInputStream()); 
      outs=new ObjectOutputStream(cli.getOutputStream()); 

      String str=(String)ins.readObject(); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

कनेक्शन सफलतापूर्वक में स्थापित किया गया है, लेकिन सर्वर कोड लाइन

ins=new ObjectInputStream(cli.getInputStream()); 

कोड रुकती है और आगे बढ़ना नहीं है, क्या हो सकता है समस्या ??

+1

आप किया था पिछले दो बार SerProg – benjarobin

उत्तर

20

कनेक्शन (दोनों) के दोनों किनारों पर ObjectInputStream से पहले आपको ObjectOutputStream बनाने की आवश्यकता है। जब ObjectInputStream बनाया गया है, तो यह InputStream से ऑब्जेक्ट स्ट्रीम हेडर को पढ़ने का प्रयास करता है। तो यदि दूसरी तरफ ObjectOutputStream अभी तक नहीं बनाया गया है, तो पढ़ने के लिए कोई ऑब्जेक्ट स्ट्रीम हेडर नहीं है, और यह अनिश्चित काल तक अवरुद्ध होगा।

या अलग-अलग वाक्यांश: यदि दोनों पक्ष पहले ObjectInputStream बनाते हैं, तो दोनों ऑब्जेक्ट स्ट्रीम हेडर को पढ़ने की कोशिश कर रहे हैं, जो तब तक नहीं लिखा जाएगा जब तक ObjectOutputStream बनाया गया है (लाइन के दूसरी तरफ); जो कभी नहीं होगा क्योंकि दोनों पक्ष ObjectInputStream के निर्माता में अवरुद्ध हैं।

यह ObjectInputStream(InputStream in) की जावाडोक से अनुमान लगाया जा सकता है:

एक क्रमबद्धता धारा हैडर धारा से पढ़ सकते हैं और सत्यापित है। यह कन्स्ट्रक्टर तब तक अवरुद्ध होगा जब तक संबंधित ऑब्जेक्टऑटपुटस्ट्रीम ने हेडर लिखा और फ़्लश नहीं किया हो।

यह भी Esmond पिट ने जावा में मौलिक नेटवर्किंग की धारा 3.6.2 में वर्णित है।

+0

का कोड मुझे समझ नहीं आता क्यों आदेश ObjectOutputStream और ObjectInputStream – benjarobin

+1

@benjarobin दोनों पक्षों पहले 'ObjectInputStream' का निर्माण करते हैं, तो दोनों वस्तु धारा हेडर को पढ़ने का प्रयास अवरुद्ध कर देगा के बीच प्रासंगिक है, जिसे 'ऑब्जेक्टऑटपुटस्ट्रीम' बनाया गया है (लाइन के दूसरी तरफ) तक लिखा नहीं जाएगा; जो कभी नहीं होगा क्योंकि दोनों पक्ष 'ऑब्जेक्ट इनपुटपुट' के निर्माता में अवरुद्ध हैं। –

+1

क्षमा करें, मैंने आपको संदेश गलत समझा, क्षमा करें !!! आप टिप्पणी बहुत स्पष्ट है, आपको इसे अपने उत्तर में जोड़ना चाहिए। मुझे समझ में नहीं आया कि दोनों ग्राहक और सर्वर दोनों दिशा वस्तु (मेरे खराब) में भेज रहे हैं आप मुझसे +1 प्राप्त करते हैं :-) – benjarobin

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