【问题标题】:Using Socket.IO in an OOP environment?在 OOP 环境中使用 Socket.IO?
【发布时间】:2015-10-15 18:25:48
【问题描述】:

我四处寻找与我有类似问题的人,但找不到任何东西。基本上,我正在使用 NodeJS、Socket.IO、Express 和 Jade 创建一个实时多人游戏。

到目前为止一切都很好,但它看起来是一个相对较大的游戏,所以我决定使用 OOP 概念,但我不知道如何将它与 Socket.IO 联系起来.

比如说我有我的主服务器文件,我们称之为 server.js:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 4040;

server.listen(port, function() {
    console.log('Server listening on port %d', port);
});

app.set('views', __dirname + '/client');
app.set('view engine', 'jade');
app.engine('jade', require('jade').__express);
//Have a custom routing setup, works fine.
app.get('/', routes.index);

//The /client refers to where the views and css and everything is located
app.use(express.static(__dirname + '/client'));

io.on('connection', function (socket) {
    socket.on ...
}

现在一切正常,但假设我引入了一个播放器类,我们将调用 player.js:

var name = '';

function player (name) {
    this.name = name;
};

player.prototype.getName = function () {
    return this.name;
};

module.exports = player;

然后像这样将它导入到 server.js 类中:

var player = require('./player.js');

这里一切正常。我可以创建新的播放器对象并调用它们的函数。

我遇到的困难是在主 server.js 文件之外使用 Socket.IO。

据我所知,我的所有 socket.on 或 socket.emit 调用都需要在 io.on('connection') 中,因为这是创建套接字的地方。

我看到的唯一接近于此的是使用 socket.io 命名空间,这似乎并不能真正解决我的问题,因为事情仍然必须在它们自己的 io.on('connection') 中。

我也见过 socketio-emitter,但我当然需要监听 socket.on 调用,而不仅仅是发出东西。

似乎应该有一种方法可以在更全局的范围内使用它。

【问题讨论】:

  • 玩家“拥有”一个套接字通常是没有意义的,更不用说一个被监听的了。 (FTP使用connection-per,看看它是如何结束的......)相反,监听套接字应该处理并将消息发送到感兴趣的处理程序。
  • 我不确定这是否是你要找的,但我认为你只需要在全局连接处理程序中构建一些类似控制器的逻辑来处理如何处理套接字,取决于它包含什么数据。就像服务器根据其 URI 决定如何处理正常的 http 请求一样。什么意思?
  • JavaScript 不是真正的 OOP。你只能使用诸如 TypeScript 之类的东西,它在顶部添加了真正的 OOP 并编译为 JS。这不像 C# 或 Java 那样真正的 OOP,但非常接近。而且您可以从使用单一语言中受益,这可能会导致例如在服务器和客户端之间共享模型/DTO。

标签: javascript node.js express socket.io


【解决方案1】:

所以我可以看到,看起来您需要将套接字从连接侦听器中取出并放入播放器对象中。

您如何做到这一点取决于您的架构,当套接字连接时播放器对象是否已经存在?如果是这样,您需要跟踪套接字为“for”的玩家(可能通过按照Send custom data along with handshakeData in socket.io? 将 playerid 或其他内容附加到套接字请求查询字符串,然后在您的玩家列表中搜索该玩家)并给出玩家对象是套接字,所以它可以与它的前端玩家对象通信。

如果玩家对象还不存在,那就更容易了,因为你可以在那里构造它并传递它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2017-08-02
    • 2018-10-28
    相关资源
    最近更新 更多