nio 问题

使用java.nio包后,建立连接后,读取的请求数据都是buffer,那如何实现读取一个数据包的需求呢?(数据包的长度是第一个字节)以前用stream流来考虑的话,非常直观,但是现在的nio是使用的ByteBuffer,难道我要对ByteBUffer中的byte数据重新做队列来实现读数据包的需求?

或许是我的观念还停留在流的概念上//:<

buffer有很多子类啊,如StringBuffer等。
NIO需要改变到对Buffer操作的观点。

确实需要重新对字节进行操作,nio提供了许多方法可以让你很方便的操作字节,比如要截取整型长度,可以使用 int length=buffer.getInt();

数据包的长度不是第一个字节,是前四个字节

网络协议基本的通讯单位是一个一个的消息包。在用socket传输这些包的时,首先要解决的一个问题是如何解决包与包之间的边界问题。socket传输的是流,一个send中发出的消息,在对方不一定在一个recv中收到,可能要多次recv,或者一个recv收到多个send中放出的包。所以必须由应用层协议自己来解决包的定界问题。通常有两种方法,一种是每个包以一个特殊的字符或者字符串来结束,如http协议就是以两个'\n'作为一个消息的结束标记;另一种方法就是,所有的消息都有一个固定长度的消息头,在消息头中指出这条消息的长度。我们的协议是采用第二种方法,这也是大部分协议采用的方法。

NIO,也是按字节读的,buffer是通过channel通道消息包传递过来放在buffer缓存中的吧,不应该说在传buffer吧?? 还是要按字节读哦……


欢迎进入17037443 网络编程群讨论,共同学习探讨