grizzly1.9.46 chat

http://antwerkz.com/glassfish-web-sockets-sample/

 

1  /*
2   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3   *
4   * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.
5   *
6   * The contents of this file are subject to the terms of either the GNU
7   * General Public License Version 2 only ("GPL") or the Common Development
8   * and Distribution License("CDDL") (collectively, the "License").  You
9   * may not use this file except in compliance with the License.  You can
10  * obtain a copy of the License at
11  * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
12  * or packager/legal/LICENSE.txt.  See the License for the specific
13  * language governing permissions and limitations under the License.
14  *
15  * When distributing the software, include this License Header Notice in each
16  * file and include the License file at packager/legal/LICENSE.txt.
17  *
18  * GPL Classpath Exception:
19  * Oracle designates this particular file as subject to the "Classpath"
20  * exception as provided by Oracle in the GPL Version 2 section of the License
21  * file that accompanied this code.
22  *
23  * Modifications:
24  * If applicable, add the following below the License Header, with the fields
25  * enclosed by brackets [] replaced by your own identifying information:
26  * "Portions Copyright [year] [name of copyright owner]"
27  *
28  * Contributor(s):
29  * If you wish your version of this file to be governed by only the CDDL or
30  * only the GPL Version 2, indicate your decision by adding "[Contributor]
31  * elects to include this software in this distribution under the [CDDL or GPL
32  * Version 2] license."  If you don't indicate a single choice of license, a
33  * recipient has the option to distribute your version of this file under
34  * either the CDDL, the GPL Version 2 or to extend the choice of license to
35  * its licensees as provided above.  However, if you add GPL Version 2 code
36  * and therefore, elected the GPL Version 2 license, then the option applies
37  * only if the new code is made subject to such option by the copyright
38  * holder.
39  */
40
41 package com.sun.grizzly.samples.websockets;
42
43 import com.sun.grizzly.tcp.Request;
44 import com.sun.grizzly.websockets.ProtocolHandler;
45 import com.sun.grizzly.websockets.WebSocket;
46 import com.sun.grizzly.websockets.WebSocketApplication;
47 import com.sun.grizzly.websockets.WebSocketException;
48 import com.sun.grizzly.websockets.WebSocketListener;
49
50 public class ChatApplication extends WebSocketApplication {
51     @Override
52     public WebSocket createWebSocket(ProtocolHandler protocolHandler, WebSocketListener... listeners) {
53         return new ChatWebSocket(protocolHandler, listeners);
54     }
55
56     @Override
57     public boolean isApplicationRequest(Request request) {   //判断是否websocket应用
58         final String uri = request.requestURI().toString();
59         return uri.endsWith("/chat");
60     }
61
62     @Override
63     public void onMessage(WebSocket socket, String text) {   //收到从客户端来的消息 ,WebSocket socket, String text已经实例化
64         if (text.startsWith("login:")) {
65             login((ChatWebSocket) socket, text);
66         } else {
67             broadcast(((ChatWebSocket) socket).getUser() + " : " + text);   //消息处理消耗方式
68         }
69     }
70
71     private void broadcast(String text) {     / //将消息广播
72         WebSocketsServlet.logger.info("Broadcasting : " + text);
73         for (WebSocket webSocket : getWebSockets()) {  //   WebSocketApplication类下面的方法:protected Set<WebSocket>getWebSockets()   Returns a set of WebSockets, registered with the application. The returned set is unmodifiable, the possible modifications may cause exceptions.
74             if (!webSocket.isConnected()) {
75                continue;
76             }
77             try {
78                 send((ChatWebSocket) webSocket, text);

79             } catch (WebSocketException e) {
80                 e.printStackTrace();
81                 WebSocketsServlet.logger.info("Removing chat client: " + e.getMessage());
82                 webSocket.close();
83             }
84         }
85     }
86
87     private void login(ChatWebSocket socket, String frame) {
88         if (socket.getUser() == null) {
89             WebSocketsServlet.logger.info("ChatApplication.login");
90             socket.setUser(frame.split(":")[1].trim());              //刚登陆,设置ChatWebSocket的用户名字,自己定义的类,并在所有socket广播
91             broadcast(socket.getUser() + " has joined the chat.");
92         }
93     }
94
95     public void send(ChatWebSocket webSocket, String data) {
96         webSocket.send(toJsonp(webSocket.getUser(), data));//send(String data)        Write the data to the socket.    //将消息发给客户端,每个websocket都发送一份

97     }
98
99     private String toJsonp(String name, String message) {
100        return "window.parent.app.update({ name: \"" + escape(name) + "\", message: \"" + escape(message) + "\" });\n";
101    }
102
103    private String escape(String orig) {
104        StringBuilder buffer = new StringBuilder(orig.length());
105
106        for (int i = 0; i < orig.length(); i++) {
107            char c = orig.charAt(i);
108            switch (c) {
109                case '\b':
110                    buffer.append("\\b");
111                    break;
112                case '\f':
113                    buffer.append("\\f");
114                    break;
115                case '\n':
116                    buffer.append("<br />");
117                    break;
118                case '\r':
119                    // ignore
120                    break;
121                case '\t':
122                    buffer.append("\\t");
123                    break;
124                case '\'':
125                    buffer.append("\\'");
126                    break;
127                case '\"':
128                    buffer.append("\\\"");
129                    break;
130                case '\\':
131                    buffer.append("\\\\");
132                    break;
133                case '<':
134                    buffer.append("&lt;");
135                    break;
136                case '>':
137                    buffer.append("&gt;");
138                    break;
139                case '&':
140                    buffer.append("&amp;");
141                    break;
142                default:
143                    buffer.append(c);
144            }
145        }
146
147        return buffer.toString();
148    }
149}

 

 

