2011-12-19 27 views
2

我正在学习java,我遇到了一些插座问题。我开发了一个简单的客户端 - 服务器应用程序 - 那种敲敲敲,它执行4个步骤:套接字,BufferedReader.readline() - 为什么流没有准备好?

  1. 客户端发送一些信息给服务器
  2. 服务器临危他们并保存到文件
  3. 服务器返回给客户端一些其他的消息
  4. 客户临危他们,同时也可以保存的文档

问题出现在第4步:客户端没有收到消息,并且永远不会退出循环:

while ((inStr = in.readLine()) != null) { 
    writer.println(inStr); 
} 

其中是BufferedReader类型:

try { 
     socket = new Socket(ipAddress, 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

在服务器端发送消息:

try { 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream()));     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

...

out.println("test from server #1"); 
    out.println("test from server #2"); 

在客户端我看着in.ready() - 它返回false。在服务器端,我看到out.checkError() - 它返回true;

我在做什么错 - 为什么是空的流?

任何帮助ia感谢! :)

+0

有什么异常? – Tudor 2011-12-19 15:43:31

+0

在写完行后尝试'out.flush()'。 – nos 2011-12-19 15:44:24

+0

@Sergio:正如你所说,发送消息的服务器代码在哪里? – 2011-12-19 15:46:50

回答

-1

这可能/可能无法解决您的问题。但请尽量保留Try Catch块中的所有内容。例如:您的ServerSocket初始化,写入程序块等。如果发生错误,您可能无法使用写入器,所以在初始化时没有意义。
 您可以尝试写入标准输出流以进行调试而不是文件。服务器/客户端的代码是你的一个小的变体,它的工作。

服务器:

Socket socket; 
    ServerSocket srvSocket; 
    BufferedReader in; 
    PrintWriter out; 
    try { 
     srvSocket=new ServerSocket(4444); 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out.println("test from server #1"); 
     out.println("test from server #2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

客户

Socket socket; 
    BufferedReader in; 
    PrintWriter out; 
    String inStr; 
    try { 
     socket = new Socket("127.0.0.1", 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while ((inStr = in.readLine()) != null) { 
      System.out.println(inStr); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

它不。而他的原始代码并没有太大的不同。 – EJP 2011-12-19 23:24:13

+0

@EJP我在我的日食中运行相同的代码。我在我的控制台中获得输出。我首先启动服务器,然后客户端 – Sumit 2011-12-20 02:45:11

+0

我提到你的第一句话。 println()解决了他的问题,而不是异常处理。 – EJP 2011-12-20 03:25:56

2

您正在使用public PrintWriter(OutputStream out, boolean autoFlush)这将在新行或println自动刷新。 它在每次写入后都不自动刷新。每次写入后都必须刷新。

这里是构造函数的autoFlush参数的javadoc: 一个布尔值;如果true,println,printfformat方法将刷新输出缓冲区

+0

谢谢,但在每个println()后尝试刷新() - 如果我用[code] inStr = in.readline()替换循环,结果相同 – Sergio 2011-12-19 23:38:46

+0

; System.out.println(inStr); inStr = in.readline(); System.out.println(inStr); [/ code]为了从流中读取2行 - 它工作得很好 – Sergio 2011-12-20 00:17:19

相关问题