• 简单的nodejs+socket.io给指定的人发送消息


    文章非本人所写,原文地址:https://blog.csdn.net/qq_40081577/article/details/82932480 博主地址:https://blog.csdn.net/qq_40081577 , 读过博主的文章获益匪浅,感谢博主!

    主要目的是实现向某个指定的用户发送消息,也就是服务端单独推送信息给某个人。具体的思路就是每个在线的用户都对应一个socket对象,可以通过socket.id获取其唯一的id。通过该对象(toSocket)与链接到这个对象的客户端进行单独通信。

    • socket.io服务端代码
    var app = require('http').createServer(handler);
    var io = require('socket.io')(app);
    var fs = require('fs');
    var _ = require('underscore');
    // 监听端口
    app.listen(3000);
    var hashName = new Array();
     
    function handler(req, res) {
        fs.readFile(__dirname + '/index.html',
            function (err, data) {
                res.writeHead(200);
                res.end(data);
            });
    }
     
    // 通过 emit 和 on 可以实现服务器与客户端之间的双向通信
     
    // io.sockets.on('connection', function (socket) { ... }) 的作用是服务器监听所有客户端 并返回该新连接对象
    // 这个事件在在客户端与服务器建立链接时自动触发
    io.on('connection', function (socket) {
        console.log('新加入一个连接。');
        // 不管是服务器还是客户端都有 emit 和 on 这两个函数,socket.io 的核心就是这两个函数
        socket.on('setRoom', function (data) {
            console.log(data);
            var name = data.roomId;
            // // 储存上线的用户
            hashName[name] = socket.id;
        });
        /**
         * on :用来监听一个 emit 发送的事件
         * 'sayTo' 为要监听的事件名
         * 匿名函数用来接收对方发来的数据
         * 这个匿名函数的第一个参数为接收的数据,如果有第二个参数,则是要返回的函数。
         */
        socket.on('sayTo', function (data) {
            var toName = data.to;
            var toId = data.id;
            if (toId = hashName[toName]) {
                // nodejs的underscore扩展中的findWhere方法,可以在对象集合中,通过对象的属性值找到该对象并返回。
                var toSocket = _.findWhere(io.sockets.sockets, {id: toId});
     
                // socket.emit() :向建立该连接的客户端广播
                // socket.broadcast.emit() :向除去建立该连接的客户端的所有客户端广播
                // io.sockets.emit() :向所有客户端广播,等同于上面两个的和
     
                // 通过该连接对象(toSocket)与链接到这个对象的客户端进行单独通信
                toSocket.emit('message', data.msg);
            }
        });
     
        // 当关闭连接后触发 disconnect 事件
        socket.on('disconnect', function () {
            console.log('断开一个连接。');
        });
    });
    
    • index.html代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>socket.io演示客户端</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
    </head>
    <body>
    <h1>socket.io演示客户端</h1>
    <input type="text" placeholder="设置房间号" id="roomId"><button>确定</button>
    <input type="text" placeholder="发送消息" id="msg">
    <input type="text" placeholder="发送给" id="toRoomId"><button id="sayTo">确定</button>
    <div id="word">
     
    </div>
    </body>
    <script>
        $=function (id) {
            return document.getElementById(id);
        };
        var socket = io.connect('127.0.0.1:3000');
        var setRoom = document.getElementsByTagName("button")[0],
            sayTo = document.getElementsByTagName("button")[1],
        msg = $("msg"),
        word = $("word"),
        toRoom=$("toRoomId");
        setRoom.οnclick=function(){
            socket.emit('setRoom',{"roomId":$("roomId").value}) ;
        };
        sayTo.οnclick=function () {
            var toMsg=msg.value;
            socket.emit("sayTo",{"to":toRoom.value,"msg":toMsg});
        };
        // 当收到对方发来的数据后触发 message 事件
        socket.on('message',function (data) {
            word.innerHTML+="<p>"+data+"</p>";
        });
    </script>
    </html>
    
  • 相关阅读:
    thinkPHP中怎么访问域名直接跳到后台登录页面
    使用ajax方法实现form表单的提交
    微信小程序根据生日获取年龄
    微信小程序出现 text 设置行高 line-height 无效的问题
    微信小程序中换行,空格(多个空格)写法
    如何用css实现弧度圆角?三角形以及圆形
    微信小程序的bindtap事件
    JS控制只能输入数字并且最多允许小数点两位
    微信小程序如何做金额输入限制
    微信小程序使用函数的三种方法
  • 原文地址:https://www.cnblogs.com/dch0/p/11338357.html
Copyright © 2020-2023  润新知