Клиент socket.io не получает сообщения с сервера
Я пытаюсь внедрить систему с двумя клиентами, одна из которых отправляет сообщение, а другая получает ее.
На следующем рисунке объясняется это более визуально:
![socket.io message communication chart]()
Итак, клиент 1 отправляет сообщение на сервер (и это работает), сервер получает сообщение "push" и выдает сообщение "pop", которое должно быть выбрано клиентом 2.
Проблема здесь в том, что Клиент 2 никогда не получает сообщение "поп".: (
Здесь код для всех.
SERVER.JS
var app = require('express').createServer()
, io = require('socket.io').listen(app);
app.listen(999);
app.get('/webclient', function (req, res) {
res.sendfile(__dirname + '/web.html');
});
app.get('/mobile', function (req, res) {
res.sendfile(__dirname + '/mobile.html');
});
io.sockets.on('connection', function (socket) {
// socket.emit('pop', { hello: 'world' });
socket.on('push', function (data) {
console.log('push received, emitting a pop');
socket.emit('pop', { hello: 'world' });
});
});
КЛИЕНТ 1 (aka mobile.html)
<html>
<head>
<title>
Mobile
</title>
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script>
<script>
var socket = io.connect('http://localhost:999');
</script>
</head>
<body>
<input type="button" name="act" id="push" value="message" />
<script type="text/javascript" charset="utf-8">
window.addEvent('domready', function() {
$('push').addEvent('click', function() {
socket.emit('push', { hello: 'world' });
});
});
</script>
</body>
</html>
КЛИЕНТ 2 (aka web.html)
<script src = "/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:999');
socket.on('pop', function (data) {
console.log(data);
});
</script>
Я просто не могу понять, почему клиент 2 не получает сообщение "поп",
Я совершенно новичок в socket.io и node.js в целом, поэтому некоторые механики для меня все еще немного неясны, поэтому я заранее извиняюсь за свое отсутствие.:)
веселит
-k-
Ответы
Ответ 1
Функция, переданная в .on
, вызывается для каждого сокета для инициализации (события привязки и т.д.), а socket
- этот текущий сокет. Это будет клиент 1, когда вы получите сообщение push
, потому что функция обработчика привязана к событию push
этого socket
- вы связали эту функцию при подключении клиента 1 (где socket
относится к клиенту 1).
io.sockets
относится ко всем сокетам, подключенным, поэтому включая клиента 2 в вашем случае.
Ответ 2
Другим аспектом, который вы могли бы принять во внимание, является использование:
socket.broadcast.emit('push', { hello: 'world' });
Это по существу отправит сообщение всем подключенным клиентам, кроме тех, которые возникли в сообщении. Удаление задачи фильтрации клиентов/сокращение ненужного трафика к исходному сокету.
Socket.IO на GitHub - Под трансляцией.