最近在做一个业余项目,期望在项目中学习Java语言,在这个过程中遇到了ByteBuffer,感觉在这个项目中是一个很重要很基础的一个东西,所以借这个机会学习了一下,以此为记。
flapmmo-20140225\src\main\java\org\javaee7\websocket\flapmmo\FlapEndpoint.java
package org.javaee7.websocket.flapmmo; import java.io.IOException; import java.nio.ByteBuffer; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.OnClose; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket") public class FlapEndpoint { @OnMessage public void onMessage(ByteBuffer data, Session session) throws IOException { //System.out.println("echoBinary: " + data); for (byte b : data.array()) { System.out.print(Integer.toHexString(b & 0xFF).toUpperCase() + " "); } System.out.println(" "); ByteBuffer bb = ByteBuffer.allocate(256); bb.put((byte)0); bb.putInt(0x12345678); session.getBasicRemote().sendBinary(bb); } @OnOpen public void onOpen () { System.out.println("Client connected"); } @OnClose public void onClose () { System.out.println("Connection closed"); } }
代码逻辑:
当浏览器端向WebSocket服务器发送数据,onMessage方法将会执行,数据以字节缓冲区的形式保存在参数data中。服务器收到数据,调用onMessage方法,将数据以十六进制的形式打印出来,并创建一个新的字节缓冲区bb,在bb中填充要发送的数据,并将数据发送给浏览器端。
http://docs.oracle.com/javase/7/docs/api/
java.lang.Object
java.nio.Buffer
java.nio.ByteBuffer
public abstract class ByteBuffer
extends Buffer
implements Comparable<ByteBuffer>
A bytebuffer.
Modifier and Type |
Method and Description |
static ByteBuffer |
allocate(int capacity) Allocates a new byte buffer. |
byte[] |
array() Returns the byte array that backs this buffer (optional operation). |
abstract ByteBuffer |
put(byte b) Relative put method (optional operation). |
abstract ByteBuffer |
putInt(int value) Relative put method for writing an int value (optional operation). |
ByteBuffer用法小结
http://blog.csdn.net/mars5337/article/details/6576417
在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBuffer的用法是有必要牢固掌握的.
1.创建ByteBuffer
1.1 使用allocate()静态方法
ByteBufferbuffer=ByteBuffer.allocate(256);
以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区.
学习socketnio 之ByteBuffer
http://blog.csdn.net/maosijunzi/article/details/14127481
1:什么是ByteBuffer?
ByteBuffer就是字节缓冲区。
2:ByteBuffer是用来干什么的?
顾名思义,它是用来存放字节的。很常用的地方就是程序向网络中传送数据的时候。
3:怎么使用ByteBuffer?
要使用ByteBuffer,理解其中3个指针是很重要的:position、limit和capacity
这三个指针的关系是 position<=limit<=capacity
position是当前读写的位置。
limit是最大能读写的位置。
capacity是缓冲区的容量。
一段程序:
1:ByteBufferbuffer = ByteBuffer.allocate(5); position=0,limit=5,capacity=5
2:buffer.put((byte)1); position=1,limit=5,capacity=5
3:buffer.flip(); position=0,limit=1,capacity=5
4:buffer.get(); position=1,limit=1,capacity=5
第一行:创建一个ByteBuffer,初始化状态下,postion为0,limit=capacity=缓冲区大小
第二行:往缓冲区放一个字节,position就会往后移动一下,但是不会超过limit。如果超过会报错。
第三行:flip方法会把limit设为position的值,而position还原为0,为读缓冲区做准备。
第四行:从缓冲区内读取一个字节,position会往后移动一下,但是不会超过limit,如果超过会报错。