Текст DataOutputStream от сервера к клиенту имеет странный отступ и выдает 4 - PullRequest
0 голосов
/ 20 мая 2018

Прямо сейчас я пытаюсь создать сервер, который может отображать сообщения клиенту при подключении (через localhost).Когда я подключаюсь через telnet, это дает мне странные отступы.Код для сервера:

    private ServerSocket middleman;
    private int port = 8080;
    private Socket client;


protected void createSocketServer()
{

    try
    {
        while (true){
            middleman = new ServerSocket(port);
            client = middleman.accept();
            middleman.close();
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String line;

            //Client stuff
            DataOutputStream dOut = new DataOutputStream(client.getOutputStream());

            while((line = in.readLine()) != null)
            {
                System.out.println("echo: " + line);

                dOut.writeByte(1);
                dOut.writeUTF("Good day to you user. Here is a selection of poems " + "\n");
                dOut.writeUTF("1. Cupcake Poem"  + "\n");
                dOut.flush();

                //Response
                if(line.equals("cupcake")){
                    try{
                        FileReader fileReader = new FileReader(poem);
                        BufferedReader bufferedReader = new BufferedReader(fileReader);
                        StringBuffer stringBuffer = new StringBuffer();
                        String poemLine;
                    while((poemLine = bufferedReader.readLine()) != null){
                        stringBuffer.append(poemLine);
                        stringBuffer.append("\n");
                    }
                    fileReader.close();
                    System.out.println("Contents of file:");
                    //System.out.println(stringBuffer.toString());
                    dOut.writeUTF(stringBuffer.toString());
                    dOut.flush();
            } catch(IOException e){
            e.printStackTrace();
            }
                }
                else{
                    System.out.println("wrong!, the line is:" + line);
                }
            }
        }
    }
    catch(IOException e)
    {
        System.out.println(e);
    }
}

На стороне клиента я открою командную строку и наберу telnet localhost 8080, а затем напишу что-то вроде «рыба».Будет напечатано

[?]Good day to you user. here is a selection of poems
                                                       1. Cupcake Poem

Почему это происходит?Если я наберу "cupcake" на клиенте, он будет читать файл, но со странным интервалом.Это как-то связано с Telnet?

1 Ответ

0 голосов
/ 20 мая 2018

Для Telnet правильная последовательность конца строки равна "\r\n".Новая строка сама по себе будет переходить только к следующей строке, но не будет возвращаться к первой колонке, что и делает возврат каретки.

Также обратите внимание, что порядок имеет значение, спецификация telnet говорит, что ондолжно быть "\r\n", в этом порядке.

Кроме того, вам не нужно добавлять выходные данные с новой строкой-последовательностью, как вы это делаете.Вы можете написать все это одной строкой:

dOut.writeUTF("1. Cupcake Poem\r\n");
...