HTML5+NodeJs实现WebSocket即时通讯

产品网站中很多地方需要用到实时交互,web端的实时交互。

具体为活动抽奖案例:

  现场一个大屏,显示中奖人列表相关信息;

  主持人一个pad控制开始抽奖结束抽奖;

  每个活动现场的观众的手机。用来摇动手机进行抽奖

毫无疑问用websocket,WebSocket相较于HTTP来说,有很多的优点,主要表现在WebSocket只建立一个TCP连接,可以主动推送数据到客户端,而且还有更轻量级的协议头,减少数据传送量。所以WebSocket暂时来说是实时通讯的最佳协议了

至于服务器语言选择nodeJs,是因为NodeJs本身事件驱动的方式很擅长与大量客户端保持高并发的连接。所以就选择NodeJs了。

安装nodejs,然后再安装一个nodejs-websocket的模块。然后就可以开始建立服务器了,因为有了nodejs-websocket模块,所以很多工作都不用我们自己做,直接调用别人封装好的方法就行了

服务器代码:

var ws = require("nodejs-websocket")
var net = require(‘net‘)

var clients_luck_show= new Array();
var clients_luck_control= new Array();
var clients_luck_client= new Array();
var datas= new Array();

// Scream server example: "hi" . "HI!!!"
var server = ws.createServer(function (conn) {
    conn.on("text", function (str) {
        onData(str,conn);
    })
    conn.on("close", function (code, reason) {
        onDisconnect();
    })
})
server.listen(8000)

function onDisconnect(){
    console.log("connect close");
    clients_luck_show.length=0;
    clients_luck_control.length=0;
    clients_luck_client.length=0;
}

function onData(data,conn){
    console.log("data="+data);

        //conn.sendText(str);
    var json = JSON.parse(data);
        switch (json.action){
            case "reg":
                regClient(JSON.parse(data),conn);
                break;
            case "luckcontrol":
             sendtoclient(clients_luck_show,json,data);
                sendtoclient(clients_luck_client,json,data);
                break;
            case "luckok":
                sendtoclient(clients_luck_show,json,data);
                break;
            case "luckend":
                sendtoclient(clients_luck_show,json,data);
                sendtoclient(clients_luck_control,json,data);
                sendtoclient(clients_luck_client,json,data);
                break;

        }
}

function regClient(json , conn){
    var id = conn.key;
    datas[id] = json.showid;
    switch (json.type){
        case "luck_show":
            clients_luck_show[conn.key]=conn;
            break;
        case "luck_client":
            clients_luck_client[conn.key]=conn;
            break;
        case "luck_control":
            clients_luck_control[conn.key]=conn;
            break;
    }

    conn.sendText(json.type+",注册成功");

}

function sendtoclient(clients,json,data) {
    console.log("---------------------------------------------------------");
     for(var key in clients){
        var id = clients[key].key;
        if(datas[id] == json.showid){
            clients[key].sendText(data);
            console.log("sendText="+data);
        }
        }   

}

控制端js代码

/*远程控制开始----------------------------------------------*/

        var ws = null;  

        function init_connect() {  

            if(ws == null){

                // 取得WebSocket连接入口(WebSocket URI)  

                var target = "ws://"+window.location.hostname+":8000";

                // 创建WebSocket  

                if (‘WebSocket‘ in window) {  

                    ws = new WebSocket(target);  

                } else if (‘MozWebSocket‘ in window) {  

                    ws = new MozWebSocket(target);  

                } else {  

                    alert(‘本浏览器不支持远程控制功能,请使用支持HTML5的浏览器。‘);  

                    return;  

                }  

                // 定义Open事件处理函数  

                ws.onopen = function () {  

                    setConnected(true);  

                    reg_luck_control();

                };  

                // 定义Message事件处理函数(收取服务端消息并处理)  

                ws.onmessage = function (event) {  

                    processMessage(event.data)

                    console.log(‘Received: ‘ + event.data);  

                };  

                // 定义Close事件处理函数  

                ws.onclose = function () { 

                    ws = null;  

                    setConnected(false);

                };

            }  

        }

        // 关闭WebSocket连接  

        function disconnect() {  

            if (ws != null) {  

                ws.close();  

                ws = null;  

            }  

            setConnected(false);  

        } 

        function setConnected(connected) {

            if(connected){

                console.log(‘Info: WebSocket connection opened.‘);  

            }

            else{

                console.log(‘Info: WebSocket connection closed.‘);  

            }

        }

        //注册控制端

        function reg_luck_control(){

            if (ws != null) {  

                var message = {action:"reg",type:"luck_control",showid:"<?php echo $configluck[‘LuckId‘]; ?>"};

                // 向服务端发送消息  

                var msg =JSON.stringify(message);

                console.log(msg);

                ws.send(msg);

            } else {  

                init_connect();

            }  

        }

        function processMessage(msg){

            var data=msg;

            if(typeof(msg) == "string"){

                try{

                    data = JSON.parse(msg);

                }catch(e){

                    console.log(msg);

                    return;

                }

            }

            if(data.action=="luckend"){

                init_page();

            }

        }

