netty+flash xmlsocket 在线聊天室

这几天公司做了个简单的web im聊天室。麦包包晒包频道 右下角的“包打听”。

采用netty 做socket server + flash client. 通讯采用自定义的JSON文本。

在线IM初步的探索,现阶段做的比较简单。

目前就部署1台服务器。没有考虑多机通信。没有涉及通信队列。

总共代码不到1000行。netty的确强大。

关键代码分享:

无话可说的代码,netty通用设置。

由于采用JSON协议。

上行通道:

  1. DelimiterBasedFrameDecoder 读取缓存时,已\0\r\n 为中止符
  2. StringDecoder 二进制转字符串进行UTF-8解码
  3. StringEncoder 字符串UTF-8编码

下行通道:

  1. MessageHandler 业务逻辑处理
  2. MessageEncoder JSON转字节流打入下行通道

netty没有提供\0截取。不过重写部分代码即可。

逻辑处理:

  1. 处理flash 的policy file request
  2. 处理业务逻辑

具体业务在    MessageDispatchHandler 处理一些业务逻辑即可。

 

总结下遇到的问题:

  1. flash socket通讯格式。每个协议请求都会\0作为消息结尾。因此netty接收消息也必须以\0为截止符读取消息。
  2. flash 安全策略。flash夸域访问服务器时,会自动发<policy-file-request/> ,服务端收到消息后,必须响应对应策略文件。
  3. SQL注入。Socket和Http相比。只是通讯的层次发生了改变。应用本身的漏洞仍旧没变。处理SQL的时候需要特别注意。不过用一些成熟的ORM框架可以很好的避免这类问题。
    注:这里使用的是比较低级的JSON字符串作为消息载体,较为普遍和靠谱的做法是采用head+body的方式,但前提需要对格式有严格的约定。JSON灵活性较大,因此采用。

2 条评论。

  1. 你好,Fred。今天刚看到你的网站。在浏览的时候看到netty 这一节。因为我最近也写了个用netty的项目。在看到
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {} 这个事件的时候。你做了这些处理
    MessageDispatchHandler messageDispatchHandler = new MessageDispatchHandler(e);
    messageDispatchHandler.setListener(new ChatRoomListenerImpl());
    messageDispatchHandler.dispatch();
    我查了下netty的api 没有MessageDispatchHandler这个类,很显然是你本人写的。我猜想你这个用于业务逻辑处理的类。加上了事件监听。我对你这个业务处理的类结构很感兴趣。不知道你能否公开下。或发邮件到hailuo610@qq.com 。因为我写这部分的时候感觉写的不是很好。最后向你表示感谢。并且你的小站做的很好。

    • 谢谢关注,已经公开。主要是把数据、连接、事件都分开处理。数据的不同选择不同的事件。比较简单。此外这里做了监听器完全是多余的,实际意义不大