websocket入门教程(转载)

转载自:http://blog.csdn.net/kaitiren/article/details/9187533


简单介绍一下tomcat的webSocketAPI使用:


在这里啰嗦几句:【
很多朋友听说webSocket不知道是什么。知道是什么不知道怎么用,知道怎么用不知道具体实现。其实我当初也是这样。
实际上webSocket可以简单的理解为用浏览器与服务器简单socket连接,但是用了一个特殊的协议,偶收协议,它与http协议发送的报头不一样。
websocket需要服务器和浏览器支持,浏览器不支持,也就无法使用这个技术。服务器可以自己实现协议连接,但是我们不准备自己实现(其实看需求,至少对我来说不需要),当然目前javaEE官方不支持这个实现,没有规范(据说jsr356准备支持,期待来年【2013】javaEE7吧)
目前实现的java服务端第三方webSocketAPI不算少,比如jetty就是一种(多的我也举例不了,我只知道,没研究过有多少实现。)tomcat也自带了实现API
webSocket想要手动实现比较麻烦,可以看下tomcat实现过程,大致都一样。
总之一句话,webSocket是一种客户端与服务端连接socket的技术,实现即时消息,取代comet但是并没广泛只用,因为大多需要浏览器的支持,相对comet有很多优点,此处不举例说明。可以自己google一下。
】
 

tomcat7.027如何实现webSocket程序:
总的来说,实现webSocket的servlet要继承WebSocketServlet这个类。这个类是tomcat自己包装的servlet。
所有的入口都在protected StreamInbound createWebSocketInbound(String subProtocol) {}这个方法。 也就是说,我们实现这个方法,就可以实现握手协议了。
注意看这个方法。 要求返回StreamInbound类型。这个类型我们需要继承自己实现。打开源码观看这个类
有如下方法



![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_1cbd262ea9371bb.png)



上面的方法都是要我们自己实现的。tomcat没有给我们实现。
仔细看都是onXxx格式,类似事件监听。其实也差不多。只是tomcat在得到消息或者链接发生变化的时候会去调用这些方法,实现方法“自动”触发。
仔细看源码还有很多函数可以使用,这里不一一介绍。感兴趣可以打开源码看看。
其实仔细看官方的例子,chat那个例子也能得到这个结论(tomcat的webSocket例子需要tomcat7.027才带有)

我们定义一个servlet

![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_49bd11fdd581ed5.png)



 doget不用说,是连接的开始,然后取出登录的用户,这个是为了管理连接使用的,你在看这个例子的时候不需要doget方法和theUser声明,只要有createWebSocketInbound方法就行。上面说了。这个方法是webSocket的入口。其实也是WebSocketServlet这个类写好的doget,我们看WebSocketServlet的doget是如何写的



![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_4aa0025193114db.png)


![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_dd885fd30b1351d.png)





注意倒数第三行,调用了createWebSocketInbound方法,我们重写这个方法。


Java代码  http://blog.csdn.net/kaitiren/article/details/9187533
![](http://c5ms.iteye.com/p_w_picpath/icon_star.png)


@Override
      
protected StreamInbound createWebSocketInbound(String subProtocol) {          
return 
new ChatMessageInbound(theUser);      }  
上面的ChatMessageInbound是我自己定义的继承类。

![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_5d1403d20a17b84.png)



 这里只是简单实现了一下,注释部分只是处理这个方法的部分,那里是一个容器,存档所有在线用户。并且提供遍历插入以及删除等方法,在自己实现的时候完全不需要这么写。
下面是容器代码

![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_c0e7d7b1b2aea25.png)




我定义了一种数据交约定,使用json 字符串,MsgType表示消息类型,类似windows的消息机制
/** 
 * 前台和后台交互的信息类型常量 
 *  
 * @author WangZhenChong 
 *  
 */  
public final class MsgTypeConstants {  
    public static short GET_USER_LIST = 1;// 在线所有用户信息交互  
    public static short SEND_ONE_TO_ONE = 2;// 对一个用户发送消息  
    public static short SEND_ONE_TO_ALL = 3;// 对所有用户发送消息  
    public static short SEND_SERVER_MSG = 4;// 发送系统消息  

}  
 余下的msgContent就是消息内容,比如列出现在用户这个内容就是...,...,...,...]发送消息就是消息模型的内容。
这样解决单通道多操作的方法。
 
 
下面列出前台js核心内容。
使用jquery

![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_ee22ec7c16e79c8.png)


![](http://www.cocoachina.com/bbs/p_w_upload/Fid_41/41_265187_14532dccdc698f7.png)

:14::14::14::14::14:很好的分享

…it’s ok?

呵呵


你是在自娱自乐吗?