基于html5和nodejs相结合实现websocket即使通讯


Posted in NodeJs onNovember 19, 2015

最近都在学习HTML5,做canvas游戏之类的,发现HTML5中除了canvas这个强大的工具外,还有WebSocket也很值得注意。可以用来做双屏互动游戏,何为双屏互动游戏?就是通过移动端设备来控制PC端网页游戏。这样的话就要用到实时通讯了,而WebSocket无疑是最合适的。WebSocket相较于HTTP来说,有很多的优点,主要表现在WebSocket只建立一个TCP连接,可以主动推送数据到客户端,而且还有更轻量级的协议头,减少数据传送量。所以WebSocket暂时来说是实时通讯的最佳协议了。

至于服务器语言选择nodeJs,一是因为自己是做前端的,对javascript比较熟悉,相比于其他后台语言,自然会更喜欢nodeJs了,二是NodeJs本身事件驱动的方式很擅长与大量客户端保持高并发的连接。所以就选择NodeJs了。

服务器的实现很简单,先装一个nodeJs的模块,叫nodejs-websocket , 直接在nodeJs命令行中敲入:npm install nodejs-websocket回车就可以安装好了,然后就可以开始建立服务器了,因为有了nodejs-websocket模块,所以很多工作都不用我们自己做,直接调用别人封装好的方法就行了:

【服务端代码】,根据客户端传来的消息判断哪个是game1,哪个是game2,保存connection对象。

var ws = require("nodejs-websocket");
console.log("开始建立连接...")
var game1 = null,game2 = null , game1Ready = false , game2Ready = false;
var server = ws.createServer(function(conn){
  conn.on("text", function (str) {
    console.log("收到的信息为:"+str)
    if(str==="game1"){
      game1 = conn;
      game1Ready = true;
      conn.sendText("success");
    }
    if(str==="game2"){
      game2 = conn;
      game2Ready = true;
    }
    if(game1Ready&&game2Ready){
      game2.sendText(str);
    }
    conn.sendText(str)
  })
  conn.on("close", function (code, reason) {
    console.log("关闭连接")
  });
  conn.on("error", function (code, reason) {
    console.log("异常关闭")
  });
}).listen(8001)
console.log("WebSocket建立完毕")

【game1代码】:通过点击获取三个框的内容,传到服务器

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .kuang{text-align: center;margin-top:200px;}
    #mess{text-align: center}
    .value{width: 200px;height:200px;border:1px solid;text-align: center;line-height: 200px;display: inline-block;}
  </style>
</head>
<body>
  <div id="mess">正在连接...</div>
  <div class="kuang">
    <div class="value" id="value1">小明小明</div>
    <div class="value" id="value2">大胸大胸</div>
    <div class="value" id="value3">小张小张</div>
  </div>
  <script>
    var mess = document.getElementById("mess");
    if(window.WebSocket){
      var ws = new WebSocket('ws://192.168.17.80:8001');
      ws.onopen = function(e){
        console.log("连接服务器成功");
        ws.send("game1");
      }
      ws.onclose = function(e){
        console.log("服务器关闭");
      }
      ws.onerror = function(){
        console.log("连接出错");
      }
      ws.onmessage = function(e){
        mess.innerHTML = "连接成功"
        document.querySelector(".kuang").onclick = function(e){
          var time = new Date();
          ws.send(time + " game1点击了“" + e.target.innerHTML+"”");
        }
      }
    }
  </script>
</body>
</html>

【game2代码】:获取服务推送来的消息,并且显示

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .kuang{text-align: center;margin-top:200px;}
    #mess{text-align: center}
  </style>
</head>
<body>
  <div id="mess"></div>
  <script>
    var mess = document.getElementById("mess");
    if(window.WebSocket){
      var ws = new WebSocket('ws://192.168.17.80:8001');
      ws.onopen = function(e){
        console.log("连接服务器成功");
        ws.send("game2");
      }
      ws.onclose = function(e){
        console.log("服务器关闭");
      }
      ws.onerror = function(){
        console.log("连接出错");
      }
      ws.onmessage = function(e){
        var time = new Date();
        mess.innerHTML+=time+"的消息:"+e.data+"<br>"
      }
    }
  </script>
</body>
</html>

运行截图:

基于html5和nodejs相结合实现websocket即使通讯

代码非常简单:很容易看懂,nodejs-WebSocket的调用也非常简洁明了,具体nodejs-websocket的API可以看https://www.npmjs.org/package/nodejs-websocket,里面都有介绍,自己测试一下,就很容易了,客户端的实现也是很简单,就通过onopen,onmessage等几个方法就可以实现了。

ps:nodejs缺点

1. nodejs更新很快,可能会出现版本联兼容
2. nodejs还不算成熟,还没有大制作。
3. nodejs不像其他的服务器,对于不同的连接,不支持进程和线程操作。
在权衡Nodejs给我们带来无限畅快的开发的同时,要考虑到他的不成熟,特别是对于“长连接”的网络通信应用。

NodeJs 相关文章推荐
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 #NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 #NodeJs
浅谈Nodejs观察者模式
Oct 13 #NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 #NodeJs
nodejs创建web服务器之hello world程序
Aug 20 #NodeJs
windows下安装nodejs及框架express
Aug 07 #NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 #NodeJs
You might like
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
python学习之编写查询ip程序
2016/02/27 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Python print不能立即打印的解决方式
2020/02/19 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
计算机科学与技术应届生求职信
2013/11/07 职场文书
个人欠款担保书
2014/05/20 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL