正确断开客户端(telnet)与 ServerSocket 的连接

Properly disconnect client (telnet) from ServerSocket

我想要一个简单的服务器套接字来接受客户端并读取一些文本并断开客户端与自身的连接。作为客户端,我现在使用 telnet,因为将来我会创建一个自定义程序。

    ServerSocket ss = new ServerSocket(SERVER_SOCKET_PORT); 
    Socket s = ss.accept();

    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String line;
    while (true) {
        line = reader.readLine();
        if (line == null || line == "" || line == "q") {
            log("-- breaking the loop");
            break;
        }

        printf("**%s%n", line);
    }
    reader.close();
    s.close();
    ss.close();

我遇到的问题是 while 循环永远不会中断。

首先,这不是比较 String(s) 是否相等的方式。其次,我更喜欢 String.isEmpty() 而不是测试与 "" 的相等性。最后,您可以使用 try-with-resourcesclose 一切。像,

try (ServerSocket ss = new ServerSocket(SERVER_SOCKET_PORT);
        Socket s = ss.accept();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(s.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
        if (line.isEmpty() || line.equalsIgnoreCase("q")) {
            System.out.println("-- breaking the loop");
            break;
        }

        System.out.printf("**%s%n", line);
    }
} catch (Exception e) {
    e.printStackTrace();
}
while (true) {
    line = reader.readLine();
    if (line == null || line == "" || line == "q") {

The problem I'm having is the while loop never breaks.

所以同行从不

  • 关闭连接
  • 通过(错误应用的)== 运算符
  • 发送与 "" 比较的空行
  • 发送仅由 "q" 加上行终止符组成的字符串。

写这个循环的正常方法是:

while ((line = reader.readLine()) != null)
{
    if (line.isEmpty() || line == "q") {
        log("-- breaking the loop");
        break;
    }

    printf("**%s%n", line);
}

但是,如果对等方从未关闭连接或发送 "q",则此循环永远不会退出。您是否发送任何会产生这些条件之一的东西?

disconnect the client from itself

这是没有意义的。请重述。