html5 websocket + node.js 实现网页聊天室
1 client: socket.io
server: node.js + express + socket.io
一个简单的聊天室 demo,没有注册,内置了一些测试用户

2 client 关键代码
var socket = io.connect('http://localhost:8080');
socket.on('connect',function(){
console.log('connected to server');
socket.on('login success',function(data){
console.log('login success');
username = data.username;
refreshOnlineUsers(data.allusers);
});
socket.on('disconnect',function(){
console.log('disconnect');
username = null;
});
socket.on('login failed',function(){
username = null;
});
socket.on('new message',function(data){
console.log('receiver message from '+data.fromUser +' '+data.date+ ' '+data.msg);
});
socket.on('update myself',function(data){
});
socket.on('enter chat',function(data){
console.log(data.username+' has entered the chat');
refreshOnlineUsers(data.allusers);
});
socket.on('leave chat',function(data){
console.log(data.username + ' has leaved the chat');
refreshOnlineUsers(data.allusers);
});
});
3 server 关键代码
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.use('/', express.static(__dirname + '/www'));
var users = {
fanglin:{
socket:null,
online:false
},
xingtianyu:{
socket:null,
online:false
}
};
io.on('connection', function(socket){
socket.on('new message',function(data){
var i,user;
socket.emit('update myself',{fromUser:data.fromUser,msg:data.msg,date:new Date()});
if(data.broadcast===true){
socket.broadcast.emit('new message',{fromUser:data.fromUser,msg:data.msg,date:new Date()});
}else{
for(i=0;i<data.tousers.length;i++){
user = users[data.tousers[i]];
if(user.online==true && user.socket!=null){
user.socket.emit('new message',{fromUser:data.fromUser,msg:data.msg,date:new Date()});
}
}
}
});
socket.on('login',function(data){
if(data.username in users){
users[data.username].online = true;
users[data.username].socket = socket;
socket.emit('login success',{username:data.username,allusers:getOnlineUsers()});
socket.broadcast.emit('enter chat',{username:data.username,allusers:getOnlineUsers()});
}else{
socket.emit('login failed');
}
});
socket.on('disconnect',function(){
var user;
for (user in users){
if(users[user].socket == socket){
users[user].online = false;
socket.broadcast.emit('leave chat',{username:user,allusers:getOnlineUsers()});
return;
}
}
});
});
server.listen(8080);
console.log('server is listenering on port 8080');
4 实现了一个简单的有限状态机
(1) 客户端启动时去连接服务器,连接成功触发服务端的 connection 事件
(2) 连接成功后客户端可登陆,触发服务端的 login 事件,服务端查找用户,若登陆成功服务端向客户端发送 login success 的消息,并返回所有在线用户,同时向其他在线用户发送 enter chat 广播,登陆失败则向客户端发送 login failed 消息。
(3) 客户端登陆成功后可向其他在线用户发送消息,客户端向服务端发送 new message 消息,服务端收到 new message 消息后,先向客户端发送 update myself 消息,客户端如果勾选了 Select All, 服务端会接着发送 new message 广播,否则遍历所有接收者,依次向这些接收者发送 new message 消息。
(4) 客户端断开连接后触发服务端 disconnect 事件,服务端发送 leave chat 广播。
(5) 客户端在收到 new message update myself 时会更新聊天室里的聊天内容。收到 login success 、 enter chat 、leave chat 时会更新当前在线用户。收到 login success 、login failed 时更新在线状态 。。。
代码不多非常简单,大家一看就能明白.
代码地址: https://github.com/lesliebeijing/MyChatRoom.git
html5 websocket + node.js 实现网页聊天室的更多相关文章
- 《基于Node.js实现简易聊天室系列之总结》
前前后后完成这个聊天室的Demo花了大概一个星期,当然一个星期是仅仅指编码的工作.前期的知识储备是从0到1从无到有,花费了一定的时间熟悉Node.js的基本语法以及Node.js和mongoDB之间的 ...
- HTML5 - websocket的应用 之 简易聊天室
需要知识点: 前端知识 jq操作dom nodejs socket.io 关于websocket api的知识点,见上篇章<HTML5-Websocket>. 聊天室思路/原理: A和B聊 ...
- 《基于Node.js实现简易聊天室系列之详细设计》
一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次 ...
- 《基于Node.js实现简易聊天室系列之项目前期工作》
前期工作主要包括:项目的创建,web服务器的创建和数据库的连接. 项目创建 网上关于Node.js项目的创建的教程有很多,这里不必赘述.Demo所使用的Node.js的框架是express,版本为4. ...
- 《基于Node.js实现简易聊天室系列之引言》
简述:这个聊天室是基于Node.js实现的,完成了基本的实时通信功能.在此之前,对node.js和mongodb一无所知,但是通过翻阅博客,自己动手基本达到了预期的效果.技术,不应该是闭门造车,而是学 ...
- 《基于Node.js实现简易聊天室系列之环境搭建》
前文提到了Demo所涉及的技术,现在讲环境(工具)的配置.环境的配置主要是数据库mongDB和Node.js的配置. Node.js Node.js的官方地址:https://nodejs.org/e ...
- WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...
- Java和WebSocket开发网页聊天室
小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...
- JavaWeb网页聊天室(WebSocket即时通讯)
原文:http://baike.xsoftlab.net/view/656.html Git地址 http://git.oschina.net/loopcc/WebSocketChat 概要: Web ...
随机推荐
- python学习笔记011——内置函数filter()
1 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 2 语法 filter(function, iterable) function -- 函数,过 ...
- Python监控Windows下的文件变化
windows下监控文件系统的变化.用python非常方便.实例代码例如以下,非常easy.也不多说了. import os import win32file import win32con ACTI ...
- 判断当前用户有无Administrator的权限
很方便的一个函数,有兴趣的看看! /************************************************************************/ /* 函数说明: ...
- Python 字典 items() 方法
描述 Python 字典 items() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回可遍历的(键, 值) 元组数组. 语法 items() 方法语法: D.items() ...
- linux查看与开启sshd服务
1.首先通过物理终端进入到linux上,手工检查ssh发现没运行/etc/init.d/sshd statussshd is stopped 手工启动服务,发现报告权限错误./etc/init.d/s ...
- mysql-5.7 密码过期详解
一.起源: 今天一上班就听到说error-log里记录了大量的 ERROR 1820 (HY000): You must reset your password using ALTER USER st ...
- mysql-cluster 环境安装&配置
一.mysql-cluster 的介绍: 1.说心里话mysql-cluster这货性能上是不行的,之前一个同事测试了来的结果是8个主机组成的mysql-cluster性能 上搞不过一个单机的mysq ...
- Linux内存管理机制中buffer和cache的区别
Linux内存管理机制中buffer和cache的区别理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别. Fr ...
- OpenGl学习glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...
- Linux系统中 Sublime Text 中文 GBK 文件乱码问题
Sublime Text 是一个很不错编辑器,具有漂亮的界面和强大的功能.再加上丰富的插件,而且还跨平台,绝对是一款实打实的神器啊! 众所周知,Sublime Text 对中文支持的极差,可以说几乎就 ...