java tcp套接字检查客户端已断开连接

java tcp套接字检查客户端已断开连接,java,sockets,tcp,Java,Sockets,Tcp,我想检查我的客户是否有断开连接的情况。根据我的研究,一种可能的方法是我可以继续给客户写信。如果客户端无法接收消息,则表示它已断开连接。我向相应的客户端发送消息“Checking Connection:Client”+clientNo 我将clientNo 1连接到服务器并接收 客户1 "Checking Connection: Client1" <-- output every 10secs "Checking Connection: Client1" <-- output ever

我想检查我的客户是否有断开连接的情况。根据我的研究,一种可能的方法是我可以继续给客户写信。如果客户端无法接收消息,则表示它已断开连接。我向相应的客户端发送消息“Checking Connection:Client”+clientNo

我将clientNo 1连接到服务器并接收

客户1

"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
Client.java

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JDialog;
import javax.swing.JOptionPane;


public class Client {
    public static void main(String args[]) {
        clientConnection();
    }

    public static void clientConnection() {
        Socket clientSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;

        try {
            clientSocket = new Socket("localhost", 5550);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 

        try {
            out = new ObjectOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }   

        try {
            in = new ObjectInputStream(clientSocket.getInputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }  

        byte[] byteData = null;
        while(true) {
            try {
                byteData = receive(in);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(new String(byteData));
        }
    }

    public static byte[] receive(ObjectInputStream is) throws Exception {
        try {
            byte[] inputData = new byte[1024];
            is.read(inputData);
            return inputData;
        }
        catch (Exception exception) {
            throw exception;
        }
    }
}

您的
ObjectInputStream
ObjectOutputStream
Server
类的一部分。使它们成为
acceptClient
类的成员,应该就可以了。

您应该在try块内启动线程,而不是在catch块后启动线程。取决于try块成功与否的代码必须在try块内.目前,在同一个已接受的套接字上启动两个线程会有一定的风险。
"Checking Connection: Client1" <-- output every 10secs 
"Checking Connection: Client1" <-- output every 10secs 
"Checking Connection: Client1" <-- output every 10secs 
"Checking Connection: Client2" <-- output every 10secs 
"Checking Connection: Client2" <-- output every 10secs 
"Checking Connection: Client2" <-- output every 10secs 
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    private int portNo = 0;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private boolean clientAlive = true;

    @SuppressWarnings("resource")
    public Server(int portNo) {
        Socket socket = null;
        this.portNo = portNo;
        ServerSocket sSocket = null;
        int clientNo = 1;
        try {
            sSocket = new ServerSocket(this.portNo);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        while(true) {
            try {
                socket = sSocket.accept();
            } catch (IOException e) {
                e.printStackTrace();
            }
             new Thread(new acceptClient(socket,clientNo)).start();
             clientNo += 1;
        }
    }

    class acceptClient implements Runnable {
        Socket socket;
        int clientNo = 1;
        String writeToClient = "";

        public acceptClient(Socket socket, int clientNo) {
            this.socket = socket;
            this.clientNo = clientNo;
        }

        public void run() {
            try {
                out = new ObjectOutputStream(socket.getOutputStream());
                in = new ObjectInputStream(socket.getInputStream());
            } catch(IOException exception) {
                System.out.println("Error: " + exception);
            }

            while(clientAlive) {
                writeToClient = "Checking Connection: Client" + clientNo;
                sendData(out, writeToClient.getBytes());

                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if(!clientAlive) {
                    break;
                }

            }
        }
    }

    public synchronized void sendData(ObjectOutputStream os, byte[] byteData) {
        if (byteData == null) {
            return;
        }
        try {
            os.write(byteData);
            os.flush();
        }
        catch (Exception e) {
            System.out.println("Client Disconnected");
            clientAlive = false;
        }
    }

    public static void main(String[] args) {
        System.out.println("Server started");
        new Server(5550);
    }
}
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JDialog;
import javax.swing.JOptionPane;


public class Client {
    public static void main(String args[]) {
        clientConnection();
    }

    public static void clientConnection() {
        Socket clientSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;

        try {
            clientSocket = new Socket("localhost", 5550);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 

        try {
            out = new ObjectOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }   

        try {
            in = new ObjectInputStream(clientSocket.getInputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }  

        byte[] byteData = null;
        while(true) {
            try {
                byteData = receive(in);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(new String(byteData));
        }
    }

    public static byte[] receive(ObjectInputStream is) throws Exception {
        try {
            byte[] inputData = new byte[1024];
            is.read(inputData);
            return inputData;
        }
        catch (Exception exception) {
            throw exception;
        }
    }
}