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]);
    }
}

 

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值