Установите автоматическое предыдущее соединение после отключения сервера в сокете
Привет
Я занимаюсь программированием одного сокета на java. Если серверный сокет отключен на некоторое время, то запустите его снова, после чего можно получить автоматическое соединение с клиентом, с которым сервер соединялся ранее.Если возможно, может ли кто-нибудь помочь мне, как это сделать?
Что я уже пробовал:
Это мой код. Можете помочь мне справиться с этим?
package multiclients; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; public class STServer { // Declaring the asynchronous thread class public static class QueueClientThread extends Thread { private BufferedReader m_in; private PrintWriter m_out; // Passing buffered reader and print writer objects to the constructor public QueueClientThread(BufferedReader in, PrintWriter out) { m_in = in; m_out = out; } public void run() { // Entering the endless eternal loop to make sure that the asynchronous // threads is proceeding to receive incoming messages in real-time mode while (true) { try { String msg_buf = "Thank You"; // Fetching data from socket by invoking buffered reader's // readLine(…) method. while ((msg_buf = m_in.readLine()) != null) { // Printing diagnostic message System.out.println("Response from singlethreaded server: " + msg_buf); // Sending out the modified data back to client m_out.println("Response from singlethreaded server: " + msg_buf+ " Thank You"); } // Catch the IO socket exception } catch (IOException ex) { // Log the exception Logger.getLogger(STServer.class.getName()).log(Level.SEVERE, null, ex); } } } } public static void main(String[] args) throws IOException { Integer.parseInt("5058"); // Instantinate server socket object to listen tcp port 5058 @SuppressWarnings("resource") ServerSocket serverSocket = new ServerSocket(Integer.parseInt("5058")); // Entering endless eternal loop to enforce the single threaded server // receive incoming messages forwarded from clients by the multi-threaded // server and respond each incoming message back to multi-threaded server while (true) { try { // Getting client socket object Socket clientSocket = serverSocket.accept(); // Instantiate print writer to send data back to clients by using output stream PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); // Run the asynchronous thread to receive incoming requests new QueueClientThread(new BufferedReader( new InputStreamReader(clientSocket.getInputStream())), out).start(); // Catch IO exception in case if socket operations fail } catch (IOException ex) { Logger.getLogger(STServer.class.getName()).log(Level.SEVERE, null, ex); } } }}
Клиент
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.InterruptedIOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; public class MTServer { public static class QueueClientThread extends Thread { private BufferedReader m_in; private PrintWriter m_out; public QueueClientThread(BufferedReader in, PrintWriter out) { m_in = in; m_out = out; } public void run() { while (true) { try { String msg_buf = "\0"; while ((msg_buf = m_in.readLine()) != null) { System.out.println("Message sent back to client: " + msg_buf); m_out.println("Message sent back to client: " + msg_buf); } }catch (InterruptedIOException iioe) { System.err.println ("Remote host timed out"); } catch (IOException ex) { Logger.getLogger(MTServer.class.getName()).log(Level.SEVERE, null, ex); } } } } public static class QueueMTServerThread extends Thread { private Socket m_Socket; public QueueMTServerThread(Socket socket) { m_Socket = socket; } @SuppressWarnings("resource") public void run() { try ( PrintWriter out = new PrintWriter(m_Socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(m_Socket.getInputStream())); ) { String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); String hostName = "127.0.0.1"; int portNumber = Integer.parseInt("5058"); Socket clientSocket = new Socket(hostName, portNumber); PrintWriter outputStream = new PrintWriter( clientSocket.getOutputStream(), true); outputStream.println(inputLine); new QueueClientThread(new BufferedReader( new InputStreamReader(clientSocket.getInputStream())), out).start(); } } catch (InterruptedIOException iioe) { System.err.println ("Remote host timed out"); }catch (IOException e) { System.out.println(e.getMessage()); } } } @SuppressWarnings({ "resource", "unused" }) public static void main(String[] args) throws IOException { int portNumber = Integer.parseInt("5056"); try { ServerSocket serverSocket = new ServerSocket( Integer.parseInt("5056")); while (true) { Socket clientSocket = serverSocket.accept(); new QueueMTServerThread(clientSocket).start(); } }catch (InterruptedIOException iioe) { System.err.println ("Remote host timed out"); } catch (IOException ex) { Logger.getLogger(MTServer.class.getName()).log(Level.SEVERE, null, ex); } } }
ZurdoDev
Я не знаю Java, но я думаю, что один из способов состоит в том, чтобы клиент периодически запрашивал, доступен ли сервер. Как только он станет доступен, ваше соединение будет установлено снова.
Mohibur Rashid
Это и есть ответ.
FerdouZ
Привет Рашид,
Вы можете поделиться кодом?
Mohibur Rashid
- нет!