Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Node.js + WebSocket 实现的简易聊天室

Node.js + WebSocket 实现的简易聊天室

作者头像
meteoric
发布于 2018-11-16 08:46:35
发布于 2018-11-16 08:46:35
3.1K00
代码可运行
举报
文章被收录于专栏:游戏杂谈游戏杂谈
运行总次数:0
代码可运行

本实例程序在Windows下测试通过。

上述实例支持以下浏览器:

Firefox 7-9 (Old) (Protocol Version 8) Firefox 10+ (Protocol Version 13) Chrome 14,15 (Old) (Protocol Version 8) Chrome 16+ (Protocol Version 13) Internet Explorer 10 (Preview) (Protocol Version 13)

消息的传递也比较简单,Client –> Server, Server –> Client

服务器广播消息

数据传输使用的是JSON格式,前台建立连接的代码比较简单,ex:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1: $(function () {

       2:     window.WebSocket = window.WebSocket || window.MozWebSocket;

       3:  

       4:     var connection = new WebSocket('ws://127.0.0.1:1337');

       5:  

       6:     connection.onopen = function () {

       7:         //已建立连接

       8:     };

       9:  

      10:     connection.onerror = function (error) {

      11:         //接收或发送消息时遇到了错误

      12:     };

      13:  

      14:     connection.onmessage = function (message) {

      15:         

      16:         try {

      17:             var json = JSON.parse(message.data);

      18:         } catch (e) {

      19:             console.log('不能被正常解析的数据:', message.data);

      20:             return;

      21:         }

      22:  

      23:         // todo

      24:     };

      25: });

后端的实现,直接使用别人写好的模块所以传统比较简单一点(想在Windows下运行chat-server还是有点麻烦的),因为该模块在Windows下安装时,需要Microsoft Visual C++和Python 2.7的支持。--如果没有安装这两个东东,还得先安装一下。

如果顺利的话,会看到如下图所示的界面:

这样我们就可以创建Server了,实现的代码也并不复杂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1: var WebSocketServer = require('websocket').server;

       2: var http = require('http');

       3:  

       4: var server = http.createServer(function(request, response) {

       5:     console.log((new Date()) + ' Received request for ' + request.url);

       6:     response.writeHead(404);

       7:     response.end();

       8: });

       9: server.listen(8080, function() {

      10:     console.log((new Date()) + ' Server is listening on port 8080');

      11: });

      12:  

      13: wsServer = new WebSocketServer({

      14:     httpServer: server,

      15:     // You should not use autoAcceptConnections for production

      16:     // applications, as it defeats all standard cross-origin protection

      17:     // facilities built into the protocol and the browser.  You should

      18:     // *always* verify the connection's origin and decide whether or not

      19:     // to accept it.

      20:     autoAcceptConnections: false

      21: });

      22:  

      23: function originIsAllowed(origin) {

      24:   // put logic here to detect whether the specified origin is allowed.

      25:   return true;

      26: }

      27:  

      28: wsServer.on('request', function(request) {

      29:     if (!originIsAllowed(request.origin)) {

      30:       // Make sure we only accept requests from an allowed origin

      31:       request.reject();

      32:       console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');

      33:       return;

      34:     }

      35:  

      36:     var connection = request.accept('echo-protocol', request.origin);

      37:     console.log((new Date()) + ' Connection accepted.');

      38:     connection.on('message', function(message) {

      39:         if (message.type === 'utf8') {

      40:             console.log('Received Message: ' + message.utf8Data);

      41:             connection.sendUTF(message.utf8Data);

      42:         }

      43:         else if (message.type === 'binary') {

      44:             console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');

      45:             connection.sendBytes(message.binaryData);

      46:         }

      47:     });

      48:     connection.on('close', function(reasonCode, description) {

      49:         console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');

      50:     });

      51: });

从上述的例子中可以看出,websocket支持两种传递方式:二进制流、utf8的文本流。前面的例子中所使用的是utf8文本流

