Javascript 节点和套接字io同步问题
我对nodejs和socketio还不熟悉,但我真的很想了解它是如何工作的。我已经完成了socket io网站上的“聊天教程”。然而,我正在尝试做一些“新”的事情。每次建立新连接时,我都希望通过在新选项卡上附加一个随机数,向所有客户端广播一个事件。然而,唯一发生的事情是,它附加了一次(在我自己的连接上),而没有附加到其他连接上?这是不可能的,还是我做得不对 服务器Javascript 节点和套接字io同步问题,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我对nodejs和socketio还不熟悉,但我真的很想了解它是如何工作的。我已经完成了socket io网站上的“聊天教程”。然而,我正在尝试做一些“新”的事情。每次建立新连接时,我都希望通过在新选项卡上附加一个随机数,向所有客户端广播一个事件。然而,唯一发生的事情是,它附加了一次(在我自己的连接上),而没有附加到其他连接上?这是不可能的,还是我做得不对 服务器 var express = require('express'); var app = express(); var http =
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.use("/assets/stylesheets", express.static(__dirname + '/assets/stylesheets'));
app.use("/assets/javascripts", express.static(__dirname + '/assets/javascripts'));
app.use("/assets/demo/avatars", express.static(__dirname + '/assets/demo/avatars'));
app.use("/assets/fonts/font-awesome/", express.static(__dirname + '/assets/fonts/font-awesome/'));
app.get('/dashboard', function(req, res){
res.sendFile(__dirname + '/dashboard.html');
});
io.on('connection', function(socket) {
socket.on('new user', function(username) {
socket.emit('new connection', { nickname: username });
console.log('new connection ' + username);
});
});
http.listen(3000,function() {
console.log('Listening *:3000');
});
客户
<script type="text/javascript">
var randomNumber = Math.floor((Math.random() * 10) + 1);
var socket = io();
socket.on('connect', function() {
socket.emit('new user', randomNumber);
});
socket.on('new connection', function(data) {
var nickname = data.nickname;
$('<li class="active"> <a href="#' + nickname + '" data-toggle="tab">' + nickname + '<span class="label label-success">12</span></a> </li>').appendTo("#uidemo-tabs-default-demo");
});
</script>
var randomNumber=Math.floor((Math.random()*10)+1);
var socket=io();
socket.on('connect',function(){
socket.emit('newuser',randomNumber);
});
socket.on('new connection',函数(数据){
var昵称=data.nickname;
$(“”).appendTo(“#uidemo选项卡默认演示”);
});
您必须使用socket.broadcast.emit
进行广播
socket.on('new user', function(username) {
socket.broadcast.emit('new connection', { nickname: username });
console.log('new connection ' + username);
});
但是,这不会将消息发送到您自己的连接,而是发送到所有其他连接。如果要将消息发送到包括您自己在内的所有连接
socket.on('new user', function(username) {
socket.emit('new connection', { nickname: username });
socket.broadcast.emit('new connection', { nickname: username });
console.log('new connection ' + username);
});
您需要保留服务器上所有打开连接的列表,然后在出现新连接时,向所有其他连接发送消息 这是修改后的代码
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var connections = [];
app.use("/assets/stylesheets", express.static(__dirname + '/assets/stylesheets'));
app.use("/assets/javascripts", express.static(__dirname + '/assets/javascripts'));
app.use("/assets/demo/avatars", express.static(__dirname + '/assets/demo/avatars'));
app.use("/assets/fonts/font-awesome/", express.static(__dirname + '/assets/fonts/font-awesome/'));
app.get('/dashboard', function(req, res){
res.sendFile(__dirname + '/dashboard.html');
});
io.on('connection', function(socket) {
socket.on('new user', function(username) {
connections.forEach(function (socket) {
try {
socket.emit('new connection', { nickname: username });
} catch (err) {
console.log('connection probably closed: ', err);
}
});
console.log('new connection ' + username);
connections.push(socket);
});
});
http.listen(3000,function() {
console.log('Listening *:3000');
});
但是,请注意,只有当Node.js服务器只有一个实例(即,您没有使用集群
模块)时,这才起作用。要让它在集群中工作,需要做更多的工作,如果它必须在冗余基础设施中工作,则需要做更多的工作