Java NIO 处理粘包、断包问题

NIO socket是非阻塞的通讯模式,与IO阻塞式的通讯不同点在于NIO的数据要通过channel放到一个缓存池ByteBuffer中,然后再从这个缓冲池中读出数据,而IO的模式是直接从inputstream中read。所以对于NIO,由于存在缓冲池的大小限制和网速的不均匀会造成一次读的操作放入缓存池中的数据不完整,便形成了断包问题。同理,如果一次性读入两个及两个以上的数据,则无法分辨两个数据包的界限问题,也就造成了粘包。对于NIO的SocketChannel每次触发OP_READ事件时,发送端不一定仅仅写入了一次,同理,发送端如果一次发送数据包过大,那么发送端的一次写入也可能会被拆分成两次OP_READ事件,所以OP_READ事件和发送端的OP_WRITE事件并不是一一对应的。

解决思路:

定义数据发送协议格式,数据头中包含包体的长度大小,接收方首先读取包体的长度,然后按照包体的长度进行一次或多次读取数据,从而组装成完整合法的数据内容。

猜你喜欢

转载自pzh9527.iteye.com/blog/2361687