2013-03-18 14 views
5

Ho problemi nell'utilizzo di PrintWriter o di qualsiasi altro flusso di output per inviare messaggi tra il server e il programma client. Funziona correttamente se uso println ("abc") per comunicare, ma non funziona se uso print ("abc \ r \ n"), print ("abc \ n") o print ("abc \ r"). Quello che intendo per "non funziona" è che readLine() non finirà perché sembra non vedere il carattere "newline" e sta ancora aspettando "\ r" o "\ n"PrintWriter o qualsiasi altro flusso di output in Java non si conosce " r n"

Per fare più chiaro, ho semplicemente messo alcuni codici di seguito: il cliente:

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(); 
    } 
} 

Server:

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(); 
    } 
} 

voglio usare print() + "\ r \ n" invece di println() perché il programma server che sto scrivendo ha il requisito che il messaggio inviato dal server al client deve contenere "\ r \ n" alla fine, ad es. msgstr "questo è il messaggio dal server al client \ r \ n". Penso che println() sia lo stesso di print ("\ r \ n"), quindi non penso che dovrei usare println() + "\ r \ n", altrimenti avrà 2 newline. (Anche se non so come leggerà il lato client dal server perché mi viene chiesto di scrivere solo il programma server. Scriveranno il lato client per testare il mio programma server.) Tuttavia, dovrei inviare i messaggi contengono "\ r \ n "alla fine, ma readLine() sembra non riconoscerlo. Quindi cosa potrei fare con questo?

Se non capisci la mia domanda, puoi provare i codici di cui sopra e capirai cosa intendo.

risposta

10

flush() dopo che si scrive dal client al server:

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

Ha funzionato.

+2

Sei incredibile !!! Non capisco davvero perché flush() lo farà funzionare comunque. Ho anche scoperto che PrintWriter out = new PrintWriter (clientSocket.getOutputStream(), true); solo eseguire println() auto flush ma non print(). Ecco perché println() funziona come previsto ma non print(). Grazie !! – Joey

2

In cima a risposta di VishalD, non c'è bisogno di preoccuparsi utilizzando println() o l'invio con \r\n perché readline() cerca i \n comunque. Da API:

Legge una riga di testo. Una riga viene considerata terminata da uno qualsiasi di un avanzamento riga ('\ n'), un ritorno a capo ('\ r') o un ritorno a capo seguito immediatamente da un avanzamento riga.