读取SocketChannel时出现意外的网络错误

时间:2013-12-31 20:47:07

标签: java tcp nio

我正在写NIO的网络服务器。我有点完成了实现,但同时我对以下代码片段有一个疑问:

private void readDataFromSocket(SocketChannel socketChannel) throws IOException {   
        BUFFER.clear();
        int count = 0;
        while ((count = socketChannel.read(BUFFER)) > 0) {
            BUFFER.flip();
            int limit = BUFFER.limit();
            while (limit > 0) {
                System.out.print((char) BUFFER.get());
                limit--;
            }
            System.out.println("");
        }
        if (count < 0) {
            System.out.println("closing the socket!!!");
            socketChannel.close();
        }
    }

我的假设是,如果客户端关闭套接字,那么read(socketChannel.read(BUFFER))将给我-1。我的假设是否正确?

第二个问题: 假设客户寄给我:

发送:abcdef

发送:adnvjvnfkjnvkj

比发送“sfnskdlfnsdknfsdkj”发生了一些网络错误。那么服务器会得到什么?

我的假设是服务器将获得:

abcdef

adnvjvnfkjnvkj

比服务器会出错。我是正确的还是服务器可能会获得一半数据sfnskdlfn而不是错误?感谢。

2 个答案:

答案 0 :(得分:1)

  1. 正确。如果对等方关闭连接,则read()返回-1。
  2. 这是不可能的。数据可以以任何方式在发送方缓冲,或者一次发送一个字节,或者介于两者之间。不保留每个write()所写内容之间的界限。你可以得到任何东西,或一切,或介于两者之间的任何东西。

答案 1 :(得分:-1)

问题1:根据the SocketChannel documentation,您将收到ClosedChannelException。

问题2:您的服务器将缓冲数据直到错误发生,如果它发生在客户端写入的中间,那么它将包含一半的数据。这是假设在发送数据之前客户端没有缓冲,但最终没关系,你不应该依赖服务器获得“完整”或“无数据”,它可能会得到不完整的数据。