2014-02-17 48 views
0

我使用HTML5創建在線遊戲。我本來打算在使用JSON字符串,所以一個典型的字符串將被調用的動作和WebSockets的數據的數據通信,與它一起去:高效的Websocket數據處理

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

服務器端,JSON字符串會被解析,再經過一個Case語句,這將數據發送到匹配指定的操作方法:

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

的事情是,將有大約20-30行動一旦我做,和案例/ Switch語句在這方面看起來真的很低效和混亂。有沒有更有效的方式來處理通過WebSockets的客戶端 - 服務器通信?有人建議構建TCP數據包,併發送這些數據包。我不知道如何在JavaScript中做到這一點。

+0

什麼是服務器端環境? – RaviH

+0

HashMap的動作是作爲鍵和一個Runnable實例作爲值?然後,它是一次性初始化,從那一刻起,只進行一次查找。暗示這會讓我的頭髮稍微站立一些,但是我腦海中浮現的另一件事是'反思',而且我真的會用作最後的手段。 – Gimby

+0

它是一個播放框架Java後端 –

回答

1

有兩種模式可以幫助你。

第一個Publisher/Subscriber pattern。這將允許您爲特定事件定義訂閱者。

一,是Strategy pattern。這種模式將爲您提供一種構造消息處理程序的方式,而不會陷入大型if-else級聯或大型switch-case語句中。

您可以創建訂閱特定事件子集的對象。在這些訂閱者中,您可以創建處理每個特定事件的策略。

該解決方案具有可擴展性和可維護性,您可以在不進行大的修改的情況下向每位訂戶添加新訂戶和新策略。此外,策略和訂戶可以進行單一測試。

例如,您可以擁有與遊戲玩法和聊天事件相關的遊戲事件。在你的服務器端,你將創建一個發佈者對象,它從websocket連接中獲取事件,然後創建一個用戶來處理聊天事件,以及一個處理實際遊戲事件的訂閱者。在聊天用戶的內部,您可以創建不同的策略來處理諸如「chat.start」,「chat.message」,「chat.close」等消息......您可以稍後添加新策略來添加新的事件類型,或輕鬆訂購新功能的用戶。

1

我也想只是堅持標準,並使用URL ...

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); 

}; 

1動作.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); 
}); 
+0

我必須承認我不是很熟悉Node.JS –

+0

沒問題 - 我們都開始在某個地方:) – bodokaiser