2008-09-30 19 views

उत्तर

59

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 (टूटा हुआ पाइप) फेंक दिया जाएगा) संबंधित इनपुट/आउटपुटस्ट्रीम पर।

+1

आपके उदाहरण में सर्वर टीसीपी कनेक्शन को गर्व से बंद नहीं करता है (आरएसटी भेजा जाता है और यह है)। यदि आप क्लाइंट सॉकेट पर क्लोज़() को कॉल करते हैं, तो कनेक्शन गहराई से बंद हो जाता है। आप इसे पढ़ने के ऑपरेशन के विभिन्न परिणामों से देख सकते हैं: सॉकेटएक्सप्शन फेंक बनाम रीडिंग -1 पढ़ें। – Alexander

+0

बीटीडब्ल्यू, जावा सॉकेट के काम में इस "रहस्य" को याद दिलाने के लिए धन्यवाद। मैंने परिणामस्वरूप एक फॉलो-अप प्रश्न पूछा है: http://stackoverflow.com/questions/155243/why-is-it-impossible-without-attempting-io-to-detect-that-tcp-socket-was -gracef – Alexander

+4

लिखने का एकमात्र तरीका लिखना है। एक अचानक बंद सॉकेट से पढ़ना हमेशा वापस नहीं आ सकता है -1। http://stackoverflow.com/a/6404085/372643 – Bruno

11

क्लाइंट सॉकेट पर लिखते समय आप सॉकेट आउटपुट स्ट्रीम त्रुटि की जांच भी कर सकते हैं।

out.println(output); 
if(out.checkError()) 
{ 
    throw new Exception("Error transmitting data."); 
} 
+1

आप * कर सकते हैं, लेकिन आप इसे तुरंत प्राप्त नहीं करेंगे। – EJP

25

चूंकि उत्तर विचलित होने के बाद मैंने परीक्षण का परीक्षण करने और परिणाम पोस्ट करने का निर्णय लिया।

यहां सर्वर केवल क्लाइंट को डेटा लिखता है और किसी भी इनपुट की अपेक्षा नहीं करता है।

सर्वर:

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() सच है जैसे ही ग्राहक तो डिस्कनेक्ट होने पर मैं इस
+18

checkError() लिखते समय एक त्रुटि का पता चला है, और जल्द ही नहीं। जैसे ही क्लाइंट डिस्कनेक्ट हो जाता है, यह निश्चित रूप से सच नहीं होता है। -1 – EJP

-7

विधि socke की सिफारिश टी। उपलब्ध है जब रिमोट सिस्टम कनेक्शन को डिस्कनेक्ट/बंद कर देता है तो तुरंत सॉकेटएक्सप्शन फेंक देगा।

+5

नहीं, यह नहीं होगा। असत्य। गलत। गलत सूचना। – EJP

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