分享

用Resin4实现WebSocket (简单聊天室demo)

 用勿龍潛 2014-07-16
  • 一、简介:
    规范的目标是在浏览器中实现和服务器端双向通信。本文基于resin4使用WebSocket实现了一个简单的聊天室demo。
    WebSocket需要浏览器首先向服务器发出建立链接请求,然后服务端发出回应。是一个简单的握手过程。握手成功后,双方的链接也就建立成功了,之后就可以直接发送消息了。握手消息头如下:


    01.Request Headers::
    02.Connection:Upgrade
    03.Host:192.168.33.247
    05.Sec-WebSocket-Key:k685VzFQc/sTHdSZhlwLGg==
    06.Sec-WebSocket-Version:13
    07.Upgrade:websocket
    08.-----------------------
    09.Response Headers::
    10.Connection:Upgrade
    11.Content-Length:0
    12.Date:Wed, 21 Nov 2012 08:52:42 GMT
    13.Sec-WebSocket-Accept:A95+L06MV5iDruLH0K1zgINLHoI=
    14.Server:Resin/4.0.32
    15.Upgrade:websocket


     

    主要用的核心类包括:
    (1) WebSocketServletRequest :建立链接(握手)
    (2) WebSocketContext :发送消息
    (3) WebSocketListener :监听消息

    二、resin4集群配置
    因为测试的时候首先是利用resin4部署了一个resin集群,所以这里首先将resin4的集群部署介绍下。
    Resin4支持快速配置cluster,通过简单的配置即可实现一个resin集群。最简单的配置只需要修改resin. Properties中的app_servers配置项。将集群的配置依照顺序填进上去即可:
    测试使用了三台机器,示例配置如下:
    app_servers : 10.22.32.185 10.22.32.186 10.22.32.187
    注意:三台机器的配置项需要一致

    相关命令示例:
    (1) 启动: ~/resin/bin/resin.sh –conf conf/resin.xml start
    (2) 注意:在启动的时候,有时候会发现启动不成功的情况,可以单台启动,比如:
    ~/resin/bin/resin.sh –conf conf/resin.xml -server app-0 start
    其中app-0代表集群中的第一台机器,其他类推
    (3) 部署:~/resin/bin/resinctl deploy /tmp/test.war
    在实际中部署完还需要使用:~/resin/bin/resinctl web-app-start test 命令启动下。 www.

    部署并启动成功后,一个resin集群就配置完成了。

    三、聊天室demo 
    这里基于resin4+websocket实现了一个聊天室的demo,主要逻辑如下:
    (1) 浏览器发起建立socket的链接
    (2) 服务端servlet建立链接,并将相关的socket保存到一个map中
    (3) 客户端发送聊天信息
    (4) 服务器监听到消息后,将消息广播出去。

    主要实现了两个类:
    1、MyServlet类:建立链接
    其中service主要是功能是建立websocket练级并将链接保存
    示例代码如下:


    01.import com.caucho.websocket.WebSocketContext;
    02.import com.caucho.websocket.WebSocketServletRequest;
    03.import com.caucho.websocket.WebSocketListener;
    04......
    05.public class MyServlet extends HttpServlet {
    06.private static Hashtable map_socket = new Hashtable(50);
    07. 
    08.public void service(HttpServletRequest req,HttpServletResponse res) throwsIOException, ServletException
    09.{
    10.String protocol = req.getHeader("Sec-WebSocket-Protocol");
    11.WebSocketListener listener;
    12.listener = new MyListener();
    13.//res.setHeader("Sec-WebSocket-Protocol", "my-protocol");
    14. 
    15.WebSocketServletRequest wsReq = (WebSocketServletRequest) req;
    16.WebSocketContext webSocketContext = wsReq.startWebSocket(listener);
    17.map_socket.put(webSocketContext.hashCode(),webSocketContext);
    18.}
    19. 
    20.public static HashtablegetSockList()
    21.{
    22.return map_socket;
    23.}
    24. 
    25.}

    2、 MyListener:监听并广播消息
    监听了onStart、onReadText、onDisconnect三个事件
    示例代码如下:


    01.public class MyListener implements WebSocketListener {
    02.@Override
    03.public void onStart(WebSocketContext webSocketContext) throws IOException {
    04.PrintWriter out = webSocketContext.startTextMessage();
    05.out.print("start ok");
    06.out.close();
    07.}
    08. 
    09.@Override
    10.public void onReadText(WebSocketContext webSocketContext, Reader reader) throwsIOException {
    11.PrintWriter out = null;
    12.int ch;
    13.String text = "";
    14.while ((ch = reader.read()) >= 0) {
    15.text = text+(char)ch;
    16.}
    17.int id = webSocketContext.hashCode();
    18.Hashtable map = MyServlet.getSockList();
    19.Iterator iter = map.entrySet().iterator();
    20.while (iter.hasNext())
    21.{
    22.Map.Entry entry = (Map.Entry)iter.next();
    23.WebSocketContext w = (WebSocketContext)entry.getValue();
    24.out = w.startTextMessage();
    25.out.print(id + ": " + text);
    26.out.close();
    27.}
    28.reader.close();
    29.}
    30. 
    31.@Override
    32.public void onDisconnect(WebSocketContext webSocketContext) throws IOException {
    33.Hashtable map = MyServlet.getSockList();
    34.map.remove(webSocketContext.hashCode());
    35.//To change body of implemented methods use File | Settings | File Templates.
    36.}
    37. 
    38.}

    3、测试页面的代码如下:


    01.var socket;
    02.function display() {
    03.var valueLabel = document.getElementById(“valueLabel”);
    04.valueLabel.innerHTML = “”;
    05.var ws = new WebSocket(
    06.“ws://localhost/www/MyServlet”);
    07. 
    08.ws.onmessage = function(evt) {
    09.valueLabel.innerHTML = valueLabel.innerHTML + “
    10.” + evt.data;
    11.};
    12. 
    13.ws.onclose = function(evt) {
    14.valueLabel.innerHTML = “onClose”;
    15.};
    16. 
    17.ws.onopen = function() {
    18.ws.send(“Hello, All guys”);
    19.};
    20.socket = ws;
    21.}
    22. 
    23.function say()
    24.{
    25.socket.send(speak.value);
    26.}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多