我是socket.io的新手,我正在使用NodeJS(表达4)做一个简单的API。我正在开发一个类似于facebook上旧的“戳”动作的动作。用户向其他用户发送戳,这个用户实时收到通知(这就是我使用socket.io的原因)。
这是代码:
app.js
var port = 3000;
var app = module.exports = express();
var server = require('http').Server(app);
...
server.listen(port);
require('./config/socket-io')(app, server, secret);
插座io.js
module.exports = function(app, server, secret) {
var clients = {};
console.log("initiating sockets...");
var sio = require('socket.io').listen(server, {'log level': 2});
sio.on('connection', function (socket) {
console.log("...new connection: "+socket.client.id);
clients[socket.id] = socket;
socket.emit('identification', { data : socket.client.id });
socket.on('newShoutOut', function(data) {
var receptor = data.idTo;
var emiter = socket.client.id;
console.log("...new shout out from " +emiter+ " to "+receptor);
sio.sockets.sockets[receptor].emit({ data : data.data, from : emiter });
});
socket.on('disconnect', function() {
console.log("..."+socket.client.id + " disconnected");
});
});
};
在这里,您可以区分三种状态:
连接:服务器检测到与host:port的所有客户端连接。之后,服务器向每个客户端发送他的ID。这很好。
发送消息:一个客户端向其他客户端发送通知。目前,服务器收到来自一个客户端的通知,但“接收者”没有收到任何内容。
断开连接:在这种情况下无关紧要。
我的问题是,直接向客户端发送消息知道ID的方法是什么?我做错了什么?我尝试了很多选项将消息直接发送到特定的客户端ID但是没有用...
修改
前端
var socket = io('http://localhost:3000');
var id = "";
socket.on('connection', function (data) {
console.log("connected!");
console.log(data);
});
socket.on('identification', function(data) {
id = data.data;
$("#socket_info h1").html("ID: "+id);
});
socket.on('newShoutOut', function(data) {
console.log("newShoutOut received!");
});
答案 0 :(得分:1)
好的,所以我假设shoutout来自用户?您需要在客户端创建事件,例如:
var button = $('#button');
button.on('click', function() {
var msg = 'message',
userID = '123'; //get the ID who they are messaging
socket.emit('sendShoutOut', {msg: msg, id: userID});
});
然后,您需要在服务器上接收该响应,并在该功能中回复该用户:
socket.on('sendShoutOut', function( data ) {
socket.sockets.sockets[data.id].emit('sendPrivateMsg', { data : data.msg, from : emiter });
});
最后,必须通知收件人,因此您需要在客户端处理响应:
socket.on('sendPrivateMsg', function( data ) {
alert(data);
});
希望这有帮助。