Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字输入流不';t在流的末尾返回-1_Java_Sockets_Inputstream_Serversocket_Bytearrayoutputstream - Fatal编程技术网

Java 套接字输入流不';t在流的末尾返回-1

Java 套接字输入流不';t在流的末尾返回-1,java,sockets,inputstream,serversocket,bytearrayoutputstream,Java,Sockets,Inputstream,Serversocket,Bytearrayoutputstream,这是出现问题的代码段: public static byte[] copyLargeExt(InputStream input) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024*8]; int n = 0; while(-1 != (n = input.read(b

这是出现问题的代码段:

public static byte[] copyLargeExt(InputStream input) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024*8];
        int n = 0;
        while(-1 != (n = input.read(buffer))) {
            baos.write(buffer, 0, n);
        // i just append this pattern ({###END###}) to force the break  
           /*if(baos.toString(UTF8.name()).endsWith("{###END###}")) {
                break;
            }*/
        }
        return baos.toByteArray();
    }

有人能帮我吗?

问题中的代码一直读到套接字流的末尾。如果该方法是阻塞的并且在读调用中,那么这只能意味着另一端尚未关闭其相应的输出流

你有两个选择:

  • 更改另一端以关闭其outputstream,以便此代码将看到EOF

  • 更改“协议”,以便此代码知道需要多少字节的数据。。。读取的字节数正好是这个数


    • 问题中的代码读取到套接字流的末尾。如果该方法是阻塞的并且在读调用中,那么这只能意味着另一端尚未关闭其相应的输出流

      你有两个选择:

      • 更改另一端以关闭其outputstream,以便此代码将看到EOF

      • 更改“协议”,以便此代码知道需要多少字节的数据。。。读取的字节数正好是这个数

        • 在Java中。
          如果服务器只使用
          Socket.close()
          而不使用
          OutputStream.close()
          ,则客户端的
          InputStream.read()
          将不会返回
          -1

          相反,客户端的
          InputStream.read()
          将一直阻塞到超时。 因此,服务器上的最佳实践是:

          OutputStream.close();
          InputStream.close();
          Socket.close();
          
          在Java中。
          如果服务器只使用
          Socket.close()
          而不使用
          OutputStream.close()
          ,则客户端的
          InputStream.read()
          将不会返回
          -1

          相反,客户端的
          InputStream.read()
          将一直阻塞到超时。 因此,服务器上的最佳实践是:

          OutputStream.close();
          InputStream.close();
          Socket.close();
          

          那就是永远循环?你的输入流从哪里来?它不会永远循环,但不会返回任何内容。输入流来自Google(Postman)。当套接字关闭时,将到达流的末尾。谁正在关闭套接字?是否看到只有在回写OutputStream后才能关闭套接字,以便永远循环?你的输入流从哪里来?它不会永远循环,但不会返回任何内容。输入流来自Google(Postman)。当套接字关闭时,将到达流的末尾。谁正在关闭套接字?查看只有在写回OutputStream后才能关闭套接字。我想知道它在
          InputStream.close()中做了什么。
          ?这会发送一个表示EOF的特殊字符吗?我想知道它在
          InputStream.close()中的作用?这是否会发送一个特殊字符来表示EOF?