[Nodejs]利用Socket.IO配合Express4搭建即时聊天

Socket.IO为WebSockets这个较新的web技术提供了必要的支持,包含客户端与服务端模块,以便建立通信通道,当然也可作为中间件而存在。

1 创建一个express项目

????????? ????? 防工具盗链抓取【如果显示此文字,代表来自第三方转发】 freddon所有 ??? ???????????

可以使用命令行初始化一个express项目

先安装express

npm install express

npm install express-generator

express 项目名

cd 项目名

npm install socket.io

也可以在webstorm下新建express项目 File- new Project - Node.js Express App

创建好后文件视图大概是这样

2 服务端修改默认的文件内容

修改routes文件夹下的index.js为 chat.js

var express = require(‘express‘);
var router = express.Router();
var socket_io = require(‘socket.io‘);

/* GET users listing. */
router.get(‘/‘, function (req, res, next) {
    res.send(‘respond with a resource‘);
});

router.prepareSocketIO = function (server) {
    var io = socket_io.listen(server);
    io.sockets.on(‘connection‘, function (socket) {

        socket.on(‘join‘, function (user) {
            socket.user = user;
            socket.emit(‘state‘, ‘SERVER‘, true);
            socket.broadcast.emit(‘state‘, ‘SERVER‘, user + ‘上线了‘);
        });
        socket.on(‘sendMSG‘, function (msg) {
            socket.emit(‘chat‘, socket.user, msg);
            socket.broadcast.emit(‘chat‘, socket.user, msg);
        });

    });

};

module.exports = router;

修改app.js中

var index = require(‘./routes/index‘);

app.use(‘/index‘, index);

var chat = require(‘./routes/chat‘);

app.use(‘/chat‘, chat);

接下来就需要在app.js中写一个方法了,用来传递server

 app.ready=function(server){
  chat.prepareSocketIO(server);
};

module.exports = app;

进入bin/www,添加内容:

var server = http.createServer(app);

app.ready(server); //添加这句

3 客户端

网页配合socket.io,网页client.html置于public文件夹下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <script src="/socket.io/socket.io.js"></script>
    <style>
        table {
            width: 100%;
        }

        table.tool {
            position: fixed;
            bottom: 0;
            left: 0;
            right: 0;
            padding: 10px;
        }

        #content {
            height: auto;
            padding: 10px;
            padding-bottom: 32px;
        }

        #content tr {
            margin-bottom: 10px;
        }
        #textContent {
            border: 1px solid grey;
            border-radius: 5px;
            padding: 6px;
        }

        .left {
            width: 88%;
        }

        #send {
            width: auto;
            padding: 2px 12px;
            line-height: 26px !important;
            border-radius: 5px;
            font-weight: bold;
            color: white;
            background-color: #ff4400;
        }

        tr.align-left td > span {
            float: left;
        }

        tr.align-left td > span span {
            display: inline-block;
        }

        tr.align-right td > span {
            float: right;
        }

        tr.align-right td > span span {
            display: inline-block;
        }

        span.msg {
            padding: 6px;
            background-color: #00B7FF;
            border: 1px solid #00B7ee;
            border-radius: 5px;
        }

        .timer {
            display: block;
            text-align: center;
        }
    </style>
</head>
<body>
<div>
    <table id="content">
    </table>
</div>

<table class="tool">
    <tr>
        <td class="left">
            <div id="textContent" contenteditable="true" type="text"></div>
        </td>
        <td>
            <button id="send">发送</button>
        </td>
    </tr>
