2012-02-21 18 views
5

मेरे पास क्लाइंट-सर्वर ऐप है जो मैं कर रहा हूं और सर्वर पर ऑब्जेक्ट्स पढ़ने पर मुझे कुछ परेशानी हो रही है।ऑब्जेक्ट इनपुट स्ट्रीम - नए डेटा के लिए कैसे प्रतीक्षा करें?

मेरे सर्वर क्लाइंट सॉकेट से कनेक्ट होने के बाद, मैं ऑब्जेक्ट इनपुट और आउटपुट स्ट्रीम बनाता हूं और उन्हें अपने service() विधि के साथ पास करता हूं। वहां, मुझे क्लाइंट से विभिन्न प्रकार के संदेशों को संभालना है। मैं क्लाइंट से एक संदेश प्राप्त कर सकता हूं (यानी, मेरे डिजाइन के Message ऑब्जेक्ट) बस ठीक है। लेकिन निश्चित रूप से, मैं जो करना चाहता हूं वह एक लूप है इसलिए मैं एक संदेश प्राप्त कर सकता हूं, इसे संसाधित कर सकता हूं, और जवाब दे सकता हूं।

अभी तक, मेरा कोड केवल एक संदेश के लिए काम करता है। जब मैंने अपना लूप जोड़ा, तो प्रत्येक पुनरावृत्ति पर क्या हुआ, मेरे सर्वर ने सॉकेट पर एक नया संदेश भेजने का मौका मिलने से पहले ही एक ही संदेश को बार-बार पढ़ना जारी रखा (मुझे लगता है कि यह हो रहा है, कम से कम) ।

तो मुझे वास्तव में क्या करने की ज़रूरत है यह पता लगाने के लिए कि service() विधि नए इनपुट के लिए कैसे प्रतीक्षा करें। कोई विचार? या मैं इस गलत के पास आ रहा हूँ? क्या मुझे हर पुनरावृत्ति पर एक नया ओआईएस बनाने की जरूरत है या ...? कुछ कोड: उस में

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception { 

    _shouldService = true; 

    while (_shouldService) { 
        // It just keeps reading the same message over and over 
        // I need it to wait here until the client sends a new message 
        // Unless I'm just approaching this all wrong! 
     NetworkMessage message = (NetworkMessage) input.readObject(); 

     NetworkMessageHeader header = message.getHeader(); 

     String headerType = header.getType(); 

     if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) { 
      doLoginForMessage(message, output); 
     } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) { 
      doFilesList(message, output); 
     } else { 
      System.out.println("Unrecognized header type: " + headerType); 

     } 
    } 
} 

उत्तर

2

ObjectOutputStream कैश अभ्यावेदन वस्तु और पता नहीं लगा होगा यदि आप ग्राहक की ओर से फिर से पर एक ही उदाहरण फिर से भेजने हैं, लेकिन साथ बदल जाता है। यदि यह आपका परिदृश्य है तो आपको प्रत्येक भेजने से पहले स्ट्रीम पर reset पर कॉल करने की आवश्यकता है।

NetworkMessage message = new NetworkMessage(); 
for(;;) { 
    message.setProperty(whatever); 
    oos.reset(); 
    oos.writeObject(message); 
} 
+0

मुझे एक ही समस्या मिली और रीसेट ने कोई फर्क नहीं पड़ता – bubakazouba

+0

@ बुबाकाज़ुबा तो यह वही समस्या नहीं थी। – EJP