2014-02-17 7 views
0

HTML5를 사용하여 온라인 게임을 만들고 있습니다. 나는 그것과 함께 갈 너무 전형적인 캐릭터가 호출 된 조치를해야합니다, JSON 문자열을 사용 WebSocket을 데이터를 통해 데이터를 전달하는 거라고 :효율적인 웹 소켓 데이터 처리

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

서버 측의 JSON 문자열을 구문 분석 할 것, 다음 지정된 동작을 일치하는 방법으로 데이터를 보낼 것이다, 사례 문을 통해 이동 :

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

것은 내가 다 했어 일단 20 ~ 30 조치가있을 것입니다 및 케이스/Switch 문은이 점에서 정말 비효율적이며 지저분 해 보입니다. 웹 소켓을 통해 클라이언트 - 서버 통신을 처리하는보다 효율적인 방법이 있습니까? 누군가는 TCP 패킷을 생성하고 전송하는 것을 제안했습니다. 나는 자바 스크립트에서 그렇게하는 방법을 모른다.

+0

서버 측 환경이란 무엇입니까? – RaviH

+0

키로서의 액션과 값으로서의 Runnable 인스턴스를 가지는 HashMap? 그때 그것의 한 번 init과 그 순간부터 단지 하나의 조회에. 내 머리카락을 조금이라도 세우는 것을 제안하지만 내 머리 속으로 튀어 나오는 또 다른 것은 '반성'이고 나는 최후의 수단으로 사용할 것입니다. – Gimby

+0

그것의 플레이 프레임 워크 자바 백엔 –

답변

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

module.exports = function(server) { 

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

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

     // handle wsocket stream 

    }); 

    action1.listen(server); 

}; 

조치 2를 action1.js .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입니다.

이렇게하면 단일 동작을 잘 분리하여 서버 측 로직을 추가 할 수 있습니다. 그러나 모든 클라이언트에 웹 소켓 데이터 만 전달하는 경우에는이 방법이 적합하지 않을 수 있습니다.이 경우 위에 이벤트 처리기를 구축했습니다.

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

관련 문제