Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Wysyłanie zdarzeń na stronę z php przez node.js/socket.io

Witam,

Wymyśliłem sobie taką ideę działania aplikacji:
- php/apache (i inne komponenty jak mysql czy redis) zarządza podstawową logiką biznesową aplikacji,
- użytkownik dostaje stronę w przeglądarce,
- wszystkie zmiany na stronie obsługiwane są za pomocą websocketu,
- do obsługi websoketu służy serwer node.js/socket.io,
- zdarzenia, które są inicjowane przez usera, lub systemowe, przechodzą przez php a ich wynik jest przekazywany do websoketu i wysyłany na stronę,
- komunikacją z websoketem zajmuje się biblioteka Elephant.io (http://elephant.io/).

I jest problem. Ale nie w tym, że nie działa, a taki, że zdarzenia przychodzą do websoketu dobrze, a wysyłane są dwa razy.

Serwer node.js/socket.io:

var http = require('http');
var sio = require('socket.io');
var fs = require('fs');
var redis = require("./lib/redis-client").createClient();

// Start the server
var server = http.createServer(function(req, res){
res.writeHead(200,{ 'Content-Type': 'text/html' });
res.end('<h1>Hello Socket Lover!</h1>');
});

server.listen(8011);

// Create a Socket.IO instance, passing it our server
var io = sio.listen(server);

var characters = {};

io.sockets.on('connection', function(socket) {
console.log('connected');
socket.emit('auth');

socket.on('check in', function(data) {
console.log('received check in from ' + data.char_id + ' (' + socket.id +')');
characters[data.char_id] = socket.id;
console.log(characters);
});
socket.on('push_event', function(data) {
console.log('event pushed (' + socket.id + ')');
var char_id = data.char_id;
var socket_id = characters[char_id];
if (socket_id) {
console.log('sended to '+socket_id);
//send to socket
io.sockets.sockets[socket_id].emit('events', data);
} else {
console.log ('theres no registered user: '+char_id);
}
});

});


Klient WWW:

<script>
var socket = io.connect('http://192.168.1.7:8011');
var char_id = <?= $character['id']; ?>;
socket.on('connect', function(data) {
console.log('connected');
socket.on('auth', function(incoming) {
console.log('received auth request');
socket.emit('check in', {'char_id': char_id})
});
});
socket.on('events', function (data) {
console.log('got data');
console.log(data.text);
});

$(document).ready(function() {
console.log('started app');
$('#talk_all').submit(function(event) {
event.preventDefault();
var text = $('#event_input_small').val();
$.post('/events/talkall', {'text':text}, function(data) {
$('#event_input_small').val('');
});
});
});
</script>


I fragment php odpowiedzialny za wysyłanie zdarzeń:

$elephant = new Client('http://192.168.1.7:8011');
$elephant->init();

//tymczasowa lista odbiorców
$recipients = array(4);

foreach ($recipients as $recipient) {

$data = json_encode(array(
'name' => 'push_event',
'args' => array(
'char_id' => $recipient,
'text' => $_POST['text']
)
));

$elephant->send(Client::TYPE_EVENT, null, null, $data);

}


No i na okrasę log z serwera node.js:


root@ubuntu:/var/www/socket.io# node ./serverauth.js
info - socket.io started
debug - served static content /socket.io.js
debug - client authorized
info - handshake authorized prRw0cmwGEOzbNi-TAhl
debug - setting request GET /socket.io/1/websocket/prRw0cmwGEOzbNi-TAhl
debug - set heartbeat interval for client prRw0cmwGEOzbNi-TAhl
debug - client authorized for
debug - websocket writing 1::
connected
debug - websocket writing 5:::{"name":"auth"}
received check in from 4 (prRw0cmwGEOzbNi-TAhl)
{ '4': 'prRw0cmwGEOzbNi-TAhl' }
debug - client authorized
info - handshake authorized rG6v0VhUFJLMormcTAhm
debug - setting request GET /socket.io/1/websocket/rG6v0VhUFJLMormcTAhm
debug - set heartbeat interval for client rG6v0VhUFJLMormcTAhm
debug - client authorized for
debug - websocket writing 1::
connected
debug - websocket writing 5:::{"name":"auth"}
debug - websocket received data packet 1:::
debug - websocket writing 1::
connected
debug - websocket writing 5:::{"name":"auth"}
debug - websocket received data packet 5:::{"name":"push_event","args":{"char_id":4,"text":"123"}}
event pushed (rG6v0VhUFJLMormcTAhm)
sended to prRw0cmwGEOzbNi-TAhl
debug - websocket writing 5:::{"name":"events","args":[{"char_id":4,"text":"123"}]}
event pushed (rG6v0VhUFJLMormcTAhm)
sended to prRw0cmwGEOzbNi-TAhl
debug - websocket writing 5:::{"name":"events","args":[{"char_id":4,"text":"123"}]}
info - transport end (socket close)
debug - set close timeout for client rG6v0VhUFJLMormcTAhm
debug - cleared close timeout for client rG6v0VhUFJLMormcTAhm
debug - cleared heartbeat interval for client rG6v0VhUFJLMormcTAhm
debug - discarding transport


Wszelkie sugestie mile widziane.