完整的chat-server.js的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1: // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/

       2: "use strict";

       3:  

       4: // Optional. You will see this name in eg. 'ps' or 'top' command

       5: process.title = 'node-chat';

       6:  

       7: //websocket服务器监听的端口

       8: var webSocketsServerPort = 1337;

       9:  

      10: var webSocketServer = require('websocket').server;

      11: var http = require('http');

      12:  

      13: //保存最近100条消息记录

      14: var history = [ ];

      15:  

      16: //当前连接的客户端

      17: var clients = [ ];

      18:  

      19: /**

      20:  * 对聊天内容进行字符转义

      21:  */

      22: function htmlEntities(str) {

      23:     return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');

      24: }

      25:  

      26:  

      27: var colors = [ 'red', 'green', 'blue', 'magenta', 'purple', 'plum', 'orange' ];

      28: colors.sort(function(a,b) { return Math.random() > 0.5; } );

      29:  

      30: /**

      31:  * HTTP server

      32:  */

      33: var server = http.createServer(function(request, response) {});

      34:  

      35: server.listen(webSocketsServerPort, function() {

      36:     console.log(getNow() + " WebSocket Server is listening on port:" + webSocketsServerPort);

      37: });

      38:  

      39: /**

      40:  * WebSocket server

      41:  * WebSocket server is tied to a HTTP server. To be honest I don't understand why.

      42:  */

      43: var wsServer = new webSocketServer({

      44:     httpServer: server

      45: });

      46:  

      47: //每一个客户端请求建立连接时,都将触发此方法

      48: wsServer.on('request', function(request) {

      49:  

      50:     console.log(getNow() + ' ' + request.origin + ' 请求连接.');

      51:  

      52:     // accept connection - you should check 'request.origin' to make sure that client is connecting from your website

      53:     // (http://en.wikipedia.org/wiki/Same_origin_policy)

      54:     var connection = request.accept(null, request.origin); 

      55:  

      56:     //保存当前请求连接客户端的索引,以方便在断开连接时,从连接池中移除该连接

      57:     var index = clients.push(connection) - 1;

      58:     var userName;

      59:     var userColor;

      60:  

      61:     console.log(getNow() + ' 已建立连接...');

      62:     

      63:     //推送历史聊天记录

      64:     if (history.length > 0) {

      65:         connection.sendUTF(JSON.stringify({type: 'history', data: history}));

      66:     }

      67:  

      68:     //某一客户端发送消息过来

      69:     connection.on('message', function(message) {

      70:         if (message.type === 'utf8') {

      71:             

      72:             //第一次请求用于保存用户信息

      73:             if (!userName) {

      74:                 userName = htmlEntities(message.utf8Data);

      75:                 

      76:                 userColor = colors.shift();

      77:                 connection.sendUTF(JSON.stringify({ type:'color', data: userColor }));

      78:                 console.log(getNow() + ' 用户已登录: ' + userName + ' -- ' + userColor);

      79:  

      80:             } else {

      81:                 //记录消息并广播

      82:                 console.log(getNow() + userName + '-说: ' + message.utf8Data);

      83:                 

      84:                 //传递给客户端的数据格式

      85:                 var obj = {

      86:                     time: (new Date()).getTime(),

      87:                     text: htmlEntities(message.utf8Data),

      88:                     author: userName,

      89:                     color: userColor

      90:                 };

      91:                 history.push(obj);

      92:  

      93:                 //取数组最后100条消息记录并保存

      94:                 history = history.slice(-100); 

      95:  

      96:                 //将消息广播给所有客户端

      97:                 var json = JSON.stringify({ type:'message', data: obj });

      98:                 for (var i=0; i < clients.length; i++) {

      99:                     clients[i].sendUTF(json);

     100:                 }

     101:                 

     102:                 console.log("总的客户端连接数:" + clients.length);

     103:             }

     104:         }

     105:     });

     106:  

     107:     //用户断开连接

     108:     connection.on('close', function(connection) {

     109:         if (!userName && !userColor) {

     110:             console.log(getNow() + " -- " + connection.remoteAddress + " 断开链接.");

     111:             

     112:             //从连接池中移除连接

     113:             clients.splice(index, 1);

     114:             

     115:             //回收访用户所使用的颜色

     116:             colors.push(userColor);

     117:         }

     118:     });

     119:  

     120: });

     121:  

     122: function getNow() {

     123:     return new Date().format('yyyy-MM-dd hh:mm:ss');

     124: }

     125:  

     126: Date.prototype.format = function (fmt) { //author: meizz   

     127:     var o = {

     128:         "M+": this.getMonth() + 1,

     129:         "d+": this.getDate(),   

     130:         "h+": this.getHours(),   

     131:         "m+": this.getMinutes(),  

     132:         "s+": this.getSeconds(),   

     133:         "q+": Math.floor((this.getMonth() + 3) / 3),   

     134:         "S": this.getMilliseconds()   

     135:     };

     136:     if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));

     137:     for (var k in o)

     138:     if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));

     139:     return fmt;

     140: }

运行supervisor chat-server.js或者node chat-server.js 就OK了~

使用Firefox测试一下:)

本文参考:

1、Node.js & WebSocket - Simple chat tutorial

