चल रहा है, तो मूल रूप से मैं एक रॉक ठोस सर्वर बनाना चाहता हूं।जब सर्वरस्केट IOException फेंकता है और सर्वर को
while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();
... spawn a new thread to handle the client ...
} catch (IOException e) {
e.printStackTrace();
// NOW WHAT?
}
}
आईओएक्सप्शन ब्लॉक में, क्या करना है? क्या सर्वर सॉकेट गलती पर है ताकि इसे फिर से बनाया जा सके? उदाहरण के लिए कुछ ही सेकंड प्रतीक्षा करें और फिर
serverSocket = ServerSocketFactory.getDefault().createServerSocket(MY_PORT);
लेकिन अगर सर्वर सॉकेट अभी भी ठीक है, तो यह एक दया इसे बंद करें और सब पहले से स्वीकार किए जाते हैं कनेक्शन है कि अभी भी संवाद कर रहे हैं को मारने के लिए है।
संपादित करें: कुछ उत्तरों के बाद, यहां IOException से निपटने का मेरा प्रयास है। क्या कार्यान्वयन सर्वर को बनाए रखने की गारंटी दे रहा है और केवल आवश्यक होने पर सर्वर सॉकेट को फिर से बना सकता है?
while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();
... spawn a new thread to handle the client ...
bindExceptionCounter = 0;
} catch (IOException e) {
e.printStackTrace();
recreateServerSocket();
}
}
private void recreateServerSocket() {
while (keepRunning) {
try {
logger.info("Try to re-create Server Socket");
ServerSocket socket = ServerSocketFactory.getDefault().createServerSocket(RateTableServer.RATE_EVENT_SERVER_PORT);
// No exception thrown, then use the new socket.
serverSocket = socket;
break;
} catch (BindException e) {
logger.info("BindException indicates that the server socket is still good.", e);
bindExceptionCounter++;
if (bindExceptionCounter < 5) {
break;
}
} catch (IOException e) {
logger.warn("Problem to re-create Server Socket", e);
e.printStackTrace();
try {
Thread.sleep(30000);
} catch (InterruptedException ie) {
logger.warn(ie);
}
}
}
}
यदि कोई नया सर्वर सॉकेट बना रहा है, जो BindException के साथ विफल रहता है - इसका मतलब यह होगा कि यह 100% सुनिश्चित है कि पुराने सर्वर सॉकेट पूरी तरह से ठीक है? – s5804
मैं निश्चित रूप से "हाँ" नहीं कह सकता, लेकिन आम तौर पर मैं इसे मानता हूं। मैं एक रक्षात्मक रणनीति का भी उपयोग करूंगा। जैसे यदि आपको स्वीकार करने वाले असफलताओं की एक्स संख्या मिलती है, तो आप किसी भी तरह से सर्वर सॉकेट को तोड़ सकते हैं, और सर्वर सॉकेट को बंद करना चुन सकते हैं। – mdma