</table>
<script>
    var socket = io.connect(‘http://127.0.0.1:3000‘);
    var userName = "访客某某";
    socket.on(‘connect‘, function () {
        userName = prompt("请输入你的姓名?") || userName;
        socket.emit(‘join‘, userName);
    });
    socket.on(‘chat‘, function (user, data) {
        var p = document.createElement(‘tr‘);
        var direct = ‘align-left‘;
        if (user === userName) {
            direct = ‘align-right‘;
            p.innerHTML = ‘<td><span><span >‘ + data + ‘</span> <span>‘ + user + ‘</span></td><span></span>‘;
        } else {
            p.innerHTML = ‘<td><span> <span>‘ + user + ‘</span>   <span>‘ + data + ‘</span><span></span></td>‘;
        }
        p.className = direct;
        $(‘#content‘).appendChild(p);
    });

    $(‘#send‘).addEventListener(‘click‘, function (target) {
        var content = $(‘#textContent‘).innerHTML;
        if (content = content.replace(" ", "")) {
            socket.emit(‘sendMSG‘, content);
            $(‘#textContent‘).innerHTML = "";
        }
    });

    function $(flag) {
        return document.querySelector(flag);
    }
</script>

</body>
</html>

4 测试

www文件中默认端口号为3000

运行bin/www

cd bin
node www

或者在webstorm中右键Run ‘bin/www‘

接下来,使用浏览器开两个(+)标签访问 http://localhost:3000/client.html (如果测试局域网,将localhost替换为服务器的ip,下同)

首先分别输入用户,然后就可以输入文字进行聊天啦,其他的上线、消息提醒功能我删掉了,仅保留聊天。

放张效果图:

可能出现的问题:

 网页加载socket.io 404  

请不要修改script中的src ,如果不是用端口3000访问

如 http://localhost:63342/项目/public/client.html 请修改socket.io script的 src 为

<script src="http://localhost:3000/socket.io/socket.io.js"></script>

本例代码已经比较少了,嫌麻烦的话需要源码请Email :[email protected];

转载请注明 :http://my.oschina.net/freddon/blog/529599

时间: 2024-08-05 05:49:09

[Nodejs]利用Socket.IO配合Express4搭建即时聊天的相关文章

node+express+socket.io+mysql=通讯服务器搭建(一)

首发github/blog 欢迎大家评论给星 安装 首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后安装express-generator应用骨架 $ mkdir node-demo $ npm install express-generator -g //mac需要加sudo express -h $ express -h 用法: express [options] [dir] 选项: -h, --help 输出使用信息 -V, --version 输出版本号 -e,

NodeJS+Express+Socket.io的一个简单例子

初始化一个NodeJS web应用: 打开CMD窗口. 运行cmd:"mkdir myapp",新建一个文件夹,名为myapp. 运行cmd:"cd myapp",切换到文件夹myapp. 运行cmd:"npm init",创建文件package.json. 3.Express入门应用: 在上面的CMD窗口运行cmd:"npm install express --save", 安装"express" nod

nodejs 基于socket.io实现聊天室

由于之后要做的网页视频直播项目要用到socket.io模块,所以特地花时间研究了下,参照网上的代码做了些改进,自己写了个聊天室代码.不得不承认后端事实推送能力有点厉害,这是以前我用php一直苦恼的事情.下面简单介绍下我的项目,顺带讲解下nodejs. 事实上,在看别人写的代码之前,我一直不知道nodejs是干嘛的,直到真正接触到才明白这也可以算作是服务端代码,丰富的第三方库使其功能极其强大.它可以像golang的beego一样直接通过命令行开启服务器,不过要用到express模块.加载模块的方式

nodejs之socket.io模块——实现了websocket协议

Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,这里主要使用的是socket.io 1.服务端: 1)首先安装socket.io npm  install  socket.io 2)server.js var app = require('http').createServer(handler), io = require('socket.io').listen(a

TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(一)

最近看到TWaver 的html5版本即将发布了,于是今天用TWaver HTML5 + NodeJS + express + websocket.io + redis搭建了一个简单原型.先发出几张效果图给大家尝尝鲜.界面添加.修改以及删除网元后,会自动增量存库,并广播更新. 看看这个广播实现的效果,可以在手机上接受任何操作: 最后再来个告警广播的效果图 在后续的文章中会给大家详细的讲解具体技术的实现.

使用node.js + socket.io + redis实现基本的聊天室场景

在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对之前的一篇文章使用socket.io+redis来实现基本的聊天室应用场景的详细补充. 关于redis的详细情况, 请参考Redis数据库及其基本操作. 对于redis的前提是redis-server一直在运行, 这里就使用默认的localhost:6379. node.js连接redis-serv

nodejs之socket.io 私发消息和选择群组发消息

写在前面:其实有的时候忙碌是好的,比如忙碌起来的自己手机可以一天耗费掉只有20%的电,忙碌的自己很专心于一件事情,但是忙碌不等于过度疲劳,本周忙碌有点上脑,迷糊了一天,都在补觉,还是要去平衡下自己一天中忙碌的时数,累了就休息下,保持一个健康的身体. 今日正题:socketio实现私发消息和群组发消息(不是很困难,一搜一大片,但还是记录下来总结) 基础连接部分在上一篇:https://www.cnblogs.com/mfyngu/p/10780737.html 1.私发消息实现 实现思路:私发消息

使用workerman搭建即时聊天

开发文档:http://doc2.workerman.net/ 下载服务器端安装文件: 有windows版和linux版两个版本,我下载的linux版,在windows上也可以运行. 打开后有这些文件: 把这个文件放在服务器上或者项目中都可以,需要运行的就是最后一个start_for_win.bat文件. 运行成功. 修改start_gateway.php文件: 1 <?php 2 /** 3 * This file is part of workerman. 4 * 5 * Licensed

使用socket.io和node.js搭建及时通信系统

socket.IO是一个websocket库,包括了客户端的js和服务器端的nodejs.官方地址:http://socket.io 使用socket.io和nodejs搭建websocket服务器端 socket.io不仅可以搭建客户端的websocket服务,而且支持nodejs服务器端的websocket. 下面让我来介绍一下怎么安装配置nodejs. 进入http://nodejs.org/#download下载msi文件.一直点next安装.最后文件会自动安装在C:\nodejs目录下