FerdouZ Ответов: 1

Установите автоматическое предыдущее соединение после отключения сервера в сокете


Привет
Я занимаюсь программированием одного сокета на 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

- нет!

1 Ответов

Рейтинг:
0

Gerry Schmitz

Вы можете иметь отдельный поток проверяющий сокет каждые x секунд:

1) Проверьте последнее состояние сокета
2) Если не в порядке или закрыто, то (повторно)подключитесь

"Рабочий" поток(ы) просто "отправляет" только тогда, когда "статус" сокета в порядке / доступен; в противном случае они "возвращаются" (до тех пор, пока "работник соединения" не преуспеет).

Упрощает "клиентские" звонки.


FerdouZ

Привет Джерри,
На самом деле я запутался в этом, потому что я новичок. Я делюсь своим кодом выше, можете ли вы проверить для меня?
Спасибо