InputStream.read()在PrintWriter之后返回-1

时间:2017-06-09 16:31:55

标签: java file sockets printwriter

服务器&下面的客户端代码尝试通过名称发送文件:

  • 客户端使用PrintWriter发送文件名,PrintWriter在调用 println 后刷新。之后,客户端使用while循环的常用方法发送文件内容,该循环读取文件,直到InputStream.read返回-1。
  • 服务器使用BufferedReader( readLine )读取文件名。之后,服务器使用相同的while循环读取文件内容。

问题是:当服务器和客户端程序在同一台机器(我的Windows笔记本电脑)上本地执行时,一切都成功执行。 但是,当程序在同一网络上的不同计算机上执行时,服务器端 InputStream.read() 将返回-1。< / p>

我不是在代码中寻找答案。(我已经用DataInputStream重写了)我想知道为什么就是这种情况。

服务器:

try {
        ServerSocket server = new ServerSocket(3000);
        Socket client = server.accept();
        InputStream in = client.getInputStream();
        BufferedReader printIn = new BufferedReader(new InputStreamReader(in));
        String name = printIn.readLine();
        byte[] bytes = new byte[1024*16];
        File file = new File(name);
        FileOutputStream fOut = new FileOutputStream(file);
        int count;
        while ((count = in.read(bytes, 0, bytes.length)) != -1) {
            fOut.write(bytes, 0, count);
        }
        fOut.close();
        server.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

客户端:

try {
        Socket client = new Socket("localhost",3000);
        OutputStream out = client.getOutputStream();
        PrintWriter printOut = new PrintWriter(out,true);
        printOut.println("old.jar");
        byte[] bytes = new byte[1024*16];
        File file = new File("old.jar");
        FileInputStream fIn = new FileInputStream(file);
        int count;
        while((count = fIn.read(bytes,0, bytes.length)) != -1) {
            out.write(bytes, 0, count);
        }
        fIn.close();
        client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:0)

来自评论:“您不能在同一个套接字上混用缓冲的流或读取器.BuffedReader将提前读取并使用以下文件数据的一部分。”

因此,当 BufferedReader.readLine()之后调用 InputStream.read()时,BufferedReader将使用文件数据,因此 InputStream.read( )返回-1。

关于代码在本地连接上成功执行的原因:本地连接可能具有与远程连接不同的打包行为

(信用转到@EJP)