41package com.sun.grizzly.samples.websockets;
42
43import com.sun.grizzly.websockets.DefaultWebSocket;
44import com.sun.grizzly.websockets.ProtocolHandler;
45import com.sun.grizzly.websockets.WebSocketListener;
46
47public class ChatWebSocket extends DefaultWebSocket {
48    private String user;
49
50    public ChatWebSocket(ProtocolHandler handler, WebSocketListener[] listeners) {
51        super(handler, listeners);
52    }
53
54    public String getUser() {
55        return user;
56    }
57
58    public void setUser(String user) {
59        this.user = user;
60    }
61}

 

41package com.sun.grizzly.samples.websockets;
42
43import com.sun.grizzly.websockets.WebSocketEngine;
44
45import javax.servlet.ServletConfig;
46import javax.servlet.ServletException;
47import javax.servlet.http.HttpServlet;
48import java.util.logging.Logger;
49
50public class WebSocketsServlet extends HttpServlet {
51    static final Logger logger = Logger.getLogger(WebSocketEngine.WEBSOCKET);
52    private final ChatApplication app = new ChatApplication();
53
54    @Override
55    public void init(ServletConfig config) throws ServletException {
56        WebSocketEngine.getEngine().register(app);  

 

///生命周期函数 init(ServletConfig config)    Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

java.lang.Object extended by javax.servlet.GenericServlet  里面init()

ava.lang.Object extended by javax.servlet.GenericServletextended by javax.servlet.http.HttpServlet/

void init()           A convenience method which can be overridden so that there's no need to call super.init(config). 

void init(ServletConfig config)           Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

Called by the servlet container to indicate to a servlet that the servlet is being placed into service. See Servlet#init.

This implementation stores the ServletConfig object it receives from the servlet container for later use. When overriding this form of the method, call super.init(config).

Specified by:
init in interface Servlet
Parameters:
config - the ServletConfig object that contains configutation information for this servlet
Throws:
ServletException - if an exception occurs that interrupts the servlet's normal operation
See Also:
UnavailableException

http://docs.oracle.com/javaee/6/api/


57    }
58
59    @Override
60    public void destroy() {
61        WebSocketEngine.getEngine().unregister(app);
62    }
63}

 

 

 客户端代码:

That does it for the server side. On the client side we have the usual mix of HTML and javascript. I don't want to go in to

depth on most of that but I do want to take a look at one particular piece. In application.js, we have this code:

var app = {
    url: 'ws://localhost:8080/grizzly-websockets-chat/chat',
    initialize: function() {                                    //初始化函数
        if ("WebSocket" in window) {// ?
            $('login-name').focus();                      //  jQuery 事件 - focus() 方法,当输入框获得焦点时
            app.listen();                                           //  见下面自己定义的函数
        } else {
            $('missing-sockets').style.display = 'inherit';
            $('login-name').style.display = 'none';
            $('login-button').style.display = 'none';
            $('display').style.display = 'none';
        }
    },
    listen: function() {
        $('websockets-frame').src = app.url + '?' + count;
        count ++;
    },
    login: function() {                                          //用户登录
        name = $F('login-name');
        if (! name.length > 0) {
            $('system-message').style.color = 'red';
            $('login-name').focus();
            return;
        }
        $('system-message').style.color = '#2d2b3d';
        $('system-message').innerHTML = name + ':';  //

        $('login-button').disabled = true; 
        $('login-form').style.display = 'none';
        $('message-form').style.display = '';

        websocket = new WebSocket(app.url);                         //见上面自己定义的url
        websocket.onopen = function() {
            // Web Socket is connected. You can send data by send() method
            websocket.send('login:' + name);                        //发给服务器侧
        };
        websocket.onmessage = function (evt) {           //当接受到服务器侧的消息时触发此事件
            eval
(evt.data);                                                   ///见备注,将数据由json格式转换为js对象格式
            $('message').disabled = false;
            $('post-button').disabled = false;
            $('message').focus();
            $('message').value = '';
        };
        websocket.onclose = function() {      ///关闭时触发此事件
            var p = document.createElement('p');
            p.innerHTML = name + ': has left the chat';

            $('display').appendChild(p);

            new Fx.Scroll('display').down();
        };
    },


    post: function() {       //发送消息的函数代码
        var message = $F('message');
        if (!message > 0) {
            return;
        }
        $('message').disabled = true;
        $('post-button').disabled = true;

        websocket.send(message);       //发送消息
    },
    update: function(data) {      //更新显示
        if (data) {
            var p = document.createElement('p');
            p.innerHTML = data.name + ': ' + data.message;

            $('display').appendChild(p);

            new Fx.Scroll('display').down();
        }
    }
};

 

 

备注;

2011-12-27 18:20

jquery 关于eval 取字符串

 var data = eval('[{"title":"测试标题","name":"张三","address":"大连"},{"title":"测试标题123","name":"张三123","address":"大连123"}];');
var o = eval(data);//将json字符串转换成js对象
for (var i in o) {//循环json对象数组
    for (var key in o[i]) {//循环json对象中的属性和值
        alert("field:" + key + ", value:" + o[i][key]);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值