本文主要是介绍NIO网络编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
服务端
需要不断循环从selector里拿key
客户端
selectkey需要获取后立马从select里删除,不然会循环拿这个selectkey
阻塞与非阻塞模型
网络断开处理
- try catch住 selectorKey的获取channel方法以及channel的操作,因为这些操作会在断开连接的时候抛错。断开连接不可避免,所以需要在catch住异常的时候把key从selector中剔除,需要调用key.cancel()
- 如果是客户端调用close方法正常断开,那么需要在调用read的时候,根据read返回结果判断是否等于-1,来决定是否需要把key从seletor中删除
粘包处理&&消息边界
- 自定义分割符,比如\n
- 客户端服务端商量好大小
- 定义一种结构TLV(type length value)/LTV(length type value):http1.1使用TLV,http2.0使用LTV
优缺点:
- 自定义分隔符实现简单,缺点每一个字符都要去判断是否是分隔符,效率低下,如果发送的数据比较长,需要考虑扩容
- 客户端与服务的对其大小,缺点是浪费带宽,客户端发送数据不足也得补齐
- TLV/LTV 优点是节省带宽,需要多少读多少,缺点是服务器需要提前分配byteBuffer,如果内容过大,影响server吞吐量
扩容的处理
读取不到消息的边界,就需要扩容扩容时需要注意把之前读取的byteBuffer数据放到扩容后的byteBuffer里,可以通过attach 属性将byteBuffer放入socketChanner,这里有个复制问题,后面用零拷贝解决
这篇关于NIO网络编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!