Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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 nio read()返回-1_Java_Nio_Socketchannel - Fatal编程技术网

Java nio read()返回-1

Java nio read()返回-1,java,nio,socketchannel,Java,Nio,Socketchannel,这不是我第一次试图理解这个问题,但我希望这将是最后一次: 一些背景: 我有一个javasocketchannelnio服务器在非阻塞模式下工作 此服务器有多个客户端,可从中发送和接收消息 每个客户端每隔一段时间通过“keepalive”消息维护与服务器的连接。 服务器的主要思想是,客户端将“一直”保持连接,并以“推送”模式接收来自服务器的消息 现在回答我的问题: 在JavaNIOread()函数中,当read()返回-1时,表示其EOS 在我问的问题中,我意识到这意味着套接字已完成其当前流,不需

这不是我第一次试图理解这个问题,但我希望这将是最后一次:

一些背景:

我有一个
javasocketchannelnio
服务器在非阻塞模式下工作

此服务器有多个客户端,可从中发送和接收消息

每个客户端每隔一段时间通过
“keepalive”
消息维护与服务器的连接。 服务器的主要思想是,客户端将“一直”保持连接,并以“推送”模式接收来自服务器的消息

现在回答我的问题:

在JavaNIO
read()
函数中,当read()返回-1时,表示其EOS

在我问的问题中,我意识到这意味着套接字已完成其当前流,不需要关闭

当我在谷歌上搜索更多关于这方面的信息时,我发现这确实意味着另一端的连接已经关闭

  • “流”这个词的确切含义是什么?是从客户端发送的当前消息吗?客户端连接是否能够发送更多消息

  • 如果客户从未告诉过他要关闭
    SocketChannel
    ,为什么要在客户端关闭

  • read()
    return-1和通过对等I/O错误重置连接之间有什么区别

  • 这是我从
    SocketChannel
    中读到的内容:

    private JSONObject readIncomingData(SocketChannel socketChannel)
            throws JSONException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
        JSONObject returnObject = null;
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        Charset charset = Charset.forName("UTF-8");
        String endOfMesesage = "\"}";
        String message = "";
        StringBuilder input = new StringBuilder();      
        boolean continueReading = true;
        while (continueReading && socketChannel.isOpen()) 
        {
            buffer.clear();         
            int bytesRead = socketChannel.read(buffer);             
            if (bytesRead == -1)
            {
                continueReading = false;                    
                continue;
            }
            buffer.flip();
            input.append(charset.decode(buffer));
            message = input.toString();
            if (message.contains(endOfMesesage))
                continueReading = false;
        }       
        if (input.length() > 0 && message.contains(endOfMesesage))
        {
            JSONObject messageJson = new JSONObject(input.toString());
            returnObject = new JSONObject(encrypter.decrypt(messageJson.getString("m")));
        }           
        return returnObject;
    }
    
    “流”这个词的确切含义是什么?是从客户端发送的当前消息吗

    它是一个字节流,而不是消息流。您可以使用这些字节来形成消息,但流不知道您正在这样做,也不以任何方式支持消息

    如果客户从未告诉过他要关闭SocketChannel,为什么要关闭客户端的SocketChannel

    如果另一端将其关闭,则只能使用-1将其关闭

    read()return-1和通过对等I/O错误重置连接之间有什么区别

    您可以通过其他方式关闭或断开连接,例如从同一侧关闭连接,或者连接超时,例如拔出网络电缆

    顺便说一句:您编写代码的方式更适合阻塞NIO。例如,如果您收到多条完整消息,则第一条消息之后的任何内容都将被丢弃。如果您使用阻塞IO并保留您读取的所有内容,则不会损坏或丢弃消息

    “流”这个词的确切含义是什么?是从客户端发送的当前消息吗

    它是一个字节流,而不是消息流。您可以使用这些字节来形成消息,但流不知道您正在这样做,也不以任何方式支持消息

    如果客户从未告诉过他要关闭SocketChannel,为什么要关闭客户端的SocketChannel

    如果另一端将其关闭,则只能使用-1将其关闭

    read()return-1和通过对等I/O错误重置连接之间有什么区别

    您可以通过其他方式关闭或断开连接,例如从同一侧关闭连接,或者连接超时,例如拔出网络电缆


    顺便说一句:您编写代码的方式更适合阻塞NIO。例如,如果您收到多条完整消息,则第一条消息之后的任何内容都将被丢弃。如果您使用阻塞IO并保留您阅读的所有内容,您将不会收到损坏或丢弃的消息。

    流这个词的确切含义是什么?是从客户端发送的当前消息吗?客户端连接是否能够发送更多消息?

    流是指在两个位置之间流动的数据,通常在客户端和服务器之间流动,但实际上它是任何类型的数据流动。例如,如果从硬盘读取文件,则使用FileInputStream,它表示从光盘上的文件流向程序的数据。这是一个非常通用的概念。把它想象成一条河流,水就是数据。另外,这是一条非常凉爽的河流,可以让你控制水/数据的流动方式

    如果客户从未告诉他要关闭SocketChannel,为什么要在客户端关闭SocketChannel?

    如果客户端和服务器之间的连接被重置或中断,就会发生这种情况。您的程序永远不应该假设连接处于活动状态,并且从未中断。由于各种原因,连接会中断,可能是因为网络组件不牢固,有人拔出插头,最好留在原来的位置,或者是因为无线网络故障。此外,服务器可能会关闭连接,例如,如果服务器程序停机、出现错误或连接超时。请始终记住,打开的连接是有限的资源,因此,如果空闲时间过长,服务器可能会决定关闭它们

    read()返回-1和通过对等I/O错误重置连接之间有什么区别?

    当read()返回-1时,这意味着流中当前没有更多的数据。连接重置意味着可能有更多数据,但连接不再存在,因此无法再读取该数据。再次以河流命名法为例:将数据视为使用连接两个村庄(连接点)的河床从上游村庄(又名Serverville)向下游村庄(又名Clientville)输送的水量。现在,Serveville的某个人拉着大杠杆,水(数据)从Serveville流到Clientville。Serveville输送完所有想要输送的水后,它会关闭杠杆,河床将再次变空(实际上,随着连接的关闭,河床将被破坏)。这就是Clientville得到-1的地方。现在想象一下,有一辆推土机打断了河床,而一些水却无法到达克利恩特维尔。这是“连接重置”情况

    呵呵