2013-03-18 206 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