2013-03-18 1 views
5

У меня возникли проблемы с использованием PrintWriter или любого другого выходного потока для отправки сообщения между сервером и клиентской программой. Он работает правильно, если я использую println («abc») для связи, но он не работает, если я использую print («abc \ r \ n»), print («abc \ n») или print («abc \ r»)). То, что я подразумеваю под «не работает», заключается в том, что readLine() не закончится, потому что кажется, что он не видит символ «новой строки», и он все еще ждет «\ r» или «\ n»PrintWriter или любой другой поток вывода в Java не знают « 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(); 
    } 
} 

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

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

ответ

10

заподлицо() после того, как вы пишете от клиента к серверу:

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

Он работал.

+2

Вы удивительны !!! Я действительно не понимаю, почему flush() заставит его работать. Я также обнаружил, что PrintWriter out = новый PrintWriter (clientSocket.getOutputStream(), true); только сделайте println() автоматический сброс, но не print(). Вот почему println() работает так, как ожидалось, но не print(). Спасибо !! – Joey

2

На вершине ответ VishalD, нет никакой необходимости беспокоиться об использовании println() или отправки с \r\n потому readline() ищет \n в любом случае. От API:

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

 Смежные вопросы

  • Нет связанных вопросов^_^