[英]Socket.io broadcasting not working
我真的是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();
});
});
我試圖在代碼的兩部分中使用廣播功能(這里有注釋“這是行不通的:”),但是我總是在這兩部分中收到未定義的信息。 如果我現在保留代碼,則消息將發送給包括發件人在內的所有客戶端,我想將消息發送給除客戶端之外的所有人。 就像我說的那樣,我也是node和socket.io的新手,所以我不能真正理解問題所在。 在這里的socket.io聊天示例中,他們利用廣播,所以我想這是套接字的一種方法。
預先感謝您的幫助
要從服務器廣播到所有連接的客戶端,請使用:
io.emit(...)
廣播給所有連接的客戶端(一種用途除外):
socket.broadcast.emit(...)
socket
是您不希望廣播到的socket
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.