博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用NodeJS实现一个简单的聊天室
阅读量:5999 次
发布时间:2019-06-20

本文共 1985 字,大约阅读时间需要 6 分钟。

hot3.png

今天我来实现一个简单的聊天室,后台用nodejs, 客户端与服务端通信用socket.io,这是一个比较成熟的websocket框架.

初始工作

  • 安装express, 用这个来托管socket.io,以及静态页面,命令npm install express --save,--save可以使包添加到package.json文件里.

  • 安装socket.io,命令npm install socket.io --save.

编写服务端代码

首先我们通过express来托管网站,并附加到socket.io实例里,因为socket.io初次连接需要http协议

var express = require('express'),    io = require('socket.io');var app = express();app.use(express.static(__dirname));var server = app.listen(8888);var ws = io.listen(server);

添加服务器连接事件,当客户端连接成功之后,发公告告诉所有在线用户,并且,当用户发送消息时,发广播通知其它用户.

ws.on('connection', function(client){    console.log('\033[96msomeone is connect\033[39m \n');    client.on('join', function(msg){        // 检查是否有重复        if(checkNickname(msg)){            client.emit('nickname', '昵称有重复!');        }else{            client.nickname = msg;            ws.sockets.emit('announcement', '系统', msg + ' 加入了聊天室!');        }    });    // 监听发送消息    client.on('send.message', function(msg){        client.broadcast.emit('send.message',client.nickname,  msg);    });    // 断开连接时,通知其它用户    client.on('disconnect', function(){        if(client.nickname){            client.broadcast.emit('send.message','系统',  client.nickname + '离开聊天室!');        }    })})

由于客户端是通过昵称来标识的,所以服务端需要一个检测昵称重复的函数

// 检查昵称是否重复var checkNickname = function(name){    for(var k in ws.sockets.sockets){        if(ws.sockets.sockets.hasOwnProperty(k)){            if(ws.sockets.sockets[k] && ws.sockets.sockets[k].nickname == name){                return true;            }        }    }    return false;}

编写客服端代码

由于服务端采用第三方websokcet框架,所以前端页面需要单独引用socket.io客户端代码,源文件可以从socket.io模块里找,windows下路径为node_modules\socket.io\node_modules\socket.io-client\dist,这里有开发版和压缩版的,默认引用开发版就行.

前端主要处理输入昵称检查,消息处理,完整代码如下

    socket.io 聊天室例子    

这里提供

转载于:https://my.oschina.net/u/588516/blog/1589835

你可能感兴趣的文章
JSF+Spring+JPA(Hibernate)常见bug解决办法
查看>>
c运算符和优先级
查看>>
TODO:一不顺眼就换字体Go之代码篇
查看>>
Linux设备驱动程序编写
查看>>
mysql 备份恢复
查看>>
链接记录
查看>>
svn:/Users/linjq/.subversion/config:107: Option ex
查看>>
BGP详解
查看>>
自定义BroadcastReceiver
查看>>
log4j DatePattern格式
查看>>
my paramiko class
查看>>
XML文件解析
查看>>
我的友情链接
查看>>
UIButton如何正确调整imageView及titleLabel的位置
查看>>
mysql主从复制
查看>>
AIX 基础笔记2
查看>>
级联引用完整性约束
查看>>
Linux目录架构详解
查看>>
Add DHCP Reservations in a batch with a Script
查看>>
Service与Android系统实现(1)-- 应用程序里的Service
查看>>