Вопрос по сокетам, Java

Есть вопрос по программе из второго тома Хорстманна:

package server;

import java.io.*;
import java.net.*;
import java.nio.charset.*;
import java.util.*;

/**
 * This program implements a simple server that listens to port 8189 and echoes back all
 * client input.
 * @version 1.22 2018-03-17
 * @author Cay Horstmann
 */
public class EchoServer
{
   public static void main(String[] args) throws IOException
   {
      // establish server socket
      try (var s = new ServerSocket(8189))
      {
         // wait for client connection
         try (Socket incoming = s.accept())
         {
            InputStream inStream = incoming.getInputStream();
            OutputStream outStream = incoming.getOutputStream();
   
            try (var in = new Scanner(inStream, StandardCharsets.UTF_8))
            {
               var out = new PrintWriter(
                  new OutputStreamWriter(outStream, StandardCharsets.UTF_8),
                  true /* autoFlush */);
      
               out.println("Hello! Enter BYE to exit.");
      
               // echo client input
               var done = false;
               while (!done && in.hasNextLine())
               {
                  String line = in.nextLine();
                  out.println("Echo: " + line);
                  System.out.println(line);
                  if (line.trim().equals("BYE")) done = true;
               }
            }
         }
      }
   }
}

Она работает правильно, но есть одно НО. При вводе текста стереть его клавишей Backspace нормально не получается. Например, если я ввёл текст "Hello" и нажал три раза на Backspace, то ситуация будет такой: "He|llo". Если после этого нажать три раза на клавишу с цифрой 1 (или любую другую клавишу, выводящую текст на экран), то текст будет следующим: He111. При этом если этот текст вывести в стандартный поток вывода System.out (то есть на консоль), то Backspace'ы в нем будут сохранены как символы: Hello???111. Какая причина у этой проблемы и как её можно устранить?


Ответы (1 шт):

Автор решения: Sergei Kirjanov

Клиент посылает все нажатия, как символы.

Сервер реагирует специально только на перевод строки.

В конкретном случае можно поменять значение полученной line самому.

В реальном приложении использовать готовые библиотеки для сервера и совместимые клиенты.

→ Ссылка