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

最近学习了一下socket.io,不太会用,所以做了一个小demo理一下思路。

主要目的是实现向某个指定的用户发送消息,也就是服务端单独推送信息给某个人。具体的思路就是每个在线的用户都对应一个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.onclick=function(){
        socket.emit('setRoom',{"roomId":$("roomId").value}) ;
    };
    sayTo.onclick=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>

重要的部分都加了注释,写的不太好,还需要继续学习!

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个使用Socket.IONode.js中实现通讯的示例代码: 1. 安装Socket.IO模块: ```shell npm install socket.io ``` 2. 创建服务器端(server.js): ```javascript var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); // 监听客户端连接事件 io.on('connection', function(socket){ console.log('A client connected.'); // 监听客户端发送消息事件 socket.on('message', function(data){ console.log('Received message from client:', data); // 触发事件告知客户端 io.emit('message', 'Server received your message: ' + data); }); // 监听客户端离开事件 socket.on('disconnect', function(){ console.log('A client disconnected.'); // 触发事件告知服务端 io.emit('disconnect', 'A client disconnected.'); }); }); // 启动服务器 server.listen(3000, function(){ console.log('Server is running on port 3000.'); }); ``` 3. 创建客户端(client.html): ```html <!DOCTYPE html> <html> <head> <title>Socket.IO Client</title> <script src="https://cdn.socket.io/socket.io-3.1.3.min.js"></script> <script> var socket = io(); // 发送消息给服务端 socket.emit('message', 'Hello, server!'); // 监听服务端发送消息事件 socket.on('message', function(data){ console.log('Received message from server:', data); }); // 监听服务端触发的离开事件 socket.on('disconnect', function(data){ console.log('Server:', data); }); </script> </head> <body> <h1>Socket.IO Client</h1> </body> </html> ``` 请注意,以上代码仅为示例,实际使用时可能需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值