【问题标题】:Socket.io broadcasting not workingSocket.io 广播不起作用
【发布时间】:2016-06-16 15:08:17
【问题描述】:

我对 node.js 真的很陌生,我开始学习它。实际上,我正在尝试开发一个简单的聊天应用程序,只是为了学习目的。 我也在使用 socket.io 包。 这就是我所做的: 1) index.js

var express = require('express');
var app = express();
var path = require('path');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var users = {};
var socket = io.listen(3001);
var dateFormat = require('dateformat');

app.use('/public',express.static(path.join(__dirname, '/public')));

app.get('/',function(req,res){
    res.sendFile(__dirname+'/index.html')
});

//CHAT
socket.on('connection',function(client){        
    client.on('join',function(name){   
        var date = dateFormat(new Date(),"HH:MM:ss dd-mm-yyyy");
        var hour = dateFormat(new Date(),"HH:MM:ss");
        users[client.id] = {"name":name,"id":client.id,"status":1,"joinDate":date};       
        client.emit("update", "You have connected to the server.");
        var msg ={'msg':"Client: "+name+" joined the channel", 'user':name,'hour':hour,'fromServer':1};   
        io.sockets.emit('update', msg);          
    });
    client.on('request-list',function(){       
        client.emit('user-list',users);
    });
    client.on('chat',function(msg){
            //socket.broadcast.emit('update',msg);
            //THIS DOESN'T WORK
            socket.emit('update', msg);       
    });

    client.on('disconnect',function(){       
        delete users[client.id]; 
        if(Object.keys(users).length>0){
            console.log(Object.keys(users).length);
        } else{
            console.log("NESSUNO");
        }     
    });  
});
//END CHAT

http.listen(3000,function(){
    console.log('listening on 3000');
});

2) main.js

$(document).ready(function(){
    var socket = io.connect('127.0.0.1:3001');    
    var chatStarted = false;    
    $('[data-type="loginMask"] [data-component="login-button"]').off().on('click',function(){
        socket.emit('join',$('[data-component="login-nickname"]').val());
        localStorage.setItem('user',$('[data-component="login-nickname"]').val());                
    });
    socket.on('update',function(msg){
        if(!chatStarted){
            $('[data-type="loginMask"]').hide();
            $('[data-type="chatMask"]').show();
            socket.emit('request-list'); 
            chatStarted=true;
        }else{                 
            $('[data-component="chat"] [data-component="chat-messages"]').append(formatMessage(msg));            
        }       
    });
    socket.on('user-list',function(list){       
        var html ='';
        $.each(list,function(k,item){
            html += '<div data-component="userlist" data-id="'+item.id+'">';
            html += '<span data-component="userlist-status">'+getStatus(item.status)+'</span>';
            html += '<span data-component="userlist-user">'+item.name+'</span>';
            html += '<span data-component="userlist-caret"><i class="fa fa-caret-right" aria-hidden="true"></i></span>';
            html += '</div>';
        });
        $('[data-type="userlist"]').append(html).promise().done(function(){

        });
    });
    $('[data-component="chat-text"]').off().on('keydown',function(e){
        if(e.which==13){
            $('[data-component="chat-send"]').trigger('click');
        }
    });
    $('[data-component="chat-send"]').off().on('click',function(){       
        var msgToSend = {'msg':$('[data-component="chat-text"]').val(),'user':localStorage.getItem('user'),'fromServer':0}; 
        $('[data-component="chat"] [data-component="chat-messages"]').append(formatMessage(msgToSend)); 
             //socket.broadcast.emit('chat',msg);
            //THIS DOESN'T WORK       
        socket.emit('chat',msgToSend);
        $('[data-component="chat-text"]').empty();
    });
});

我尝试在代码的两部分中使用广播功能(其中有注释 THIS DOESN'T WORK :),但我总是在两部分中都收到 undefined。如果我现在保留代码,则消息将发送给包括发件人在内的所有客户端,我想将消息发送给除客户端之外的所有人。 正如我所说,我也是 node 和 socket.io 的新手,所以我无法真正理解问题所在。 在socket.io聊天示例here中他们使用了广播,所以我猜这是socket的一种方法。

提前感谢您的帮助

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    要从服务器向所有连接的客户端广播,请使用:

    io.emit(...)
    

    向所有连接的客户端广播,除了一个用途:

    socket.broadcast.emit(...)
    

    socket 是您不想广播的对象。

    【讨论】:

    • 谢谢你的回答,你是对的。但是我在我的代码中犯了一个错误。在 index.js 文件中,而不是使用 socket.broadcast.emit(...),我应该使用 client.broadcast.emit(...),因为那是我要广播的套接字。
    • 不错的答案 ...tnx
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2018-08-08
    • 2017-02-24
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多