基于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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
我的NodeJs学习小结(一)
Jul 06 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
nodejs基础知识
Feb 03 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 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
长波知识介绍
2021/03/01 无线电
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php二维码生成以及下载实现
2017/09/28 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
关于php开启错误提示的总结
2019/09/24 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
Python单例模式实例详解
2017/03/01 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
dpn网络的pytorch实现方式
2020/01/14 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
幼教个人求职信范文
2013/12/02 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
历史系自荐信范文
2013/12/24 职场文书
绿色环保演讲稿
2014/05/10 职场文书
先进学校事迹材料
2014/12/30 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
超市采购员岗位职责
2015/04/07 职场文书
律师函格式范本
2015/05/27 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang