• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > Node.js websocket使用socket.io库实现实时聊天室

Node.js websocket使用socket.io库实现实时聊天室

作者:HaoDaWang 字体:[增加 减小] 来源:互联网 时间:2017-05-11

HaoDaWang通过本文主要向大家介绍了node.js websocket,node websocket,socket.io websocket,websocketcontainer,node.js socket等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

认识websocket

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。

其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http 。
之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部分精力可能更应该花在与用户的视觉层交互上。

废话不闲扯,我们先来看一下websocket 与传统的ajax 有什么不同之处。
在之前,如果我们想要获取到服务器更新的信息,我们可以使用ajax 轮询来完成,然而,这样做的弊端是增大了我们与服务器的交互次数,然而极大部分的交互都是无意义的,因为我们只是做一个询问,如果没有任何新的信息,我们几乎什么都不用做,因此这样会极大的浪费服务器资源和带宽。
然而使用websocket 会使客户端与服务器建立一个长连接,并且,当服务器有新消息时可以主动推送到客户端,所以我们可以不用一次次的去询问服务器是否有新消息,而是直接由服务器主动推送到客户端,这样在无消息的状态下,客户端不会频繁的去请求服务器。
使用websocket 的特点在于服务器可以主动推送消息到客户端。

使用socket.io 库实现实时聊天

这也是这篇博文的主题之处。socket.io发布到npm 平台上,我们可以直接用npm 来安装到**当前**node_modules目录下。

npm install socket.io --save 
</div>

下面我们就可以直接使用require 方法来将这个模块引入

const socket = require("socket.io");
</div>

在创建此websocket 服务器之前,它需要依赖于一个已经创建好的http服务器。

let socketServer = socket.listen(require("http").createServer((req,resp) => {
  //返回页面
  resp.end(require("fs").readFileSync("./socketIOTest1.html"));
}).listen(9999,"localhost",() => {console.log("listening");}));
</div>

在上述代码中socketIOTest1.html 是在当前目录下的一个html文件,在下面我会贴上详细的代码,这里先稍稍带过。

在websocket 服务器对象中有一个connection事件,这个事件在有客户端连接到socket服务器时被触发。下面我们监听这个事件,打印一句话来表示有用户连接。

//监听connection 事件
socketServer.on("connection",socket => {
  console.log("有一用户连接");
}
</div>

上述代码中,callback有一个参数socket为连接到客户端的一个socket端口对象,这个对象有一个message 事件,当客户端有消息推送到服务器时,事件循环会取出这个事件与之对应的回调函数并执行。

socket.on("message",msg => {
  console.log(msg);
});
</div>

同时,socket对象还可以监听disconnect 事件,来监听用户断开连接的情况

socket.on("disconnect",() => {
  console.log("有一用户退出连接");
});
</div>

因为我们这次的主题是要创建一个能够实时聊天的聊天室,因此光有这些是不够的,我们还需要一个能够与用户交互的客户端。
下面是我的socketIOTest代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <textarea name="" id="content" cols="30" rows="10" ></textarea>
  <input id="write" type="text" placeholder="please write content here">
  <input id="send" type="button" value="send" />
  <script src="./socket.io/socket.io.js"></script>
  <script>
    let send = document.getElementById("send");
    let write = document.getElementById("write");
    let content = document.getElementById("content");
    let socket = io.connect();
    //发送消息
    send.onclick = () => {
      let msg = write.value;
      // content.innerHTML = content.value + msg + "\n";
      socket.send(msg);
    };
    //接收到消息
    socket.on("message",msg => {
      console.log("从服务器接收到的消息 : " + msg);
      //更新内容
      content.innerHTML = content.value + msg + "\n";
    });
    socket.on("disconnect",() => {
      console.log("与服务器断开连接");
    });
  </script>
</body>
</html>
</div>

在上述代码中,我用script标签引入了一个socket.io.js文件,这个文件不需要另外去下载,而直接引入即可,因为socket.io.js是被包含于socket.io模块中,在上面node的程序代码中,我们通过require方法引入了socket.io模块,因此我们可以直接通过相对路径访问到它。

<script src="./socket.io/socket.io.js"></script>
</div>

接下来我们就可以在script标签中使用如同服务端的代码。

let socket = io.connect();
</div>

使用io.connect()方法连接到websocket服务器,该方法返回一个与连接的服务器与之对应的一个socket端口对象。

下面我们同样监听message 和 disconnect事件。

//接收到消息
socket.on("message",msg => {
  console.log("从服务器接收到的消息 : " + msg);
  //更新内容
  content.innerHTML = content.value + msg + "\n";
});
socket.on("disconnect",() => {
  console.log("与服务器断开连接");
});
</div>

为了更能突出websocket的作用,在html代码中,我只使用了一个textarea标签来显示内容,两个input标签用于发送。
使用socket对象的send方法就能使消息在服务器与客户端进行消息传递。

websocket群聊实现

现在我们假设一个场景,有u1和u2两个用户,同时连接到服务器,那么我们怎么使他们互相通信呢,实现的方法及其简单。当u1连接到服务器,在服务器中,使用一个map键值对把与u1对应的socket对象进行保存。

//创建一个用于放置用户对象的map
let map = new Map();
//用于记录用户数量的变量,并初始化为0
let userCount = 0;
//监听connection 事件
socketServer.on("connection",socket => {
  console.log("有一用户连接");
  map.set(++userCount,socket);
  //...
}); 
</div>

与此同时,u2也连接上服务器,也由该map把与u2与之对应的socket对象进行储存。
现在,u1点击了send按钮发送一条消息至服务器,服务器收到消息后遍历map,转发给所有socket对象,实现群聊的实时通信。

socketServer.on("connection",socket => {
  console.log("有一用户连接");
  map.set(++userCount,socket);
  //监听客户端来的信息
  socket.on("message",msg => {
    //从客户端接收的消息
    //遍历所有用户
    map.forEach((value,index,arr) => {
      value.send(msg);
    });
  });
}); 
</div>

下面我贴上服务端的完整代码,仅供参考

const socket = require("socket.io");
//创建一个websocket服务器
let socketServer = socket.listen(require("http").createServer((req,resp) => {
  //返回页面
  resp.end(require("fs").readFileSync("./socketIOTest1.html"));
}).listen(9999,"localhost",() => {console.log("listening");}));

//创建一个用于放置用户对象的map
let map = new Map();
//用于记录用户数量的变量,并初始化为0
let userCount = 0;

//监听connection 事件
socketServer.on("connection",socket => {
  console.log("有一用户连接");
  map.set(++userCount,socket);
  //监听客户端来的信息
  socket.on("message",msg => {
    //从客户端接收的消息
    //遍历所有用户
    map.forEach((value,index,arr) => {
      value.send(msg);
    });
  });
  //监听客户端退出情况
  socket.on("disconnect",() => {
    console.log("有一用户退出连接");
  });
}); 

</div>

websocket私聊实现

在说私聊的实现之前,我们首先要找

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Node.js websocket使用socket.io库实现实时聊天室

相关文章

  • 2017-05-11微信小程序 http请求封装详解及实例代码
  • 2017-05-11详解AngularJS 路由 resolve用法
  • 2017-05-11Bootstrap如何激活导航状态
  • 2017-08-31js JSON介绍
  • 2017-05-11详解nodejs中的process进程
  • 2017-05-11原生js实现吸顶效果
  • 2017-05-11很棒的一组js图片轮播特效
  • 2017-05-11详解vue组件化开发-vuex状态管理库
  • 2017-05-11js+canvas实现动态吃豆人效果
  • 2017-05-11解析jquery easyui tree异步加载子节点问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Move.js入门
    • 微信小程序实现给循环列表添加点击样式实例
    • Bootstrap模态框(Modal)实现过渡效果
    • javascript图片预览和上传(兼容IE)
    • jQuery实现的背景颜色渐变动画效果示例
    • Nodejs读取文件时相对路径的正确写法(使用fs模块)
    • 深入理解Javascript中的观察者模式
    • js中输入数字自动货币格式化
    • 基于Angularjs+mybatis实现二级评论系统(仿简书)
    • AngularJS 使用ng-repeat报错 [ngRepeat:dupes]

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有