java - 检测套接字中的断开连接

标签 java sockets

我正在创建一个“回显”服务器,在收到消息后只需将其发回。我已经设法让多客户端工作,但我想进行某种断开连接检测。我尝试通过从服务器发送单个字符,然后从客户端回复另一个字符来使其工作。但我无法让它发挥作用。

您建议我如何进行断开连接检测?

消息服务器.java

import java.net.*;
import java.io.*;

public class MessageServer {
    static int clientCount = 0;
    public static void main(String[] args) throws IOException {
        try(ServerSocket servSocket = new ServerSocket(16384)){
            while(true){
                Socket socket = servSocket.accept();
                addClient();
                new ServerThread(socket, clientCount).start();

            }

        } catch(IOException e) {
            System.out.println("Exception caught when trying to listen on port 16384 or listening for a connection");
            System.out.println(e.getMessage());
        }

    }

    public static void addClient(){
        clientCount++;
    }
}

服务器线程.java

import java.net.*;
import java.io.*;

public class ServerThread extends Thread {
    private Socket cltSocket;
    private BufferedReader in;
    private PrintWriter out;
    private int num;
    public ServerThread(Socket clientSocket, int count) {
        cltSocket = clientSocket;
        num = count;
    }
    public void run() {
        String input;

        try {
            out = new PrintWriter(cltSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(cltSocket.getInputStream()));
            System.out.println("Client " + num + " connected!");

            while(cltSocket.isConnected() && !cltSocket.isClosed()){
                if(in.ready()){
                    input = in.readLine();
                    if(input != null && !(input.equalsIgnoreCase("exit"))){
                        System.out.print("New input: ");
                        System.out.println(input);
                        out.println(input);
                        out.flush();
                    } else if(input.equalsIgnoreCase("exit")){
                        disconnect();
                    }
                }
            }
        } catch(SocketException e) {
            disconnect();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }

    public void disconnect(){
        System.out.println("Client " + num + " disconnected!");
        out.close();
        try {
            in.close();
            cltSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

MessageClient.java

import java.net.*;
import java.io.*;

public class MessageClient {

    public static void main(String[] args) {

        if(args.length != 2) {
            System.out.println("Invalid parameters! Format as: (hostname) (port)");
            System.exit(1);
        }

        String hostname = args[0];
        int port = Integer.parseInt(args[1]);

        try {
            Socket socket = new Socket(hostname, port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedReader con = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Connected!");

            while(socket.isConnected() && !socket.isClosed()){
                String output;
                if(con.ready()) {
                    output = con.readLine();
                    out.println(output);
                    if(output.equalsIgnoreCase("exit")) {
                        socket.close();
                    }
                }

                if(in.ready()){
                    String li = in.readLine();
                    if(li != null) {
                        System.out.println(li);
                    }
                }
            }


            System.out.println("Disconnected!");
            con.close();
            out.close();
            in.close();
            System.exit(0);
        } catch(SocketException e) {
            System.err.println("Socket error:" + e);
        } catch(UnknownHostException e) {
            System.err.println("Invalid host");
        } catch(IOException e) {
            System.err.println("IO Error: " + e);
        } 

    }

}

最佳答案

有一种方法可以做到这一点:

如果您通过调用 BufferedReader.getLine() 读取 BufferedReader,而另一端套接字已消失,则会收到 SocketException。 ..这是检查丢失连接的一种方法

关于java - 检测套接字中的断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725235/

相关文章:

java - 协调使用 BufferedReader 和 DataInputStream

java - TCP Socket 交换 kryo 序列化对象

java - 使用 Selenium RC + Java 进行动态字段处理

java - 在 Spring Rest get 请求中映射 100 多个 url 参数

java - Java中接受Socket连接失败

java - 如何找到服务器可以处理的最大并发连接数?

Java 套接字 - 如何向多个线程发送消息?

java - 根据导航栏类别过滤列表

java - 两个 Jpanel 未显示在 Jframe 中

java - 执行查询时出现 MyBatis NumberFormatException