笔者的男装网店:http://shop101289731.taobao.com 。冬装,在寒冷的冬季温暖你。新品上市,环境选购

=================================不华丽的分割线===============================

因为公司使用的是Netty框架。所以也就去学习了一下。貌似Netty虽然是一个蛮不错的开源框架。但是国内的文档貌似都不是很多。绝大部分都是3.x版本的资料。二最新的版本是4.0.11final(我目前使用的版本)

Netty 官网 :http://netty.io

Netty本身在4.x版本的时候大量连续的版本更新,终于趋于稳定。在4.0.10开始final。也决定好好的写点东西。顺便当做学习笔记来写来自己的学习过程。

Netty4.x相比于3做了很大的改动。大量的改动导致以前的代码不兼容。所以在国内来说。资源资料的匮乏直接导致了我学习相当的艰难。作为一个英语并不好的程序员来说。硬着头皮去看英文指南。文档。和相关的开源项目。

4.x版本的更新说明(官方原版):http://netty.io/wiki/new-and-noteworthy.html

中文翻译版(源自:开源中国的文章):http://www.oschina.net/translate/netty-4-0-new-and-noteworthy

这个翻译版比较古老啦。翻译的一部分内容。我也不是特别认同。推荐大家看英文原版。

改动什么的我就不自己记录了。

官方的文档提供了相对应的文档。API,示例及用户引导。资料目前来讲都是比较旧的。不知道是不是作者没什么时间更新吧。但是大致的思想已经改了。都是属于4.x版本的更新。

--------------------------不华丽的分割线---------------------------

正式内容:

我自己写了一个比较简单的小东西。来辅助自己实现Netty和Flex配合实现Socket通信。当然。代码还在逐步的完善。希望自己能够早点写好他

先讲一下使用到的jar包

两个Flex....包是必须的。有需要的可以自己去BlazeDS查看

先来一个AMF3转换工具类。

这个东西是网上看的代码。转换其实没什么差别的。原理都是一样的原理

 package com.engine.util;

 import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Input;
import flex.messaging.io.amf.Amf3Output;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class AMF3Utils { private static final Logger LOG = LoggerFactory.getLogger(AMF3Utils.class); /**
* Java Object 转换为 AMF3
* @param msg
* @return
* @throws Exception
*/
public static ByteBuf getAMF3FromObject(Object msg) throws Exception {
if(msg == null){
return null;
}
// Create and instance of the byte array output stream to write the AMF3
// object to.
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
// Create the AMF3Output object and set its output stream.
final Amf3Output amf3Output = new Amf3Output(SerializationContext.getSerializationContext());
amf3Output.setOutputStream(bout);
// Write the AMF3 object to the byte array output stream after
// converting the source java object.
amf3Output.writeObject(msg);
// Flush and close the stream.
amf3Output.flush();
amf3Output.close(); return Unpooled.wrappedBuffer(bout.toByteArray());
} /**
* AMF3 转换为 Java Object
* @param byteBuf
* @return
* @throws Exception
*/
public static Object getObjectFromAMF3(ByteBuf byteBuf) throws Exception {
ByteArrayInputStream bis = new ByteArrayInputStream(byteBuf.readBytes(byteBuf.readableBytes()).array());
return getObjectFromAMF3(bis);
} /**
* AMF3 转换为 Java Object
* @param inputStream
* @return
* @throws Exception
*/
public static Object getObjectFromAMF3(ByteArrayInputStream bis) throws Exception {
Object obj = null;
final Amf3Input amf3Input = new Amf3Input(SerializationContext.getSerializationContext());
try {
amf3Input.setInputStream(bis);
// Read object does the actual work of conversion.
obj = amf3Input.readObject();
// Close the stream
amf3Input.close();
} catch (ClassNotFoundException e) {
LOG.error("Error in AMF3Utils: {}.\n " + "Check if flash class has corresponding java class.", e);
throw e;
} catch (IOException e) {
LOG.error("IO error in AMF3Utils: {}.", e);
throw e;
}
return obj;
}
}

Netty解码

 package com.engine.netty.server.handler.codec;

 import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder; import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.engine.util.AMF3Utils; public class DecoderAMF3 extends MessageToMessageDecoder<Object> { private static final Logger LOG = LoggerFactory.getLogger(DecoderAMF3.class); @Override
protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
if (msg == null) {
LOG.warn("Incoming message is null.");
return;
}
try {
ByteBuf byteBuf = (ByteBuf) msg;
ByteArrayInputStream bis = new ByteArrayInputStream(byteBuf.readBytes(byteBuf.readableBytes()).array()); Object obj = AMF3Utils.getObjectFromAMF3(bis);
out.add(obj);
} catch (IOException e) {
LOG.error("IO Error: {}.", e);
throw e;
}
}
}

