nodejs实现在线群聊

这不是一个项目而是一个适合初学者学习的例子,主要实现了以下基本功能:

1:群聊,每一个人都可以收到其他人的消息,以及可以发消息给其他人,每一个人用ip地址标识。

2:显示当前在线用户。

3:每一个用户登入登出,其他人都可以看到。

4:每一个用户可以看到其他人是否正在输入消息。

实现方式没有选择低效的轮询方式,而是采用基于websocket协议的socket.io模块,websocket协议允许在客户端与服务端之间建立一个全双工的通信通道,因此服务端可以主动推消息给客户端。相比传统的轮询,实时性更好。

前端代码如下:

<!doctype html>
<html>
<head>
    <title>Socket.IO chat</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font: 13px Helvetica, Arial; }
        form { background: #fc5bff; padding: 2px; position: fixed; bottom: 0; width: 100%; }
        form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
        form button { width: 9%; background: rgb(217, 222, 221); border: none; padding: 10px; }
        #messages { list-style-type: none; margin: 0; padding: 0; }
        #messages li { padding: 5px 10px; }
        #messages li:nth-child(odd) { background: #eee; }
    </style>
</head>
<body>
<ul id="messages"></ul>
<ul><li id='typingshow'></li></ul>
<div id='joinshow'></div>
<div id='leftshow'></div>
<div id='onlineshow'></div>
<form action="">

    <input id="m" autocomplete="off" /><button id='btn'>Send</button>
</form>
<script src="jquery-1.10.2.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io();
    var typingIps={};
    var typing=false;
    var lastTypingTime;
    function updateTyping() {
        if (!typing) {
            typing = true;
            socket.emit('typing');
        }
        lastTypingTime = (new Date()).getTime();

        setTimeout(function () {
            var typingTimer = (new Date()).getTime();
            var timeDiff = typingTimer - lastTypingTime;
            if (timeDiff >= 400 && typing) {
                socket.emit('stop typing');
                typing = false;
            }
        }, 400);
    }
    $('form').submit(function(){
        socket.emit('chat message',$('#m').val());
        socket.emit('stop typing');
        typing = false;
        $('#m').val('');
        return false;
    });
    $('#m').keyup(function(){
        updateTyping();
    });
    socket.on('online num',function(msg){
        $('#onlineshow').text('当前在线'+msg+'人');
    });

    socket.on('join', function (msg) {
        $('#joinshow').text(msg.ip+'加入');
    });
    socket.on('typing',function(msg){
        typingIps[msg.ip]=msg.ip;
        var typingArr=[];
        for(var ip in typingIps){
            typingArr.push(typingIps[ip]);
        }
        $('#typingshow').text(typingArr.join(',') + '正在输入...');
    });
    socket.on('stop typing',function(msg){
        delete typingIps[msg.ip];
        var typingArr=[];
        for(var ip in typingIps){
            typingArr.push(typingIps[ip]);
        }
        if(typingArr.length===0){
            $('#typingshow').text('');
        }else{
            $('#typingshow').text(typingArr.join(',') + '正在输入...');
        }
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg.ip+'说:'+msg.content));
    });
    socket.on('user left', function(msg){
        $('#leftshow').text(msg.ip+'离开了');
        $('#onlineshow').text('当前在线'+msg.onlineNum+'人');
    });
</script>
</body>
</html>

服务端代码:

/**
 * Created by luzhen on 14-11-10.
 */
var express = require('express');
var app=express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var ips={};
app.use(express.static(__dirname + '/public'));
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
});
var onlineNum=0;
io.on('connection', function (socket) {
    console.log(socket.request.connection.remoteAddress);
    ips[socket.request.connection.remoteAddress]=socket.request.connection.remoteAddress;//客户端ip
    //socket.handshake.address 服务端ip
    onlineNum++;
    socket.broadcast.emit('join', {'ip':socket.request.connection.remoteAddress});//广播新用户加入

    io.emit('online num',onlineNum);//广播当前在线人数

    socket.on('chat message', function (msg) {
        io.emit('chat message', {ip:socket.request.connection.remoteAddress,'content':msg});
        console.log('message: ' + msg);
    });

    socket.on('typing', function (msg) {
        socket.broadcast.emit('typing', {'ip':socket.request.connection.remoteAddress});
    });
    socket.on('stop typing', function (msg) {
        socket.broadcast.emit('stop typing', {'ip':socket.request.connection.remoteAddress});
    });

    socket.on('disconnect',function(){
        delete ips[socket.request.connection.remoteAddress];
        onlineNum--;
        socket.broadcast.emit('user left', {'ip':socket.request.connection.remoteAddress,'onlineNum':onlineNum});
    });
});

http.listen(3000, function () {
    console.log('listening on *:3000');
});
时间: 2024-11-13 06:49:48

nodejs实现在线群聊的相关文章

nodejs实如今线群聊