2、WebSocket-Node

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-07-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​语音聊天程序源码——简单的聊天室搭建
安装好swoole后开始搭建 前段 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聊天室</title> </head> <style> #set_name{ margin: auto; text-align: center; } </style> <body> <h3 style="text-align: center">亮亮的聊天室</h3> <d
nicai123
2019/10/07
3.9K0
​语音聊天程序源码——简单的聊天室搭建
.NET Core 基于Websocket的在线聊天室
我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后就会断开连接。 在没有websocket之前web系统如果要做双工通讯往往使用http long polling技术。http long polling 每次往服务器发送请求后,服务端不会立刻返回信息来结束请求,而是一直挂着直到有数据需要返回,或者等待超时了才会返回。客户端在结束上一次请求后立刻再发送一次请求,如此反复。http long polling虽然能实现web系统的双工通讯,但是有个很大的问题,就是基于http协议客户端每次发送请求都需要携带巨大的头部。在并发交互少量数据的时候非常不划算,对服务器资源的消耗也是巨大的。 websocket很好的改善了以上问题。它基于tcp重新设计了一套协议,同时又兼容http,默认跟http一样使用80/443端口。websocket链接建立本质上就是一次http请求,直接使用http协议的upgrade头来标识这是一次websocket请求,服务端回复101状态码表示“握手”成功。
李明成
2020/03/18
1.1K0
SpringBoot 使用WebSocket打造在线聊天室(基于注解)
例如:webSocket.onmessage = function (event) {console.log('WebSocket收到消息:' + event.data);
好好学java
2018/10/18
2.7K0
WebSocket 全面解析+实战演练(Nodejs实现简易聊天室)
WebSocket是一种在单个TCP连接上提供全双工通信能力的协议。简单来说,它允许客户端和服务器互相推送数据,无需重复建立连接,大大提升了交互效率和实时性🚀。
空白诗
2024/06/14
4180
WebSocket 全面解析+实战演练(Nodejs实现简易聊天室)
Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
  采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制。聊天室增加了 注册登录 模块 ,并将用户个人信息和聊天记录存入数据库.
书童小二
2018/09/03
2.7K0
Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
微信小程序和服务器通信-WebSocket
接上一篇文章的话题,我们这次来讲一下如何建立一个基于node.js的WebSocket服务器,并在小程序中使用这个提供实时服务的服务器。
一斤代码
2018/08/21
6.8K2
微信小程序和服务器通信-WebSocket
3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/11/22
3.6K1
3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)
HTML5之WebSocket
HTTP协议是一种无状态协议,服务端本身不具有识别客户端的能力,必须借助外部机制,比如session和cookie,才能与特定客户端保持对话。这多多少少带来一些不便,尤其在服务器端与客户端需要持续交换数据的场合(比如网络聊天),更是如此。为了解决这个问题,HTML5提出了浏览器的WebSocket API。
用户7353950
2022/05/10
1.1K0
2万字长文肝了一个实时聊天室,只为让她学会websocket
看演示不过瘾,我也玩一下(http://socket.vjscoder.com/websocket-chatroom/index.html#/)
前端胖头鱼
2022/07/25
1K0
2万字长文肝了一个实时聊天室,只为让她学会websocket
php实现websocket实时消息推送
软件通信有七层结构,下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做不同的工作,上层协议依赖与下层协议。基于这个通信结构的概念。
OwenZhang
2021/12/08
2.4K0
php实现websocket实时消息推送
Chrome DevTools 远程调试协议分析及实战
Chrome DevTools 可以说是前端开发最常用的工具,无论是普通页面、移动端 webview、小程序、甚至 node 应用,都可以用它来调试。
winty
2020/04/26
7.8K0
Chrome DevTools 远程调试协议分析及实战
swoole基础-WebSocket服务
一,WebSocket服务器创建 <?php // +---------------------------------------------------------------------- //
程序猿的栖息地
2022/04/29
4650
swoole基础-WebSocket服务
浅谈WebSocket
新建一个server目录,创建服务端代码,主要依赖`nodejs-websocket`[1]这个库是服务端websocket代码。
Maic
2022/07/28
8480
浅谈WebSocket
实现一个简单的WebSocket聊天室
run node index.js,并在浏览器打开 http://localhost:3000,访问成功即可看到
超超不会飞
2020/09/18
1.1K0
实现一个简单的WebSocket聊天室
使用node、Socket.io 搭建简易聊天室
Socket.io是一个WebSocket库,会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,而且支持的浏览器最低达IE5.5。 Socket.io 服务器 和 Socket.io 客户端之间全双工通信信道 尽可能使用WebSocket 连接建立(”尽可能“就说明要求客户端和服务端都必须使用,HTTP 长轮询`作为后备。 在了解socket-io前,我们先了解三种通信方式和Http轮询。
can4hou6joeng4
2023/11/29
4750
gin websocket 一对一聊天
依赖包 github.com/gin-gonic/gin github.com/gorilla/websocket 代码 创建ws/ws.go package ws import ( "encoding/json" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "log" "net/http" ) // ClientManager is a websocket manager type Clie
孤烟
2020/09/27
1.6K0
easyswoole实现在线聊天室功能
一 : 安装easyswoole,可参考http://www.php20.cn/article/82
仙士可
2019/12/19
2.1K0
easyswoole实现在线聊天室功能
5000字!带你零距离接触websocket!
原文 https://juejin.im/post/6876301731966713869
lucifer210
2020/10/23
5300
5000字!带你零距离接触websocket!
沉寂了一周,我开发了一个聊天室
最近一周没有发文章了,我在这里向大家说一声抱歉。今天,我们来从零开始开发一款聊天室。好,我们现在就开始。
Vam的金豆之路
2021/12/01
5870
沉寂了一周,我开发了一个聊天室
如何为实时应用程序创建WebSocket服务器
Ratchet 是一个用于异步服务WebSockets的PHP库。通过简单的接口构建应用程序,并通过组合不同的组件重用应用程序,而无需更改其任何代码。
Tinywan
2023/12/01
3650
如何为实时应用程序创建WebSocket服务器
推荐阅读
相关推荐
​语音聊天程序源码——简单的聊天室搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验