Netty编码

 package com.engine.netty.server.handler.codec;

 import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder; import java.io.IOException;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.engine.util.AMF3Utils; public class EncoderAMF3 extends MessageToMessageEncoder<Object> { private static final Logger LOG = LoggerFactory.getLogger(EncoderAMF3.class); @Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
try {
ByteBuf byteBuf = AMF3Utils.getAMF3FromObject(msg);
out.add(byteBuf);
} catch (IOException e) {
LOG.error("IO Error: {}.", e);
throw e;
}
}
}

目前为止这么写。基本上flex的socket通信就可以正常的转换接受和发送的数据了。但是还需要解决发包格式等问题。以避免很多问题。这个我自己在写这篇文章的时候还未解决。准备今天花点时间解决这个小问题。O(∩_∩)O哈哈~

【推荐文章】AMF协议简介: http://yunzhongxia.iteye.com/blog/663747

【Netty学习】Netty 4.0.x版本和Flex 4.6配合的更多相关文章

  1. Netty学习——Netty和Protobuf的整合(二)

    Netty学习——Netty和Protobuf的整合(二) 这程序是有瑕疵的,解码器那里不通用,耦合性太强,有两个很明显的问题,但是要怎么解决呢?如:再加一个内部类型 Person2,之前的代码就不能 ...

  2. Netty学习——Netty和Protobuf的整合(一)

    Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...

  3. netty学习--netty源码中的部分util方法

    io.netty.buffer.AbstractByteBuf#calculateNewCapacity  申请内存空间 private int calculateNewCapacity(int mi ...

  4. Netty学习之客户端创建

    一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...

  5. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  6. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  7. Netty学习路线总结

    序 之前开过品味性能系列.Mysql学习系列,颇为曲高和寡.都是讲理论,很少有手把手深入浅出的文章.不过确实我就这脾气,文雅点的说法叫做"伪雅",下里巴人叫做"装逼&qu ...

  8. netty学习记录1

    最近在学习netty,看的是<netty权威指南 第2版>. 然后看的同时也把书上面的代码一行行敲下来做练习,不过到第三章就出问题了. 按照书上讲的,sever/client端都需要继承C ...

  9. Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍

    在前几节我们学习过处理粘包和拆包的问题,用到了Netty提供的几个解码器对不同情况的问题进行处理.功能很是强大.我们有没有去想这么强大的功能是如何实现的呢?背后又用到了什么技术?这一节我们就来处理这个 ...

随机推荐

  1. schedule和scheduleAtFixedRate区别

    需求: 由于系统长期运作,各设备之间产生很多信息,一段时间后需要清除数据 考虑方案: 用schedule还是scheduleAtFixedRate,在此比较分析了下这两个的区别 schedule和sc ...

  2. Entity Framework走马观花之把握全局

    在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本文的目的就在于此. 一.理解EF数据模型 EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个 ...

  3. hdu 4685 二分匹配+强连通分量

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...

  4. foxmail收发gmail彻底失败

           周一一上班,发现gmail无法收取邮件,刚开始以为网络不稳定,后来经过百度发现原因是 gmail邮箱也被屏蔽了. 虽然可以FQ,保证gmail邮箱暂时使用,但是不可否认,在当前的形势下, ...

  5. A*(A星)算法python实现

    在春节放假前两天我偶然看到了A\*算法(A\*算法是一个启发式的地图寻路算法),感觉挺有意思.正好放假前也没有什么事情,就花了一个下午写出算法的骨架,节后又花了半天时间完善屏幕输出的细节并且调试完成. ...

  6. livevent的几个问题

    关于libevent的几个问题 1.他到底是如何保证这个套接字有效的 主线程去断开关闭套接字,主线程去调用buffwrite,在子线程收到客户端断开时,主线程延迟1分钟释放,这样保证子线程操作完该so ...

  7. HDU1014Uniform Generator

    Uniform Generator Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   ...

  8. 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列

    1.我的思路先将b链表连接在a链表的后面,这个很容易实现,将a链表最后的结点中的p.next改为指向b链表的头结点即可. 再将这个新链表用选择排序即可. 代码如下: #include<stdio ...

  9. ios 获取n个月前或者n个月后的日期

    NSCalendar *calendar = [NSCalendar currentCalendar]; NSRange range = [calendar rangeOfUnit:NSDayCale ...

  10. 在centos 6.5 在virtual box 上 安装增强版工具

    centos 6.5 在virtual box 上 安装增强版工具: 出现:centos unable to find the source of your current linux kernel ...