NIO使用出现的问题总结

使用NIO实现TCP的通信,通过buffer缓冲区进行数据的读取。

出现的问题:客户端向服务端发送的数据包(长度是48到52的包不等长度),buffer申请的空间是1024,用于接收数据,服务端启动,进行数据通信时,客户端在短时间内发送的数据包非常多的情况下,buffer从channel中读取的数据的长度有100到700不等。

第一次分析问题的时候,对数据NIO机制也许不太清楚,所以造成了误解。误区:因为数据包非常多,这样一来,因为buffer的长度是1024,所以数据就被合并了,而且合并的长度不等。然后将buffer的空间申请成了54,虽然经过改吧改吧业务上没有出现了问题,但是这个问题还是依然存在。

第二次分析是与导师讨论的时候,从中得到启发的,NIO通信,channel是作为通道,而buffer是作为缓冲区(其实上一次分析就buffer这一点没有仔细深思),buffer只是作为一个数据传送的介质,并不真正的存放数据,存放数据由服务器提供的string字符串存放,因此buffer只作为这个数据包传送的介质,数据包有多大,传送到string字符串中的数据就有多大,跟buffer本身的大小并没有关系,buffer大只能说明,传送的次数变少了,小则次数变多了。所以根本问题就是:数据包在发送到channel中的时候就已经被合并了。这样一来,数据的合并只能在TCP这一层了,看到网上有说,TCP是流式管道,即使分多次调用接口发送数据,但是TCP可能组成一个包或几个连续的包到对端,因此出现这种状况本身来说是不可避免的,故我们只需要将不需要的数据包丢掉即可。

猜你喜欢

转载自blog.csdn.net/qq_37978623/article/details/80922776
今日推荐