这不是一个项目而是一个适合刚開始学习的人学习的样例.主要实现了下面基本功能: 1:群聊.每个人都能够收到其它人的消息,以及能够发消息给其它人,每个人用ip地址标识. 2:显示当前在线用户. 3:每个用户登入登出.其它人都能够看到. 4:每个用户能够看到其它人是否正在输入消息. 实现方式没有选择低效的轮询方式,而是採用基于websocket协议的socket.io模块,websocket协议同意在client与服务端之间建立一个全双工的通信通道.因此服务端能够主动推消息给client.相比传统的轮

11月第3周业务风控关注 | 下月起互联网平台上线群聊、直播等功能前需安全评估

易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 本周内容安全事件比较集中,故以内容安全特刊形式展现给大家. 1.下月起互联网平台上线群聊.直播等功能前需安全评估 今后,互联网平台新增论坛.微博.公众账号.短视频.直播等功能前需进行安全评估.国家互联网信息办公室今日(11月15日)在官网公布<具有舆论属性或社会动员能力的互联网信息服务安全评估规定>,提出互联网信息服务提供者在上

socket.io实现在线群聊

我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序.最最开始 先安装socket.io: 1 npm install socket.io 利用Node的搭建Http服务 分为两个文件,服务端文件app.js和客户端index.html app.js 01 var app = require('http').createServer(handler)02 , io = require('socket.io').listen(app)03 , fs

检查单 2015-08-30-01

上文: http://my.oschina.net/typhoon/blog/415294 下文: http://typhoon.gotoip4.com 分类: 技能相关项: 基础项: TFW-BASE .TFW-WEB-BASE 和 TFW-WEB-LPM 相关项: [完成] TFW-WEB-LPM .TFW-WEB-LPM "基类集中化"改造.W3C 化及敏感字符替换方式优化. [完成] 基本数据管理恢复 AJAX . [完成] TFW-WEB-LPM 增加"用户功能树&

is大战YY的故事

Sky Profit主要运营针对游戏玩家的在线语音群聊工具iSpeak,业务模式与YY语音聊天类似,曾相继获得雷军和周鸿祎投资.为何雷军和周鸿祎这两个"冤家"会同时投资Sky Profit?这得从2007年以前说起,那时候雷军和周鸿祎还是朋友,2007年5月,雷军接到周鸿祎的一个电话.周鸿祎向雷军透露,自己接触了一家做游戏语音的公司,但是看不太明白,想请雷军帮忙看看.这是一款名为iSpeak的在线群聊语音产品,当时同时在线人数不过一二千人.雷军看了很久,很犹豫.此前,他投资过不下五款即

游戏语音软件iSpeak,是雷军与周鸿祎“友爱过”的一桩证明

游戏语音软件iSpeak,是雷军与周鸿祎"友爱过"的一桩证明 2014-04-02 07:36:00 来源: 虎嗅网(北京) 有2人参与 分享到 根据4月1日酷6提交的SEC文件,游戏语音软件iSpeak运营方创始人许旭东从盛大网络手里收购41%股份,成为酷6第一大股东.有意思的是,资料显示,雷军.周鸿祎这两个老朋友都拥有Sky Profit公司股权. SEC文件显示,许旭东是Sky Profit的公司的创始人.控股股东,Sky Profit曾推出一款名为iSpeak的语音视频文字聊天

I/O复用——聊天室程序

本文主要是为熟悉Linux下网络编程,而实现一个简单的网络聊天室程序.  以Poll实现I/O复用技术来同时处理网络连接和用户输入,实现多个用户同时在线群聊. 其中客户端实现两个功能:一:从标准输入读入用户数据,并将用户数据发送到服务器:二:接收服务器发送的数据,并在标准输出打印. 服务端功能为:接收客户端数据,并将客户数据发送到登录到该服务端的所有客户端(除数据发送的客户端外). 服务端程序 chat_server: #define _GNU_SOURCE 1 #include<sys/typ

(linux运维学习总结)IT事业者必须清醒意识到计算机系统在宇宙人生中的本质作用和意义

IT事业者,是从事IT相关事业的人员,比如计算机学院的老师和学生,计算机企业和网络企业的老板员工,通信公司企业的各种人员,等等.由于IT技术已经深入到各行各业各领域,所以: 不光是IT事业者,就是所有正常的人都应该了解认识计算机系统在宇宙人生中的准确作用和意义. 尤其是伴随着第四次工业革命的到来,计算机系统普及越来越全面广泛深入,更要认识到人们发明和使用计算机系统的初心是什么.只有这样做以后,才不会在IT事业的学习和工作当中迷茫无知. 粗略举例来说,现代计算机系统包括: 科研院所国防超算等部门的

[Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能

何为UDP(User Datagram Protocol)? 从baidu摘过来一段:UDP,用户数据报协议,与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层.根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议.UDP协议的主要作用是将网络数据流量压缩成数据包的形式.一个典型的数据包就是一个二进制数据的传输单位.每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据. UDP报文没有可靠性保证.顺序保证和流量控制字段等,可