nodejs 实例 使用 Express + Socket.IO 搭建多人聊天室

https://cnodejs.org/topic/51d51cd8d44cbfa3047926ba 作者 nswbmw

详细内容大家可以看这个。

由于时间久远,很多代码都过期了。我刚更新了app.js代码。

/**
 * Module dependencies.
 */

var express = require(‘express‘)
    , http = require(‘http‘)
    , path = require(‘path‘);

var app = express();

// all environments
app.set(‘port‘, process.env.PORT || 3000);
app.set(‘views‘, __dirname + ‘/views‘);
app.set(‘view engine‘, ‘jade‘);
var favicon = require(‘serve-favicon‘);//需安装
app.use(favicon(__dirname + ‘/public/favicon.ico‘));
var morgan = require(‘morgan‘);//需安装
app.use(morgan(‘dev‘));
var bodyParser = require(‘body-parser‘);//需安装

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
var cookieParser = require(‘cookie-parser‘);//需安装
app.use(cookieParser());
//app.use(app.route);
app.use(express.static(path.join(__dirname, ‘public‘)));

var users = {};//存储在线用户列表的对象

app.get(‘/‘, function (req, res) {
    if (null == req.cookies.user) {
        res.redirect(‘/signin‘);
    } else {
        res.sendFile(__dirname + ‘/views/index.html‘);
    }
});
app.get(‘/signin‘, function (req, res) {
    res.sendFile(__dirname + ‘/views/signin.html‘);
});
app.post(‘/signin‘, function (req, res) {
    if (users[req.body.name]) {
        //存在,则不允许登陆
        res.redirect(‘/signin‘);
    } else {
        //不存在,把用户名存入 cookie 并跳转到主页
        res.cookie("user", req.body.name, {maxAge: 1000*60*60*24*30});
        res.redirect(‘/‘);
    }
});

var server = http.createServer(app);
var io = require(‘socket.io‘).listen(server);
io.sockets.on(‘connection‘, function (socket) {
    //有人上线
    socket.on(‘online‘, function (data) {
        //将上线的用户名存储为 socket 对象的属性,以区分每个 socket 对象,方便后面使用
        socket.name = data.user;
        //users 对象中不存在该用户名则插入该用户名
        if (!users[data.user]) {
            users[data.user] = data.user;
        }
        //向所有用户广播该用户上线信息
        io.sockets.emit(‘online‘, {users: users, user: data.user});
    });
    //有人发话
    socket.on(‘say‘, function (data) {
        if (data.to == ‘all‘) {
            //向其他所有用户广播该用户发话信息
            socket.broadcast.emit(‘say‘, data);
        } else {
            //向特定用户发送该用户发话信息
            //clients 为存储所有连接对象的数组
            //var clients = io.sockets.clients();
            var clients= io.sockets.sockets;
            //遍历找到该用户
            clients.forEach(function (client) {
                if (client.name == data.to) {
                    //触发该用户客户端的 say 事件
                    client.emit(‘say‘, data);
                }
            });
        }
    });
    //有人下线
    socket.on(‘disconnect‘, function() {
        //若 users 对象中保存了该用户名
        if (users[socket.name]) {
            //从 users 对象中删除该用户名
            delete users[socket.name];
            //向其他所有用户广播该用户下线信息
            socket.broadcast.emit(‘offline‘, {users: users, user: socket.name});
        }
    });
});

server.listen(app.get(‘port‘), function(){
    console.log(‘Express server listening on port ‘ + app.get(‘port‘));
});

工具,webstorm

时间: 2024-11-05 19:13:06

nodejs 实例 使用 Express + Socket.IO 搭建多人聊天室的相关文章

使用node.js和socket.io实现多人聊天室

刚学node.js,想着做点东西练练手.网上的东西多而杂,走了不少弯路,花了一天时间在调代码上.参考网上的一篇文章,重写了部分代码,原来的是基于基于node-websocket-server框架的,我没用框架,单单是socket.io. 一.基本功能 1.用户随意输入一个昵称即可登录2.登录成功后1) 对正在登录用户来说,罗列所有在线用户列表,罗列最近的历史聊天记录2) 对已登录的用户来说,通知有新用户进入房间,更新在线用户列表3.退出登录1)支持直接退出2) 当有用户退出,其他所有在线用户会收

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

认识websocket WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duple).一开始的握手需要借助HTTP请求完成. 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http . 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部

nodejs学习(3) express+socket.io

//node var express=require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); app.use(express.static('public')); io.on('connection', function(socket){ socket.on('message', function(

vue + socket.io实现一个简易聊天室

vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那么容易了.功能虽然不多,但还是有收获.设计和实现思路较为拙劣,恳请各位大大指正. 可以达到的需求 能查看在线用户列表 能发送和接受消息 使用到的框架和库 socket.io做为实时通讯基础 vuex/vue:客户端Ui层使用 Element-ui:客户端Ui组件 类文件关系图 服务端: 客户端: 服

socket.io入门,简易聊天室

介绍 通常我们web使用的是http协议,但是 HTTP 协议有一个缺陷:通信只能由客户端发起. 所以我们需要一个可以由服务端主动发出的协议,即WebSocket. WebSocket是HTML5新增的一种通信协议,其特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种. Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯.通知与消息推送,实时分析等场景中有较为广泛的应用. socket.io 包含两个

基于socket编程的多人聊天室

先是做完的效果图:      server.c 1 /* 服务器端 server.c */ 2 #include <glib.h> 3 #include <stdio.h> 4 #include <fcntl.h> 5 #include <signal.h> 6 #include <sys/socket.h> 7 #include <sys/types.h> 8 #include <sys/time.h> 9 #inclu

Linux下基于Socket网络通信的多人聊天室

服务端 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> cha

使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方

使用Node.js+Socket.IO搭建WebSocket实时应用

Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作者:潘良虎链接:https://www.zhihu.com/question/20215561/answer/26419995来源:知乎原文地址:http://www.plhwin.com/2014/05/28/nodejs-socketio/ WebSocket简介 谈到Web实时推送,就不得不说