WebSocket+node.js创建即时通信的Web聊天服务器


Posted in Javascript onAugust 08, 2016

本文实例node.js创建即时通信的Web聊天服务器,供大家参考,具体内容如下

1.使用nodejs-websocket
 nodejs-websocket是基于node.js编写的一个后端实现websocket协议的库,
 连接:https://github.com/sitegui/nodejs-websocket
 (1)安装
 在项目目录下通过npm安装:npm install nodejs-websocket
 (2)创建服务器

//引入nodejs-websocket
var ws = require(“nodejs-websocket”);
//调用createServer方法创建服务器,回调函数中的conn是connection的实例
var server = ws.create(function(conn){
  console.log(“New connection”);
  //监听text事件,text事件每当从服务器收到文本类型数据时触发,回调函数的参数为传过来的字符串
  conn.on(“text”, function(str){
 console.log(“Received ” + str);
  });
  //监听close事件,每次断开连接时触发
  conn.on(“close”, function(code, reason){
 console.log(“Connection closed”);
  })
}).listen(8888);

 2.客户端使用websocket
 在客户端首先需要实例化一个websocket对象:ws = new WebSocket("ws://localhost:5000");其中的参数传入格式为ws://+url,这就和http协议前缀http://一样。接下来就可以通过websocket内置的一些方法进行事件监听和数据展示。
 这里统一介绍各个监听事件:onopen当服务器和客户端建立起连接时触发;onmessage当客户端收到服务器发送的数据时触发; onclose当客户端和服务器的连接关闭时触发;onerror当连接出现错误时触发。

3.使用websocket+nodejs实现在线聊天室
 (1)html和css代码省略
 (2)客户端js:    

oConnect.onclick=function(){
    ws=new WebSocket('ws://localhost:5000');
     ws.onopen=function(){
       oUl.innerHTML+="<li>客户端已连接</li>";
     }
    ws.onmessage=function(evt){
      oUl.innerHTML+="<li>"+evt.data+"</li>";
    }
    ws.onclose=function(){
      oUl.innerHTML+="<li>客户端已断开连接</li>";
    };
    ws.onerror=function(evt){
      oUl.innerHTML+="<li>"+evt.data+"</li>";
 
    };
  };
  oSend.onclick=function(){
    if(ws){
      ws.send(oInput.value);
    }
  }(3)服务器端js:
 /*
websocket支持两种类型的数据传输:text类型和binary类型,其中二进制数据是通过流的模式发送和读取的
*/
var app=require('http').createServer(handler); //为了简化代码,将服务器创建具体代码放到handler函数中
var ws=require('nodejs-websocket');
var fs=require('fs');
app.listen(8888);
function handler(req,res){
  //__dirname返回该文件所在的当前目录。调用readFile方法进行文件读取
  fs.readFile(__dirname+'/index.html',function(err,data){
    if(err){
      res.writeHead(500);
      return res.end('error ');
    }
    res.writeHead(200);
    res.end(data);
  });
}
//以上步骤成功在8888端口渲染出相应的html界面
//conn是对应的connection的实例
var server = ws.createServer(function(conn){
  console.log('new conneciton');
  //监听text事件,每当收到文本时触发
  conn.on("text",function(str){
    broadcast(server,str);
  });
  //当任何一端关闭连接时触发,这里就是在控制台输出connection closed
  conn.on("close",function(code,reason){
    console.log('connection closed');
  })
}).listen(5000);
//注意这里的listen监听是刚才开通的那个服务器的端口,客户端将消息发送到这里处理
 
function broadcast(server, msg) {
  //server.connections是一个数组,包含所有连接进来的客户端
  server.connections.forEach(function (conn) {
    //connection.sendText方法可以发送指定的内容到客户端,传入一个字符串
    //这里为遍历每一个客户端为其发送内容
    conn.sendText(msg);
  })
}

以上就是本文

的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
jQuery的学习步骤
Feb 23 Javascript
jquery 面包屑导航 具体实现
Jun 05 Javascript
JavaScript对IE操作的经典代码(推荐)
Mar 10 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 Javascript
jQuery实现拖动剪裁图片作为头像
Dec 28 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
layer实现关闭弹出层刷新父界面功能详解
Nov 15 Javascript
面包屑导航详解
Dec 07 Javascript
socket io与vue-cli的结合使用的示例代码
Nov 01 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 Javascript
学习Javascript闭包(Closure)知识
Aug 07 #Javascript
JavaScript实现in-place思想的快速排序方法
Aug 07 #Javascript
使用jQuery调用XML实现无刷新即时聊天
Aug 07 #Javascript
JS中使用FormData上传文件、图片的方法
Aug 07 #Javascript
深入理解Angular2 模板语法
Aug 07 #Javascript
JS上传图片预览插件制作(兼容到IE6)
Aug 07 #Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 #Javascript
You might like
php empty函数判断mysql表单是否为空
2010/04/12 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
JS实现碰撞检测的方法分析
2018/01/19 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
python获取mp3文件信息的方法
2015/06/15 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python实现简单日期工具类
2019/04/24 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
渗透攻击的测试步骤
2014/06/07 面试题
社团文化节策划书
2014/02/01 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
英语系毕业生求职信
2014/07/13 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL