从服务器向 Socket.IO 发送事件不工作
Emit Events To Socket.IO Not Working From Server
我正在尝试使用 socket.io 让聊天程序正常工作,但它似乎无法正常工作。
我正在使用 Node.js 服务器,它似乎 运行 正常。我认为这可能与向房间发射有关。
我在客户端浏览器上的代码是:
<script>
var socket = io("https://localhost:3000/userChat");
socket.on('connect', function(){
socket.emit('initialiseConnection', "user1");
});
socket.on('messageIn', function(msg){
console.log(msg);
$('#messages').append($('<li>').text(msg.message));
});
</script>
因此,当页面加载时,socket.io 它会连接到服务器并使用 "user1" 在服务器上发出 "initialiseConnection" 事件。这是专门为该用户创建的新房间。
在服务器上,我处理 "initialiseConnection" 的代码是:
socket.on("initialiseConnection", function(username){
socket.join(username);
console.log(username + " has joined.");
Message.find({recipient:username}, function (err, message){
console.log("messages for "+username+": "+message.length);
for (var x = 0; x < message.length; x++){
console.log(username+"'s message "+x);
console.log(message[x]);
socket.to(username).emit("messageIn", {"message":message[x]});
}
});
});
如您所见,这段代码创建并加入了一个与用户名同名的房间。在数据库中查找任何消息,并尝试将这些消息发送给用户。我记录消息。肯定有一条消息,"socket.to()" 方法中的用户名也正确显示在日志中。但是客户端浏览器上的 "socket.on('messageIn')" 似乎没有接收到该事件。
我也试过:
setTimeout(function() {
socket.to(username).emit("messageIn", {"message":"test message"});
}, 5000);
紧接在 socket.join() 之后,以防这与需要完成的某些后台处理有关
谁能看出我在这方面可能哪里出错了?
谢谢。
--编辑 1------------------------------------
var https = require('https');
var express = require('express');
var app = express();
var server = https.createServer(https_options, app).listen(3000);
var io = require('socket.io')(server);
var userChat = io.of("/userChat");
userChat.on('connection', function(socket){
console.log('a user connected');
socket.on("initialiseConnection", function(username){
...
});
socket.on('disconnect', function(){
socket.leave(socket.room);
});
});
你需要改变这个:
socket.to(username).emit("messageIn", {"message":message[x]});
对此:
socket.emit("messageIn", {"message":message[x]});
套接字是端点。发送时,直接发送到套接字即可。你不发送给房间里的用户?您只需发送到套接字。由于您的 socket
变量中已经有套接字,因此这就是您要发送到的内容。
我正在尝试使用 socket.io 让聊天程序正常工作,但它似乎无法正常工作。
我正在使用 Node.js 服务器,它似乎 运行 正常。我认为这可能与向房间发射有关。
我在客户端浏览器上的代码是:
<script>
var socket = io("https://localhost:3000/userChat");
socket.on('connect', function(){
socket.emit('initialiseConnection', "user1");
});
socket.on('messageIn', function(msg){
console.log(msg);
$('#messages').append($('<li>').text(msg.message));
});
</script>
因此,当页面加载时,socket.io 它会连接到服务器并使用 "user1" 在服务器上发出 "initialiseConnection" 事件。这是专门为该用户创建的新房间。
在服务器上,我处理 "initialiseConnection" 的代码是:
socket.on("initialiseConnection", function(username){
socket.join(username);
console.log(username + " has joined.");
Message.find({recipient:username}, function (err, message){
console.log("messages for "+username+": "+message.length);
for (var x = 0; x < message.length; x++){
console.log(username+"'s message "+x);
console.log(message[x]);
socket.to(username).emit("messageIn", {"message":message[x]});
}
});
});
如您所见,这段代码创建并加入了一个与用户名同名的房间。在数据库中查找任何消息,并尝试将这些消息发送给用户。我记录消息。肯定有一条消息,"socket.to()" 方法中的用户名也正确显示在日志中。但是客户端浏览器上的 "socket.on('messageIn')" 似乎没有接收到该事件。
我也试过:
setTimeout(function() {
socket.to(username).emit("messageIn", {"message":"test message"});
}, 5000);
紧接在 socket.join() 之后,以防这与需要完成的某些后台处理有关
谁能看出我在这方面可能哪里出错了?
谢谢。
--编辑 1------------------------------------
var https = require('https');
var express = require('express');
var app = express();
var server = https.createServer(https_options, app).listen(3000);
var io = require('socket.io')(server);
var userChat = io.of("/userChat");
userChat.on('connection', function(socket){
console.log('a user connected');
socket.on("initialiseConnection", function(username){
...
});
socket.on('disconnect', function(){
socket.leave(socket.room);
});
});
你需要改变这个:
socket.to(username).emit("messageIn", {"message":message[x]});
对此:
socket.emit("messageIn", {"message":message[x]});
套接字是端点。发送时,直接发送到套接字即可。你不发送给房间里的用户?您只需发送到套接字。由于您的 socket
变量中已经有套接字,因此这就是您要发送到的内容。