Netty编码解码器:
在网络应用程序中,需要将字节流转换为应用程序对应需要的数据格式。编码器是将应用程序需要的数据格式转换为字节流,解码器是将字节流转换为应用程序需要的数据格式。
解码器主要有两种:ByteToMessageDecode、MessageToMessageDecode。webSocket实现了browser和server的全双工通信。
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import nia.chapter10.WebSocketConvertHandler.MyWebSocketFrame.FrameType;
/**
* 实现在一个类中decode和encode。webSocket实现了浏览器和服务器的全双工。
* @author pc
*
*/
public class WebSocketConvertHandler extends MessageToMessageCodec<WebSocketFrame , WebSocketConvertHandler.MyWebSocketFrame>{
// 将MyWebSocketFrame 编码为 指定的WebSocketFrame。
@Override
protected void encode(ChannelHandlerContext ctx, MyWebSocketFrame msg, List<Object> out) throws Exception {
// TODO Auto-generated method stub
ByteBuf data = msg.getData();
switch(msg.getType()){
case BINARY: out.add(new BinaryWebSocketFrame(data));break;
case CLOSE:
case PING:
case PONG:
case TEXT: out.add(new TextWebSocketFrame(data)); break;
case CONTINUATION:
}
}
// 将WebSocketFrame解码为应用需要的MyWebSocketFrame。
@Override
protected void decode(ChannelHandlerContext ctx, WebSocketFrame msg, List<Object> out) throws Exception {
// TODO Auto-generated method stub
if (msg instanceof BinaryWebSocketFrame){
out.add(new MyWebSocketFrame(MyWebSocketFrame.FrameType.BINARY , msg.content()));
} else if(msg instanceof TextWebSocketFrame){
}
}
//声明 WebSocketConvertHandler 所使用的 OUTBOUND_IN 类型,需要将byte和这种类型相互转换。
public static final class MyWebSocketFrame {
//定义拥有被包装的有效负载的 WebSocketFrame 的类型
public enum FrameType {// 枚举类型。
BINARY,
CLOSE,
PING,
PONG,
TEXT,
CONTINUATION
}
private final FrameType type;
private final ByteBuf data;
public MyWebSocketFrame(FrameType type, ByteBuf data) {
this.type = type;
this.data = data;
}
public FrameType getType() {
return type;
}
public ByteBuf getData() {
return data;
}
}
}