Netty编解码技术和UDP实现(2)

@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        try {
            Resp resp = (Resp) msg;
            System.out.println("Client : " + resp.getId() + ", " + resp.getName() + ", " + resp.getResponseMessage());
        } finally {
            ReferenceCountUtil.release(msg);
        }
    }

@Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

}

@Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

}


/**
 * Marshalling工厂
 *
 */
public final class MarshallingCodeCFactory {

/**
    * 创建Jboss Marshalling解码器MarshallingDecoder
    *
    * @return MarshallingDecoder
    */
    public static MarshallingDecoder buildMarshallingDecoder() {
        // 首先通过Marshalling工具类的精通方法获取Marshalling实例对象 参数serial标识创建的是java序列化工厂对象。
        final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
        // 创建了MarshallingConfiguration对象,配置了版本号为5
        final MarshallingConfiguration configuration = new MarshallingConfiguration();
        configuration.setVersion(5);
        // 根据marshallerFactory和configuration创建provider
        UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration);
        // 构建Netty的MarshallingDecoder对象,俩个参数分别为provider和单个消息序列化后的最大长度
        MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024 * 1024 * 1);
        return decoder;
    }

/**
    * 创建Jboss Marshalling编码器MarshallingEncoder
    *
    * @return MarshallingEncoder
    */
    public static MarshallingEncoder buildMarshallingEncoder() {
        final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
        final MarshallingConfiguration configuration = new MarshallingConfiguration();
        configuration.setVersion(5);
        MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration);
        // 构建Netty的MarshallingEncoder对象,MarshallingEncoder用于实现序列化接口的POJO对象序列化为二进制数组
        MarshallingEncoder encoder = new MarshallingEncoder(provider);
        return encoder;
    }
}

public class Req implements Serializable {

private static final long serialVersionUID = 1L;

private String id;
    private String name;
    private String requestMessage;
    private byte[] attachment;

public String getId() {
        return id;
    }

public void setId(String id) {
        this.id = id;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getRequestMessage() {
        return requestMessage;
    }

public void setRequestMessage(String requestMessage) {
        this.requestMessage = requestMessage;
    }

public byte[] getAttachment() {
        return attachment;
    }

public void setAttachment(byte[] attachment) {
        this.attachment = attachment;
    }
}

public class Resp implements Serializable {

private static final long serialVersionUID = 1L;

private String id;
    private String name;
    private String responseMessage;

public String getId() {
        return id;
    }

public void setId(String id) {
        this.id = id;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getResponseMessage() {
        return responseMessage;
    }

public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }

}

工具类:

public class GzipUtils {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/aa0cc971fe6dd2659eb420278d229c7e.html