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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Portraiture4全新版本人像磨皮滤镜插件使用下载教程
2023全新发布Portraiture 4是专注于图像后期处理软件研发的 Imagenomic, LLC产品之一,在摄影爱好者中有点影响力。Portraiture可以将繁琐复杂的人像磨皮操作极致简化,不论是普通爱好者或专业后期处理人员,均能一键完成。凭借优秀的AI算法和多样化预设,被称为人像磨皮神器。
用户7442547
2023/02/19
3.1K0
Portraiture4.0磨皮插件有哪些新功能?
Portraiture是一款智能磨皮插件,为Photoshop和Lightroom添加一键磨皮美化功能,快速对照片中皮肤、头发、眉毛等部位进行美化,无需手动调整,大大提高P图效率。全新4版本,升级AI算法,并独家支持多人及全身模式!
用户7442547
2023/02/11
1.5K0
设计师必看!Photoshop 2025正版安装指南:AI功能+环境配置全解析
Adobe Photoshop 2025是Adobe公司推出的最新版本图像处理软件,广泛应用于平面设计、摄影后期、UI设计等领域。其核心功能包括:
万里顾一诚
2025/03/21
7461
设计师必看!Photoshop 2025正版安装指南:AI功能+环境配置全解析
Photoshop 2020(21.1.3) x64精简优化绿色版
Adobe Photoshop - 全球最大的图像处理软件!Adobe Photoshop 具有更多更高效的性能,新功能包含:新的模糊效果和聚焦区域选定等工具、相机防抖动功能、Camera RAW功能改进、图像提升采样、属性面板改进、Behance集成、同步设置及其它一些同步等功能。Adobe Photoshop CC 依然是数字图象处理和编辑的业界标准,提供广泛的专业级润饰工具套件,并集成了专为激发灵感而设计的强大编辑功能。
SingYi
2022/07/14
6.9K0
Photoshop 2020(21.1.3) x64精简优化绿色版
Adobe Photoshop 2023中文版 v24.1.2(ps2022)下载激活教程
Adobe Photoshop 2022是一款十分强大知识兔的电脑图像处理软件,一直以来都被广泛的应用于平面知识兔设计、创意合成、美工设计、UI界面设计、图标以及logo知识兔制作、绘制和处理材质贴图等各个领域中,还拥有强大的图知识兔像修饰、图像合成编辑以及调色功能,知识兔利用这些功能可以快速修复照片,也可以修复人脸上的斑点等缺陷,知识兔快速调色等。
用户10122115
2022/11/02
4.3K0
MacBook苹果电脑如何安装Adobe PS、AU、PR等软件?
Adobe作为全球领先的多媒体设计软件供应商,出品了一系列图形设计、影像编辑与网络开发的Adobe软件产品套装,涵盖平面,插画,音视频,动画等创意类相关应用。从事多媒体设计相关的工作者基本都会用Adobe全系列软件。adobe系列软件有哪些?
office小助手
2022/05/14
8.8K2
MacBook苹果电脑如何安装Adobe PS、AU、PR等软件?
2020版PS快捷键_ps应用快捷键大全
说明:为避免篇幅过大,本文快捷键是基于Windows系统下Photoshop 2020版本的。Mac系统下的快捷键可按以下方式进行对应:Ctrl→Command,Alt→Option。有不能对应的,本文会给出说明。部分项目附加英文是为了方便记忆快捷键。
全栈程序员站长
2022/11/11
1.7K0
2020版PS快捷键_ps应用快捷键大全
Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
审美时代如果你不会ps是不是说不过去了。现在朋友圈的照骗基本都被ps的照骗充斥着。所以赶紧来一起学习Photoshop这一项技能吧!首先你要安装一个ps
用户7442032
2022/12/20
4.6K0
会声会影2020-2023旗舰版功能介绍对电脑系统配置的要求
Corel VideoStudio Ultimate 2023(会声会影2023)旗舰版是Corel旗下一款功能强大的专业视频制作软件的视频编辑软件及视频剪辑软件,非常专业的使用效果,会声会影2023中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整,并且里面超多不同的专场设置,能够让你的视频变得更加自然,不会出现非常生硬的专场,强大的编辑器可以免费使用。
用户10548106
2023/05/04
1.5K0
会声会影2020-2023旗舰版功能介绍对电脑系统配置的要求
一些实用的Photoshop快捷键
将所选文本的文字大小减小10 点像素 【Ctrl】+【Alt】+【Shift】+【<】
半夜喝可乐
2018/10/17
1.9K0
一些实用的Photoshop快捷键
IDEA快速入门(Mac版)
【持续更新】一篇今年年头的老文章顺道发布了,大家有任何问题可以留言沟通。当时刚刚加入团团,愿大家有机会还是购买一台MAC,确实能给大家的效率赋能,虽然在一开始会有一些艰难!⛽️ 望借着换工作的东风,好好的俊一波IDEA,之前始终习惯于Eclipse的使用。
用户1216676
2018/12/27
3.5K0
IDEA快速入门(Mac版)
测试人必备的10款实用谷歌插件,压箱分享!
点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 09:00准时推送,每月不定期赠送技术书籍。
可可的测试小栈
2022/11/11
2.1K0
测试人必备的10款实用谷歌插件,压箱分享!
会声会影2023旗舰版有哪些功能,以及系统配置要求
会声会影2023旗舰版是一款广受欢迎的视频编辑软件,它的最新版本,会声会影2023,已经发布。在这篇文章中,我们将探讨会声会影2023的新功能以及它对视频制作人员的影响。
用户10371284
2023/03/25
9440
会声会影2023旗舰版有哪些功能,以及系统配置要求
会声会影2023旗舰版中文版永久功能介绍,会声会影版本系统要求配置及使用技巧
会声会影2023旗舰版是一款广受欢迎的视频编辑软件,它的最新版本,会声会影2023,已经发布。在这篇文章中,我们将探讨会声会影2023的新功能以及它对视频制作人员的影响。
用户9208731
2023/05/26
9720
会声会影2023旗舰版中文版永久功能介绍,会声会影版本系统要求配置及使用技巧
吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料
现在随着互联网的发展,越来越多的公司都鼓励Mac办公,属实MacOS系统对于我们的工作开发效率有很大提升,所以我们需要收集各种类别非常好用的 Mac 应用程序、软件以及工具。作为一个资深 Mac 用户,我需要它们帮助我快乐、高效的工作,同时也分享给你们。
浅羽技术
2020/12/07
6.4K1
吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料
前端开发日常工作每日记录笔记(2019至2024合集)
从2019年开始,在工作之余会主动记录一些东西,像每天遇到的问题、感想和学到的新的知识点,后面搭建了博客又开始写博客,也整理和记录了很多的笔记。
人人都是码农
2025/04/04
1240
Ubuntu-20.04-LTS(桌面与服务器)版基础配置
Ubuntu 20.04 是 Ubuntu 的第 8 个 LTS 版本代号为"Focal Fossa"; 下载地址: http://releases.ubuntu.com/20.04/ 下载镜像时可以选择以下两种镜像:
全栈工程师修炼指南
2022/09/29
7K0
Ubuntu-20.04-LTS(桌面与服务器)版基础配置
解锁 draw.io 流程图制作工具的强大功能与应用(1/2)
draw.io 是一款由 JGraph 公司开发的基于网页的在线图表绘制工具。它最大的优势之一就是无需进行繁琐的下载和安装步骤,只要打开浏览器,访问其官网,就能立即开始使用。无论是在 Windows 系统、Mac 系统还是 Linux 系统等,只要网络畅通,都可以轻松操作。
正在走向自律
2024/12/23
6050
解锁 draw.io 流程图制作工具的强大功能与应用(1/2)
unity3d新手入门必备教程
   Unity3D入门教程中文版    Unity3D基本操作、    用Unity3D创建简单漫游... 1    基本设置... 1    修改视角控制键为右键... 9    如何取消浏览窗口上的右键菜单... 10    植物效果设置... 10    水面效果的设置... 15    烘培光影贴图的处理... 16    如何制作连续加载的场景漫游... 29    用Unity3D 创建简单漫游    1.      建模中使用的图片、文件、文件夹
py3study
2020/01/08
7K0
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项!
「ximagine」在本篇文章中将介绍「荒岛」目前所使用的显示器测试流程及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,当然这不是唯一的选择,还可以使用尊正Colourspace或者Admesy Prometheus以及积分球软件设备等。我们深知做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,当然我们的也有用大白话让大家都看明白的优势。总的来说是测试设备分为色度计和分光光度计两种类型,色度计使用RGB三色滤色片获取光谱数据,但在同色异谱方面,因为只能获取RGB滤色的结果,所以无法识别同色异谱等现象,分光光度计使用31块滤色镜或者光栅获取全光谱的数据。测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进。如果本内容对您有所帮助,麻烦三连支持一下,十分感谢。网上冲浪久了,键盘侠见的也就多了;他们不仅自己不行,还质疑你不行。
ximagine
2025/02/12
3380
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项!
推荐阅读
相关推荐
Portraiture4全新版本人像磨皮滤镜插件使用下载教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验