我要疯了!文档太糟糕了,根本不是真的。
我想通过socket.io发送一个反馈给特定的客户端
我的服务器端是这样的:
app.get('/upload', requiresLogin, function(request, response) {
response.render('upload/index.jade');
io.sockets.on('connection', function (socket) {
console.log('SOCKET ID ' + socket.id);
io.sockets.socket(socket.id).emit('new', 'hello');
});
});
和客户端看起来像这样:
$(document).ready(function() {
var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
socket.on('new', function (data) {
console.log(socket.id);
console.log(data);
//$('#state').html(data.status);
});
});
但是客户端什么都不做。我几乎什么都试过了。谁能告诉我我做错了什么,拜托!(
发送一个消息到一个特定的客户端保存每一个连接到一个对象的服务器。
var socketio = require('socket.io');
var clients = {};
var io = socketio.listen(app);
io.sockets.on('connection', function (socket) {
clients[socket.id] = socket;
});
之后你可以这样做:
var socket = clients[sId];
socket.emit('show', {});
通过套接字向特定客户端发送反馈的几种方法。io包括:
-
正如pkyeck所说,将所有客户端保存到一个对象中,这样你就可以在以后的路由处理程序中发送给这些特定的客户端,例如:
var sessionsConnections = {}; sio.on('connection', function (socket) { // do all the session stuff sessionsConnections[socket.handshake.sessionID] = socket; });
-
或者,使用socket。Io内置了对房间的支持——在连接时为每个客户端订阅一个房间,并在路由处理程序中通过这个房间发送,例如:
sio.on('connection', function (socket) { // do all the session stuff socket.join(socket.handshake.sessionID); // socket.io will leave the room upon disconnect }); app.get('/', function (req, res) { sio.sockets.in(req.sessionID).send('Man, good to see you back!'); });
确认:
http://www.danielbaulig.de/socket-ioexpress/评论- 1158
注意,这两个示例解决方案都假设socket。IO和express已配置为使用相同的会话存储,因此引用相同的会话对象。有关实现这一目标的更多细节,请参阅上面和下面的链接:
https://github.com/LearnBoost/socket.io/wiki/Authorizing2件事
1)您应该将io.sockets.on(..)
置于app/update
路由之外,以防止为客户端添加多个侦听器。
2) io.sockets.socket (id);不应该使用,应该是socket.emit('new', 'hello')
在套接字中。IO 1.0是这样工作的。它可能适用于较低版本,但我不能保证。
socket.to(socket_id_here).emit('new', 'hello');
这个可以工作,因为socket。IO在连接时自动添加一个带有socket id的套接字到房间。
而且,如果你打算升级到1.0版本,api会有很多变化,所以有时你必须修改一些代码才能使它在1.0版本中工作。
在Socket中这样做的正确方法。IO 1.0+ is:
io.to(users_socket_id).emit('new', 'hello');
您还可以将房间名称替换为'users_socket_id'以发送到特定的套接字。io房间。
首先,您不能在客户端使用socket.id
。
然后改变
var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
var socket = io.connect('http://localhost:80/');
我相信io.sockets.socket已被删除,并且在Socket中存在问题。IO (https://github.com/socketio/socket.io/issues/1618) .
你可以使用io.sockets.connected[socket.]Id]并存储socket。通过用户名引用的Id:
var usernames = {};
usernames[username] = socket.id;
// Sending the message
io.sockets.connected[usernames[username]].emit(...);
我在文档中没有看到任何地方,所以我可以看到为什么这个问题没有得到回答。此外,如果您没有任何通过用户名引用,您可以尝试:
users[socket.id] = socket.id;
复制键和值以便于访问。
也可能有另一种方法,即使用io。
其他解决方案:使用套接字发送消息到特定的客户端。IO和node.js
你试过使用吗?
var socket = io.connect('http://localhost:80/');
我已经厌倦了最新版本的node和socket.io下面我将发布完整的代码
<ul id="messages"></ul>
<form action="">
<input id="id1" /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var io = io.connect();
$('form').submit(function(){
io.emit('drumevent', $('#id1').val());
$('#id1').val('');
return false;
});
io.on('drumevent', function(msg){
console.log(msg);
$('#messages').append($('<li></li>').text(msg.message+' quantity = '+msg.quantity));
});
</script>
服务器端代码
var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id;
socket.on('drumevent', function(msg){
var socketId = socket.id;io.to(socketId).emit('drumevent', data);