使用InputStream read()后流不接收数据

时间:2017-08-28 19:38:22

标签: java io stream

我在开发一个简单的应用程序时遇到了与I / O相关的问题,我不确定为什么我的代码无法正常工作。我只采用了一些不起作用的代码,并做了一个简单的例子。

服务器类

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serversocket = new ServerSocket(56700);
        Socket socket = serversocket.accept();
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        while (true) {
            String line;
            if ((line = br.readLine()) != null) {

                System.out.println(line);

                switch (line) {
                    case "line":
                        System.out.println(br.readLine());
                        break;

                    case "file": {

                        try (FileOutputStream fos = new FileOutputStream(new File("file.txt"))) {

                            byte[] bytes = new byte[4096];

                            int count;
                            while ((count = is.read(bytes)) > 0) {
                                fos.write(bytes, 0, count);
                            }
                        }
                        break;
                    }
                }
            }
        }
    }
}

客户等级

public class Client {

    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("localhost", 56700);
        PrintWriter pw = new PrintWriter(socket.getOutputStream());

        pw.write("line\n");
        pw.write("line test\n");
        pw.flush();

        try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) {

            pw.write("file\n");
            pw.flush();

            byte[] bytes = new byte[4096];
            int count;
            while ((count = fis.read(bytes)) > 0) {
                fos.write(bytes, 0, count);
            }

        } catch (IOException ex) {
            System.out.println("Error sending the file.");
        }

        pw.write("\n");
        pw.write("line\n");
        pw.write("line test 2\n");
        pw.flush();

    }
}

基本上,我有一个客户端正在向服务器发送数据。客户端使用PrintWriter write(String str)在感兴趣的数据之前写一行,以识别发送的信息类型:文本行或文件。如您所见,服务器使用BufferedReader readLine()读取文本行,使用InputStream read(byte[] bytes)读取文件中的字节。客户端首先发送一行文本,然后发送文件中的数据作为字节,最后再发送一行文本。

问题是服务器成功发送和接收文件后,它不会收到文本行。我检查并意识到BufferedReader永远不会收到这行文本。正如您所看到的,我在写入文件数据后写了一个\n,以防出现问题,但它无法正常工作。我可能遗漏了与这些流的功能有关的事情。

有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

此代码中的问题:

try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) {

    pw.write("file\n");
    pw.flush();

    byte[] bytes = new byte[4096];
    int count;
    while ((count = fis.read(bytes)) > 0) {
        fos.write(bytes, 0, count);
    }

} catch (IOException ex) {
    System.out.println("Error sending the file.");
}

你使用try-finally和OutputStream fos = socket.getOutputStream(),在退出try-finally代码块之后你编程关闭socket.getOutputStream(),因为try-finally始终在隐式{{1}中调用close方法阻止。您finally在此使用相同的PrintWriter

SocketOutputStream

但是这个流已经关闭了。

试试这个:

pw.write("\n");
pw.write("line\n");
pw.write("line test 2\n");
pw.flush();

如果你只使用一个,那就更好了:PrintWriter或OutputStream