आप कैसे पता लगाते हैं कि Socket#close()
को दूरस्थ पक्ष पर सॉकेट पर बुलाया गया है?रिमोट साइड सॉकेट को कैसे बंद करें?
उत्तर
isConnected
विधि मदद नहीं करेगा, यह true
लौटाएगा भले ही रिमोट पक्ष ने सॉकेट बंद कर दिया हो। इसे आज़माएं:
public class MyServer {
public static final int PORT = 12345;
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
Socket s = ss.accept();
Thread.sleep(5000);
ss.close();
s.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
System.out.println(" connected: " + s.isConnected());
Thread.sleep(10000);
System.out.println(" connected: " + s.isConnected());
}
}
सर्वर प्रारंभ करें, क्लाइंट प्रारंभ करें। आप देखेंगे कि यह दो बार "जुड़ा हुआ: सत्य" प्रिंट करता है, भले ही सॉकेट दूसरी बार बंद हो।
वास्तव में पता लगाने का एकमात्र तरीका पढ़ना (आपको वापसी मूल्य के रूप में -1 मिलेगा) या लेखन (IOException
(टूटा हुआ पाइप) फेंक दिया जाएगा) संबंधित इनपुट/आउटपुटस्ट्रीम पर।
क्लाइंट सॉकेट पर लिखते समय आप सॉकेट आउटपुट स्ट्रीम त्रुटि की जांच भी कर सकते हैं।
out.println(output);
if(out.checkError())
{
throw new Exception("Error transmitting data.");
}
आप * कर सकते हैं, लेकिन आप इसे तुरंत प्राप्त नहीं करेंगे। – EJP
चूंकि उत्तर विचलित होने के बाद मैंने परीक्षण का परीक्षण करने और परिणाम पोस्ट करने का निर्णय लिया।
यहां सर्वर केवल क्लाइंट को डेटा लिखता है और किसी भी इनपुट की अपेक्षा नहीं करता है।
सर्वर:
ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
out.println("output");
if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
System.out.println(clientSocket.isConnected());
System.out.println(clientSocket.getInputStream().read());
// thread sleep ...
// break condition , close sockets and the like ...
}
- clientSocket.isConnected() हमेशा सच रिटर्न एक बार ग्राहक जोड़ता है (और यहां तक कि डिस्कनेक्ट करने के बाद) अजीब !!
- getInputStream() (पढ़ें)
- जब तक ग्राहक से जुड़ा हुआ है इनपुट के लिए धागा इंतजार करता है और इसलिए बनाता है अपने कार्यक्रम कुछ भी नहीं -। को छोड़कर अगर आप कुछ इनपुट
- लाभ प्राप्त -1 अगर क्लाइंट डिस्कनेक्ट
- out.checkError() सच है जैसे ही ग्राहक तो डिस्कनेक्ट होने पर मैं इस
checkError() लिखते समय एक त्रुटि का पता चला है, और जल्द ही नहीं। जैसे ही क्लाइंट डिस्कनेक्ट हो जाता है, यह निश्चित रूप से सच नहीं होता है। -1 – EJP
विधि socke की सिफारिश टी। उपलब्ध है जब रिमोट सिस्टम कनेक्शन को डिस्कनेक्ट/बंद कर देता है तो तुरंत सॉकेटएक्सप्शन फेंक देगा।
नहीं, यह नहीं होगा। असत्य। गलत। गलत सूचना। – EJP
- 1. Boost.Asio में सॉकेट बंद होने पर कैसे जांचें?
- 2. विजुअल स्टूडियो 2010 में रिमोट डीबगिंग को कैसे बंद करें?
- 3. वेब सॉकेट सर्वर साइड प्रोसेसिंग मॉडल
- 4. बंद() सॉकेट को ठीक से बंद नहीं कर रहा है
- 5. एंड्रॉइड सॉकेट अपवाद "सॉकेट बंद है"
- 6. पर्ल बंद सॉकेट
- 7. क्या सॉकेट के इनपुटस्ट्रीम को बंद करना सॉकेट कनेक्शन को बंद करता है?
- 8. क्लाइंट को बंद होने तक सॉकेट को कैसे खोलें?
- 9. एप्लिकेशन को खत्म करते समय सॉकेट बंद करें
- 10. पायथन: इसे उचित रूप से बंद किए बिना सॉकेट को कैसे डिस्कनेक्ट करें
- 11. रिमोट को धक्का देने के लिए कैसे करें यदि रिमोट
- 12. XPCOM सॉकेट बंद हो रहा है। इसे जीवित कैसे रखें?
- 13. अवरुद्ध सॉकेट कनेक्ट करने वाले थ्रेड को बाधित कैसे करें?
- 14. सॉकेट। बंद वास्तव में टीसीपी सॉकेट बंद नहीं करता है? (सी #)
- 15. ब्रोकन पाइप केवल दूसरे बंद पर एक बंद सॉकेट
- 16. अंतर्निहित सॉकेट बंद किए बिना एसएसएल बंद करना?
- 17. सॉकेट बंद होने पर रिकवर से अनब्लॉक करें
- 18. PHP में सॉकेट को कैसे सक्षम करें?
- 19. सॉकेट कनेक्शन हानि को अनुकरण कैसे करें?
- 20. सॉकेट कैसे कनेक्ट और बंद हो सकता है?
- 21. सॉकेट बंद किए बिना एसिंक्रोनस पढ़ने/लिखने को कैसे रद्द करें?
- 22. पायथन सॉकेट - सॉकेट को जीवित रखें?
- 23. एक बंद सॉकेट के लिए परीक्षण
- 24. सर्वर पक्ष से मॉडल पॉपअप विस्तारक को कैसे बंद करें
- 25. DefaultHttpClient आधा बंद सॉकेट पर डेटा क्यों भेजता है?
- 26. किसी वेब ब्राउज़र (क्लाइंट साइड) से एक टीसीपी सॉकेट कनेक्शन कैसे स्थापित करें?
- 27. बंद ईवेंट में बंद फॉर्म को कैसे रद्द करें?
- 28. boost :: asio :: tcp :: सॉकेट बंद करें और बिना हैंडलर को रद्द करें
- 29. सॉकेट चैनल बंद होने पर अधिसूचित कैसे किया जाए?
- 30. jQuery में सॉकेट कैसे करें?
आपके उदाहरण में सर्वर टीसीपी कनेक्शन को गर्व से बंद नहीं करता है (आरएसटी भेजा जाता है और यह है)। यदि आप क्लाइंट सॉकेट पर क्लोज़() को कॉल करते हैं, तो कनेक्शन गहराई से बंद हो जाता है। आप इसे पढ़ने के ऑपरेशन के विभिन्न परिणामों से देख सकते हैं: सॉकेटएक्सप्शन फेंक बनाम रीडिंग -1 पढ़ें। – Alexander
बीटीडब्ल्यू, जावा सॉकेट के काम में इस "रहस्य" को याद दिलाने के लिए धन्यवाद। मैंने परिणामस्वरूप एक फॉलो-अप प्रश्न पूछा है: http://stackoverflow.com/questions/155243/why-is-it-impossible-without-attempting-io-to-detect-that-tcp-socket-was -gracef – Alexander
लिखने का एकमात्र तरीका लिखना है। एक अचानक बंद सॉकेट से पढ़ना हमेशा वापस नहीं आ सकता है -1। http://stackoverflow.com/a/6404085/372643 – Bruno