socket.broadcast.to(receiver_socket_id)向接收者发送n个数据(而不是一个),其中n是用户连接的数量

时间:2016-12-07 07:41:57

标签: node.js socket.io

我正在使用socket.io进行私人聊天,我正在使用

服务器端
socket.broadcast.to(receiver_socket_id).emit('message', data); // where data is a json object containing text

在客户端代码我使用

捕获数据
socket.on('message', function (data) {
alert(data. text);
});

当只连接两个套接字(发送方和接收方)时,它正常工作并在特定用户(套接字ID)的面板上显示警报。但是当另一个用户连接到该套接字然后我看到两个警报并且当总共4个用户连接(发送者+接收者+另外两个)然后看到3个警报时出现问题。但好处是我只能看到特定客户的面板而不是其他面板的警报。 我无法理解这个问题,请帮忙。 请看一下 gyazo.com/a98d3a64a9fc6487e6ded8ccd90fd5ab

它打印测试三次,因为打开了三个浏览器。

此处的完整代码: Sever方面(我使用过Redis):

var app = require('express')();

var server = require('http').Server(app);

var io = require('socket.io')(server);

var redis = require('redis');


server.listen(8080);
var usernames = {};
io.on('connection', function (socket) {
    console.log(socket.id);

    socket.on('adduser', function (userId) {
        usernames[userId] = socket.id;
    });

    var redisClient = redis.createClient();
    redisClient.subscribe('message-channel');
    redisClient.on('message', function (channel, data) {
        var jsonObj = JSON.parse(data);
        var rcvrId = jsonObj.rcvrId;
        socket.broadcast.to(usernames[rcvrId]).emit('message', data); // Not throwing error....should work
    });
    socket.on('disconnect', function () {
        console.log(socket.id + ' Disconnected');
        redisClient.quit();
    });
});

客户方:

var socket = io.connect('http://localhost:8080');
var userId = $('input[name="userId"]').val();
var rcvrId = $('input[name="rcvrId"]').val();

socket.on('connect', function () {
    // call the server-side function 'adduser' and send one parameter (value of prompt)
    socket.emit('adduser', userId);
});
socket.on('message', function (data) {
    data = jQuery.parseJSON(data);
    console.log(data);
    $("#messages").append("<div><strong>" + data.userId + " : </strong><span>" + data.message + "</span></div>");

});

1 个答案:

答案 0 :(得分:0)

您可以使用/。如果您使用的是不同的命名空间,只需将 [HttpPost] public ActionResult getCityJson(string stateId) { int _stateid = Convert.ToInt32(stateId); List<Cities> objcity = new List<Cities>(); objcity = _db.Cities.Where(m => m.stateID == _stateid).ToList(); SelectList obgcity = new SelectList(objcity, "CityID", "CityName", 0); return Json(obgcity); } 替换为您的命名空间。