我需要客户端之间的节点客户端中的路由数据来更正连接的用户

I need the route data in a node client between client to correct connected user

我正在尝试构建一个 gnuchess 网络 api 并将其绑定到图形网络界面。 Trought 一个 websocket 用户将连接,当连接服务器 websocket 将启动一个 "gnuchess" 作为子进程。然后我想与 gnuchess 的 stdin/stdout 通信并将流发送给用户。但是由于代码是今天的代码,它只会启动新的 gnuchess,但我只能写信给其中一个(对于所有连接的客户端,我都可以这样做)

我有这个代码节点代码:

var http = require("http");
var ws = require("./");
var fs = require("fs");
var process = require('child_process');
theglobal = "";
var ls = "";
// Web server
http.createServer(function (req, res) {
        fs.createReadStream("index.html").pipe(res)
}).listen(8080);

// Socket stuff
var server = ws.createServer(function (connection) {
    connection.on("text", function (str) {
        var tmp_cmd = str.split(" ")[0];
        var tmp_string = str.substr(str.indexOf(" ") + 1);
        console.log(tmp_cmd)
        console.log(tmp_string)
        if (tmp_cmd == "move") {
            ls.stdin.write(tmp_string + "\n");

            connection.sendText(str);
        }
        if (str == "start") {
            connection.sendText(str);
            ls = process.spawn('/usr/games/gnuchess');
            ls.stdout.on('data', function (chunk) {
                broadcast(chunk)
    });
       }
    })


});

server.listen(8081);

// Functions

// This broadcasts to all clients connected
function broadcast(str) {
        server.connections.forEach(function (connection) {
                connection.sendText(str)
        })
}

HTML:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Chat example</title>
<script>
var connection
window.addEventListener("load", function () {
    var nickname = prompt("Choose a nickname")
    if (nickname) {
        connection = new WebSocket("ws://"+window.location.hostname+":8081")
        connection.onopen = function () {
            console.log("Connection opened")
            connection.send(nickname)
            document.getElementById("form").onsubmit = function (event) {
                var msg = document.getElementById("msg")
                if (msg.value)
                    connection.send(msg.value)
                msg.value = ""
                event.preventDefault()
            }   
        }
        connection.onclose = function () {
            console.log("Connection closed")
        }
        connection.onerror = function () {
            console.error("Connection error")
        }
        connection.onmessage = function (event) {
            var div = document.createElement("div")
            div.textContent = event.data
            document.body.appendChild(div)
        }
    }
})
</script>
</head>

<body>
<form id="form">
Message: <input size="50" id="msg"> <input type="submit" value="Submit">
</form>
</body>
</html>

但是发生的事情是它为每个连接的用户启动一个新的 gnuchess(应该是这样的)但是数据路由到第一个打开的 gnuchess。

可以通过使用 IRC 机器人和 IRC 服务器并为每个游戏使用不同的频道来解决问题(#gnuchess_user1、#gnuchess_user2 等。)但我认为实际上更容易通过为每个用户创建一个方法或自己的对象并将其路由到 websocket 来解决它。

你应该看看 socket.io,它内置了对房间的支持:

io.on('connection', function(socket){
  socket.join('some room');
});

这意味着您可以向连接到该房间的所有插座广播。您不必为这些生成单独的进程(这将对您的性能造成毁灭性的影响..)

io.to('some room').emit('some event');

http://socket.io