2013-03-18 154 views
2

我有一個客戶端類和一個服務器類。 如果客戶端向服務器發送消息,服務器會將響應發送回客戶端,然後客戶端將打印它收到的所有消息。Java服務器客戶端readLine()方法

例如,

如果客戶端發送「A」到服務器,然後服務器會發送響應客戶 「1111」。所以我在客戶端類中使用readLine()從服務器讀取消息,然後在控制檯中打印「1111」。

如果客戶端向服務器發送「B」,則服務器將向客戶端 「2222 \ n 3333」發送響應。因此,從客戶端輸出的預期印刷是:

「2222」

「3333」

所以從服務器到客戶端的響應消息可以根據其從客戶端發送消息具有1線或2行到服務器。

我的問題是,我可以如何使用readLine()來讀取從服務器發送到客戶端的消息。更具體地講,如果我用下面的代碼,

String messageFromServer; 
while((messageFromServer = inputStreamFromServer.readLine()) != null) { 
    println(messageFromServer); 
} 

這將只打印第一行,並不會否則打印出任何東西,即使我把從客戶端發送消息到服務器,因爲的readLine()將停止一旦它已閱讀第一行。

更新: 更具體地說,我期待的客戶端類中的一些方法來讀取包含在同一時間從服務器1個或多行消息。我想知道是否有任何方法可以在客戶端執行,如果我不想更改從服務器發送到客戶端的消息格式。

更新2 爲了使我的問題更加明確,我會放一些示例代碼如下所示:

這是服務器:

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 =null; 
String textToClient =null; 
textFromClient = in.readLine(); // read the text from client 
if(textFromClient.equals("A")){ 
    textToClient = "1111"; 
}else if (textFromClient.equals("B")){ 
    textToClient = "2222\r\n3333"; 
} 


out.print(textToClient + "\r\n"); // send the response to client 
out.flush(); 
out.close(); 
in.close(); 
clientSocket.close(); 
serverSocket.close(); 
} 
} 

客戶端:

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; 

    while((textToServer = read.readLine())!=null){ 
     out.print(textToServer + "\r\n"); // send to server 
     out.flush(); 

     String messageFromServer =null; 
     while((messageFromServer = textToServer=in.readLine()) != null){ 
      System.out.println(messageFromServer); 
     } 
    } 
    out.close(); 
    in.close(); 
    read.close(); 
    socket.close(); 
} 

private static void debug(String msg) 
{ 
    System.out.println("Client: " + msg); 
} 
} 

回答

2

你不應該需要改變服務器發送數據的格式,和readLine()應該可以工作,但我懷疑服務器在寫入可能解釋事情的響應後沒有刷新或關閉OutputStream。
是否調用readLine()掛起?你在控制服務器代碼嗎?如果是這樣,你可以包括它嗎?

的工作,因爲我相信你修班預計:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ClientServerTest2 
{ 

    public static void main(String[] args) throws Exception 
    { 
     Thread serverThread = new Thread(new Server()); 
     serverThread.start(); 
     Thread clientThread = new Thread(new Client()); 
     clientThread.start(); 

     serverThread.join(); 
     clientThread.join(); 
    } 

    private static class Server implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      ServerSocket serverSocket = null; 
      try 
      { 
       serverSocket = new ServerSocket(1234); 

       Socket clientSocket = null; 
       clientSocket = serverSocket.accept(); 
       debug("Connected"); 

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

       String textFromClient = null; 
       String textToClient = null; 
       textFromClient = in.readLine(); // read the text from client 
       debug("Read '" + textFromClient + "'"); 
       if ("A".equals(textFromClient)) 
       { 
        textToClient = "1111"; 
       } 
       else if ("B".equals(textFromClient)) 
       { 
        textToClient = "2222\r\n3333"; 
       } 

       debug("Writing '" + textToClient + "'"); 
       out.print(textToClient + "\r\n"); // send the response to client 
       out.flush(); 
       out.close(); 
       in.close(); 
       clientSocket.close(); 
       serverSocket.close(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 

     } 

     private static void debug(String msg) 
     { 
      System.out.println("Server: " + msg); 
     } 
    } 

    private static class Client implements Runnable 
    { 

     @Override 
     public void run() 
     { 
      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())); 
       debug("Connected"); 

       String textToServer; 

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

       String serverResponse = null; 
       while ((serverResponse = in.readLine()) != null) 
        debug(serverResponse); // read from server and print it. 

       out.close(); 
       in.close(); 
       read.close(); 
       socket.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private static void debug(String msg) 
    { 
     System.out.println("Client: " + msg); 
    } 
} 
+0

我發佈了我的服務器代碼和客戶端代碼。請看一下。 – Joey 2013-03-18 17:17:01

+0

我不得不修復一些編譯器錯誤,但曾經有錯誤的部分是if(textFromClient ==「A」)和if(textFromClient ==「B」)''部件。那些需要改爲「if(」A「.equals(textFromClient))」和「if(」B「.equals(textFromClient))」才能工作。然後我用你原來的文章中的循環替換了你的單個readLine()調用:'System.out.println(in.readLine());',while((messageFromServer = inputStreamFromServer.readLine())! = null)',它按預期工作。從客戶端發送「B」導致服務器發回2條預期線路。 – Blake 2013-03-18 17:46:43

+0

我現在編輯了我的答案,將我的修改後的課程包含在上面 – Blake 2013-03-18 18:17:15

0

更改while((messageFromServer = inputStreamFromServer.readLine() != null)while((messageFromServer = inputStreamFromServer.readLine()) != null)

其實這應該不會編譯....

+0

對不起。我的問題不是關於語法錯誤。我正在尋找一些從服務器讀取多行的方法。我只是直接在這裏鍵入這些代碼,所以它可能有一些語法錯誤。我修好了。 – Joey 2013-03-18 16:08:41

0

這是一個工作。

如果你想發送多個字符串,就像你的情況:「2222 \ n 3333」。

您可以通過在兩個字符串之間添加分隔符(如)來發送它們:「2222 : 3333」。

然後,你可以爲

clientOut.write("2222: 3333\n"); 

從服務器端調用write在客戶端解析收到字符串:

messageFromServer = inputStreamFromServer.readLine(); 
String strArray[] = messageFromServer.split(":"); 

strArray[0] : 2222 

strArray[0] : 3333