Вопрос по сокетам, 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 шт):
Клиент посылает все нажатия, как символы.
Сервер реагирует специально только на перевод строки.
В конкретном случае можно поменять значение полученной line самому.
В реальном приложении использовать готовые библиотеки для сервера и совместимые клиенты.