PrintWriter или любой другой поток вывода в Java не знает \r\n

У меня возникли проблемы с использованием PrintWriter или любого другого потока вывода для отправки сообщения между сервером и клиентской программой. Это работает правильно, если я использую println("abc") для связи, но не работает, если я использую print("abc\r\n"), print("abc\n") или print("abc\r" ). Что я имею в виду под «это не работает», так это то, что readLine() не завершится, потому что кажется, что он не видит символ «новой строки» и все еще ожидает «\ r» или «\ n»

Чтобы было понятнее, я просто добавлю несколько кодов в следующее: Клиент:

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

public class Server {
  public static void main(String[] args) throws IOException {

    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(1234);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 1234.");
        System.exit(1);
    }

    Socket clientSocket = null;
    try {
        clientSocket = serverSocket.accept();
    } catch (IOException e) {
        System.err.println("Accept failed.");
    }
    System.out.println("Connected");


    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

    String textFromClient;
    textFromClient = in.readLine(); // read the text from client
    System.out.println(textFromClient); 


    String textToClient = "Recieved";
    out.print(textToClient + "\r\n");  // send the response to client

    out.close();
    in.close();
    clientSocket.close();
    serverSocket.close();
  }
}

Сервер:

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

public class Client {
public static void main(String[] args) throws IOException {

    Socket socket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in));

    try {
        socket = new Socket("localhost", 1234);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host");
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection");
    }
    System.out.println("Connected");

    String textToServer;

    textToServer=read.readLine();
    out.print(textToServer + "\r\n" );  // send to server

    System.out.println(in.readLine()); // read from server

    out.close();
    in.close();
    read.close();
    socket.close();
  }
}

Я хочу использовать print() + "\r\n" вместо println(), потому что серверная программа, которую я пишу, требует, чтобы сообщение, отправляемое с сервера клиенту, должно было содержать "\r\n" в конце, например. "это сообщение от сервера к клиенту\r\n". Я думаю, что println() - это то же самое, что и print("\r\n"), поэтому я не думаю, что мне следует использовать println() + "\r\n", иначе у него будет 2 новой строки. (Хотя я не знаю, как клиентская сторона будет читать с сервера, потому что меня просят просто написать только серверную программу. Они напишут клиентскую сторону, чтобы протестировать мою серверную программу.) Однако я должен отправлять сообщения, содержащие "\ r\n" в конце, но readLine(), кажется, не распознает его. Так что я мог сделать с ним?

Если вы не понимаете мой вопрос, вы можете попробовать приведенные выше коды, и вы поймете, что я имею в виду.


person Joey    schedule 18.03.2013    source источник


Ответы (2)


Вызовите flush() после записи с клиента на сервер, например:

out.print(textToServer + "\r\n" );  // send to server
out.flush(); // here, it should get you going.

flush(): сбрасывает поток вывода и принудительно буферизованные выходные байты для записи.

person VishalDevgire    schedule 18.03.2013
comment
Ты великолепен!!! Я действительно не понимаю, почему flush() заставит это работать. Я также обнаружил, что PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); сделать автоматическую очистку только println(), но не print(). Вот почему println() работает, как и ожидалось, но не print(). Спасибо !! - person Joey; 18.03.2013

Помимо ответа VishalD, не нужно беспокоиться об использовании println() или отправке с помощью \r\n, потому что readline() все равно ищет \n. Из API :

Читает строку текста. Строка считается завершенной переводом строки ('\n'), возвратом каретки ('\r') или возвратом каретки, за которым сразу следует перевод строки.

person ldam    schedule 18.03.2013