Socket.io房间不工作/没有意义

Socket.io rooms not working/making sense

本文关键字:有意义 工作 io 房间 Socket      更新时间:2023-09-26

我正在努力确保每个人都能使用socket.io v1.2.0(和nodejs0.12)看到不同的消息。

我的工作基于这个似乎不起作用的答案(可能是由于版本差异)?https://stackoverflow.com/a/19150254/1582712

// client side
var socket = io();
var room = new Date().getTime().toString() + "-" + Math.random().toString();
socket.emit('create', room);
// server side
io.sockets.on('connection', function(socket){
    socket.on('create', function(room) {
        socket.join(room);
    });
});

当然,还有更多的代码,但也许无关紧要。我将在下面包含完整的代码。无论如何,在这一点上,我的期望是客户端代码会(不知何故)知道它属于房间room和/或服务器知道向给定的room发出正确的文本。不管怎样,它都不起作用!


// Server
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var id = "0";
var javaSessions = {_counter: -1};
app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
    var javaSessionId = javaSessions._counter++;
    res.cookie('java_session_id', javaSessionId);
    var msnId = req.query.msnId;
    var spawn = require('child_process').spawn;
    var java = spawn("java.exe", 
        ['-cp', 'lib''*;bin', 'com.app.App', ]);
    javaSessions[javaSessionId] = java;
    var outBuffer = "", errBuffer = "";
    java.stdout.on('data', function(data) {
        outBuffer += data.toString();
        var lines = outBuffer.split("'n");
            for (var i = 0; i < lines.length - 1; i++) {
                var line = lines[i];
                console.log(line);
                io.to(id).emit('stdout', line);
            }
            outBuffer = lines[lines.length - 1];
    });
    java.stderr.on('data', function(data) {
        errBuffer += data.toString();
        var lines = errBuffer.split("'n");
            for (var i = 0; i < lines.length - 1; i++) {
                var line = lines[i];
                console.log("err> " + line);
                io.to(id).emit('stderr', id + " -- " + line);
            }
            errBuffer = lines[lines.length - 1];
    });
    java.stdout.on('end', function() {
        console.log(outBuffer.id);
        io.emit('stdout', outBuffer);
    });
    java.stderr.on('end', function() {
        console.log(errBuffer.id);
        io.emit('stderr', errBuffer);
    });
});
app.get('/unload/:id', function(req, res) {
    var java = javaSessions[req.params.id];
    javaSessions[req.params.id] = null;
    java.kill();
});
io.sockets.on('connection', function(socket){
    socket.on('create', function(room) {
        socket.join(room);
    });
    socket.on('stdout', function(msg){
        io.emit('stdout', msg);
    });
    socket.on('stderr', function(msg){
        io.emit('stderr', msg);
    });
});
http.listen(3000, function(){
    console.log('listening on *:3000');
});

// Client 
var socket = io();
var room = new Date().getTime().toString() + "-" + Math.random().toString();
socket.emit('create', room);
$('form').submit(function(){
    socket.emit('stderr', $('#m').val());
    $('#m').val('');
    return false;
});
socket.on('stdout', function(data) {
    $('#messages').append($('<li class = "stdout">').text(data));
});
socket.on('stderr', function(data) {
    $('#messages').append($('<li class = "stderr">').text(data))
});

无论如何,如果只需要向1个客户端发送数据,您可能需要使用另一种方法。

做类似的事情

io.emit('stdout', msg);

将消息广播给所有连接的人。如果你只需要发送给一个客户,那么你应该做一些类似的事情

socket.emit('stdout', msg);

因此,您不必以这种摇摆不定的方式为每个客户创建一个新房间。