缘起
socket.io是一个跨浏览器的全平台反响AJAX实现,官网(http://socket.io)定义为:the cross-browser WebSocket for realtime apps.
个人认为这是一个跨浏览器的集大成者,支持桌面端和移动端浏览器(http://socket.io/#browser-support):
Desktop
- Internet Explorer 5.5+
- Safari 3+
- Google Chrome 4+
- Firefox 3+
- Opera 10.61+
Mobile
- iPhone Safari
- iPad Safari
- Android WebKit
- WebOs WebKit
为了支持众多浏览器,必然内置对若干协议的支持:
- WebSocket
- Adobe® Flash® Socket
- AJAX long polling
- AJAX multipart streaming
- Forever Iframe
- JSONP Polling
socket.io跨浏览器,根据浏览器自动适配最适合方案进行实时推送。
官方提供了各种语言的实现,见 https://github.com/learnboost/socket.io/wiki/,有java语言实现服务器端,但不支持最新的0.9版本,于是萌发了重写一个的想法。
概述
这是一个Socket.IO服务器端实现,基于netty框架,适配socket.io 0.9-1.0版本(虽然socket.io 目前还处于 0.9版本,会支持到1.0)
项目地址:
http://code.google.com/p/socketio-netty/
采用流行的Apache License 2.0协议,svn作为源代码管理。
至于为什么没有采用tomcat/jetty支持的servlet3规范、sebsocket实现,个人认为,构建在其基础上较为容易,tomcat7最新版刚刚支持websocket,传说支持websocket的servlet 3.1还未出世,等等看吧。
而Netty这个异步IO框架,我们可以在它的基础上一站式搞定如此多的传输通道/协议。
socketio-netty支持:
- WebSocket
- Flash Socket
- AJAX long polling
- Forever Iframe
- JSONP Polling
等传输通道协议。
示范
本示范,参考 socket.io node.js 版本的聊天实现(chat),客户端完全一致,服务器端完全换成了socketio-netty实现。其它的没有任何变化。嗯,可能看一个示范,可以让人更放心的使用。
客户端入口 chat.html (存放在tomcat/jetty/nginx/apache/iis相应位置,可以直接访问即可):
看一下,我们的服务器端如何实现,来一个启动入口:
然后需要一个DemoChatHandler处理器,这个是一个单列多线程模式:
以上就是整个的聊天室实现,虽然不算优雅,但很简单。
所有你所需要做的就是,检出代码,运行com.yongboy.socketio.test.ChatServer即可。