大屏端js代码

 /*远程控制开始----------------------------------------------*/

    var ws = null;  

    function init_connect() {  

        if(ws == null){

            // 取得WebSocket连接入口(WebSocket URI)  

            var target = "ws://"+window.location.hostname+":8000";

            // 创建WebSocket  

            if (‘WebSocket‘ in window) {  

                ws = new WebSocket(target);  

            } else if (‘MozWebSocket‘ in window) {  

                ws = new MozWebSocket(target);  

            } else {  

                alert(‘本浏览器不支持远程控制功能,请使用支持HTML5的浏览器。‘);  

                return;  

            }  

            // 定义Open事件处理函数  

            ws.onopen = function () {  

                setConnected(true);  

                reg_luck();

                select_luckstate();

            };  

            // 定义Message事件处理函数(收取服务端消息并处理)  

            ws.onmessage = function (event) {  

                processMessage(event.data)

                console.log(‘Received: ‘ + event.data);  

            };  

            // 定义Close事件处理函数  

            ws.onclose = function () {  

                ws = null;  

                setConnected(false);  

            };  

        }

    }  

    // 关闭WebSocket连接  

    function disconnect() {  

        if (ws != null) {  

            ws.close();  

            ws = null;  

        }  

        setConnected(false);  

    } 

    function setConnected(connected) {

        if(connected){

            console.log(‘Info: WebSocket connection opened.‘);  

        }

        else{

            console.log(‘Info: WebSocket connection closed.‘);  

        }

    }

    function reg_luck(){

        if (ws != null) {  

            var message = {action:"reg",type:"luck_show","showid":"<?php echo $configluck[‘LuckId‘]; ?>"}

            // 向服务端发送消息  

            var msg =JSON.stringify(message);

            console.log(msg);

            ws.send(msg);

        } else {  

            init_connect();

        }  

    }

    function processMessage(msg){

        var data=msg;

        if(typeof(msg) == "string"){

            try{

                data = JSON.parse(msg);

            }catch(e){

                console.log(msg);

                return;

            }

        }

        if(data.action=="luckcontrol"){ //来自抽奖控制页面的命令

            console.log(‘luckcontrol: ‘+msg);  

            select_luckstate();

        }

        if(data.action=="luckok"){ //来自手机客户端的命令

            console.log(‘luckok: ‘+msg);

            update_luck_show(msg);

        }

        if(data.action=="luckend"){//来自手机客户端的命令

            console.log(‘luckend: ‘+msg);

            update_luck_show(msg);

        }

    }

手机客户端类似

时间: 2024-11-05 17:29:55

HTML5+NodeJs实现WebSocket即时通讯的相关文章

【集成websocket即时通讯】javaEE 后台框架 SpringMVC Mybatis Shiro druid Bootstrap HTML5 hibernate

获取[下载地址]   QQ: 313596790   [免费支持更新]A 代码生成器(开发利器);    B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  D ehcache 自定义二级缓存;E 微信接口开发(后续会加入Activiti5 工作流 )免费升级------------------------------------------------------------

【集成websocket即时通讯】javaEE 后台框架 SpringMVC Mybatis Shiro Bootstrap HTML5

开发快报: 页面打印功能,websocket 强制下线功能,玩转websocket技术  [金牌]获取[下载地址]   QQ: 313596790A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

java SSM框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

获取[下载地址]   QQ: 313596790官网 http://www.fhadmin.org/A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

java代码编辑器 pdf文件预览 主流SSM 代码生成器 shrio redis websocket即时通讯

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 D 集成安全权限框架shiro   Shiro 是一个用 Jav

【企业框架源码】 SpringMVC mybatis or hibernate ehcache二级缓存maven非和maven版本【websocket即时通讯】

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单;freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Drui

maven非maven版本 SpringMVC mybatis or hibernate ehcache二级缓存【websocket即时通讯】【企业级框架源码】

开发快报: 页面打印功能,websocket 强制下线功能,玩转websocket技术  [金牌]获取[下载地址]   QQ: 313596790A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

脱离Tomcat环境下使用WebSocket即时通讯聊天的示例

A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安

websocket即时通讯

开发快报: 新增 即时通讯功能  (java WebSocket 通信技术)  下面截图 ------------------------------------------------------------------------------------------------------------------------- A 代码生成器(开发利器);  B 阿里数据库连接池druid;C 安全权限框架shiro ; D ehcache 自定义二级缓存; E 微信接口开发(2.5版本新增

即时聊天,springmvc,mybatis,websocket,即时通讯

taobao获取:[下载地址]开发快报: 新增 即时通讯功能  (java WebSocket 通信技术)  下面截图 (最新2.6版本) ------------------------------------------------------------------------------------------------------------------------- A 代码生成器(开发利器);   增删改查的处理类,service层,mybatis的xml,SQL( mysql