在多个客户端javascript文件之间传递套接字

Passing socket between multiple client side javascript files

本文关键字:之间 套接字 文件 javascript 客户端      更新时间:2023-09-26

我最近开始用javascript编写一个小型网络游戏。最近,我开始重构代码,使用node.js和socket.io来制作多人游戏。

我的问题是,我想将客户端套接字变量传递给多个客户端javascript文件,但我找不到解决方案。

在客户端/app.js:中

var app = (function() { 
    ...
    var socket = io.connect('http://localhost:8080');
    socket.on('connect', function() {
        dice.setSocket(socket);
    });
    ...
})();

在client/dice.js:中

var dice = (function() {
    ...
    var gameSocket;
    if (gameSocket) {
        gameSocket.on('dice rolling', function(data) {
            playDiceAnim(data);
        });
    }
    function setSocket(socket) {
        gameSocket = socket;
    }
})();

不幸的是,当"掷骰子"事件从服务器端发出时,playDiceAnim(数据)永远不会执行。但是,我知道app.js正在接收"掷骰子"事件。例如,如果在app.js中我输入:

var app = (function() { 
    ...
    var socket = io.connect('http://localhost:8080');
    socket.on('dice rolling', function() {
        console.log('event received');
    });
    ...
})();

然后,开发人员工具控制台中的结果是:

'event received'

我可以在网上找到的例子要么将所有客户端javascript放在.html文件中的脚本标记中,要么放在一个.js文件中。但是,我希望更模块化。

如何将客户端套接字适当地传递和使用到其他客户端文件?

这是完整的代码。小心bug,它正在重构过程中。此外,如果有任何建议,我将不胜感激,因为我对javascript和node.js还相当陌生。

以下是我的建议:

首先加载应用程序脚本,并通过以下方法使套接字对其他调用方可用:

var app = (function() { 
    ...
    var socket = io.connect('http://localhost:8080');
    return {
        getSocket: function() { return socket;}
    }
    ...
})();
var dice = (function() {
    ...
    var gameSocket = app.getSocket();
    if (gameSocket) {
        gameSocket.on('dice rolling', function(data) {
            playDiceAnim(data);
        });
    }
})();

在这种情况下,我认为app作为服务提供商(如连接的webSocket)以及其他模块从应用程序请求该信息更有意义。但是,这实际上取决于您希望哪个模块更通用,而不是依赖于其他模块。任何一种情况都可能发生。