套接字,BufferedReader.readline() - 为什么流没有准备好?

时间:2011-12-19 15:28:48

标签: java sockets bufferedreader

我正在学习java,我遇到了套接字的一些问题。我开发了一个简单的客户端 - 服务器应用程序 - 有点敲门,它执行了4个步骤:

  1. 客户端向服务器发送一些消息
  2. 服务器接收并保存到文件
  3. 服务器向客户端发回一些其他消息
  4. 客户收到它们并保存到文件
  5. 第4步出现问题:客户端没有收到消息,也从未退出循环:

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

    其中in是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;

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

    任何帮助我都很感激! :)

2 个答案:

答案 0 :(得分:2)

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

这是构造函数的autoFlush参数的javadoc: 布尔值;如果trueprintlnprintfformat方法将刷新输出缓冲区

答案 1 :(得分:-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();
    }