node.js - 如何用websocket实现与好友列表中的指定好友聊天?
大家讲道理
大家讲道理 2017-04-17 11:38:52
[Node.js讨论组]

整个逻辑是怎么样的,web端如何发起请求,服务器端如何处理多个不同的用户间的聊天。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
PHP中文网

其实原理很简单,服务器保存好所有的 Client->Server 的 Socket 连接,Client A 发送消息给 Client B 的实质是:Client A -> Server -> Client B
即 Client A 发送类似 {from:'Client A', to:'Client B', body: 'hello'} 的数据给 Server。Server 接收数据根据 to 值找到 Client B 的 Socket 连接并将消息转发给 Client B。

大家讲道理

推荐使用socket.io,里面可以方便的指定特定的人进行发送消息

高洛峰

你可以设计一个简单的数据结构,然后放到websocket里发出去。

websocket.send('srcUser,dstUser,time,message')

怪我咯

题主是用原声net模块,还是socket.io呢,这里假设题主用了socket.io(不想用怎么办?看下socket.io的源码,自己实现个客户端socket连接队列)
server.js

var
    io = require('socket.io'),
    ioServer = io.listen(8000),
    sequence = 1;
    clients = [];

// 每一个新的client都会触发connection事件,将其push到clients队列,广播到所有客户端,更新在线人员列表:
ioServer.on('connection', function(socket) {
    console.info('New client connected (id=' + socket.id + ').');
    clients.push(socket);
    freshClients();
    // 断开时从clients移除,并广播到所有客户端,更新在线用户列表
    socket.on('disconnect', function() {
        var index = clients.indexOf(socket);
        if (index != -1) {
            clients.splice(index, 1);
            console.info('Client disconnet (id=' + socket.id + ').');
            freshClients();
        }
    });
});
ioServer.on('message',function(socket,message){
    var id = message.split(":")[0];
    var message = message.split(":")[1];
    clients.find(function(c){return c.id == id}).emit('message',message);
});

function freshClients(){
    ioServer.clients.emit('freshClients', clients.map(function(c){return c.id}));

}

简单手打的代码,可能有问题,具体参考socket.io的文档

对应的客户端,就只需要监听freshClients事件,更新在线用户列表,然后选择指定id,向服务器发送形如id:message格式的数据

有问题 再留言

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号