在socket中关闭服务器后建立自动先前连接 [英] Establish auto previous connection after server down in socket
本文介绍了在socket中关闭服务器后建立自动先前连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
嗨
我在java中进行一次套接字编程。如果服务器套接字关闭一段时间然后重新启动,那么可以与服务器连接的客户端自动连接。如果有可能,任何人都可以帮我怎么做?
我尝试过:
这是我的代码。可以帮我解决这个问题吗?
Hi
I am doing one socket programming in java. If server socket is down for a while then start again after that can get auto connection with the client which the server connect with previously.If possible can any one help me how to do it?
What I have tried:
This are my code. Can help me to handle this?
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);
}
}
}}
客户
Client
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);
}
}
}
推荐答案
你可以每x秒检查一次单独的线程:
1)检查套接字的最后状态
2)如果不正常或关闭,则(重新)连接
工人线程仅在套接字状态时发送 可以/可用;否则他们返回(直到连接工作人员成功)。
简化客户电话。
You can have a separate thread check the socket every x seconds:
1) Check LAST status of socket
2) If not OK or closed, then (re)connect
The "worker" thread(s) simply "send" only when the socket's "status" is OK / available; else they "return" (until the "connection worker" succeeds).
Simplifies the "client" calls.
这篇关于在socket中关闭服务器后建立自动先前连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文