【问题标题】:Efficient Websocket Data Handling高效的 Websocket 数据处理
【发布时间】:2014-03-16 20:52:20
【问题描述】:

我正在使用 HTML5 创建一个在线游戏。我打算使用 JSON 字符串通过 Websockets 进行数据通信,因此典型的字符串将具有被调用的操作以及与之一起使用的数据:

{action: "chat", user: <cookie>, message: "Hello, Java!"}

服务器端,解析JSON字符串,然后通过Case语句,将数据发送到与指定动作匹配的方法:

switch (message.action) {
    case "chat":
        // send message
        break;
}

问题是,一旦我完成了大约 20 到 30 次操作,Case/Switch 语句在这方面似乎确实效率低下且混乱。有没有更有效的方法来通过 WebSockets 处理客户端-服务器通信?有人建议构建 TCP 数据包并发送这些数据包。我不知道如何在 JavaScript 中做到这一点。

【问题讨论】:

  • 什么是服务器端环境?
  • HashMap 以 action 为键,Runnable 实例为值?然后它是一次性初始化,从那一刻起只需一次查找。建议这让我的头发有点竖起来,但我脑海中浮现的另一件事是“反思”,我真的会作为最后的手段使用。
  • 它是一个 Play Framework Java 后端
  • 为什么不为不同的操作创建不同的端点或“方法”(我对 websocket 不太熟悉...)?
  • 那不就是我在帖子中提到的 Switch/Case 语句吗?

标签: java javascript json websocket packet


【解决方案1】:

我也会考虑坚持标准并使用网址...

index.js

var http = require('http');
var walve = require('walve');

var server = new http.Server(function(req, res) {
  // send your front end html
}).listen(3000);

require('./action1')(server);
require('./action2')(server);

action1.js

module.exports = function(server) {

    var action1 = new walve.Server({
      url: '/action1'
    });

    action1.on('connect', function(wsocket) {

      // handle wsocket stream

    });

    action1.listen(server);

};

action2.js

module.exports = function(server) {

    var action2 = new walve.Server({
      url: '/action1'
    });

    action2.on('connect', function(wsocket) {

      // handle wsocket stream

    });

    action2.listen(server);

};

如何使用 WebSocket 转发图像和一个转发消息来完成此操作的完整示例可见 here

这使您可以很好地分离单个操作以添加服务器端逻辑。但是,如果您只是将 Web 套接字数据转发给所有客户端,这可能没有意义。在这种情况下,只需在顶部构建一些事件处理程序:

var ws = new WebSocket('ws://localhost');

ws.addEventListener('message', function(e) {
  var message = JSON.stringify(e.data);

  emitter.emit(message.name, message.body);
});

【讨论】:

  • 我必须承认我对 Node.JS 不是很熟悉
  • 没问题 - 我们都从某个地方开始 :)
【解决方案2】:

这里有两种模式可以帮助您。

第一个Publisher/Subscriber pattern。这将允许您为特定事件定义订阅者。

第二个Strategy pattern。此模式将为您提供一种结构化消息处理程序的方法,而不会陷入大型 if-else 级联或大型 switch-case 语句。

您可以创建订阅特定事件子集的对象。在这些订阅者中,您可以创建处理每个特定事件的策略。

此解决方案具有可扩展性和可维护性,您可以为每个订阅者添加新订阅者和新策略,而无需进行大的修改。此外,可以对策略和订阅者进行单一测试。

例如,您可以拥有与游戏相关的游戏事件和聊天事件。在您的服务器端,您将创建一个发布者对象,该对象从 websocket 连接获取事件,然后您将创建一个处理聊天事件的订阅者,以及一个处理实际游戏事件的订阅者。在聊天订阅者内部,您将创建不同的策略来处理消息,例如“chat.start”、“chat.message”、“chat.close”等......您可以稍后添加新事件类型的策略,或订阅新功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2023-03-04
    • 2018-10-07
    • 1970-01-01
    • 2011-05-29
    • 2023-02-09
    • 2012-05-27
    相关资源
    最近更新 更多