2012-10-27 3 views
1

이것은 아마도 node/jcp보다 소켓/tcp 동작에 관한 것입니다.소켓을 통해 일련의 JSON 문자열을 스트리밍

node.js에 소켓을 통해 문자열로 묶은 일련의 JSON 객체를받는 서버를 작성하고 있습니다 (HTTP가 아님).

클라이언트 (iOS 앱)는이 소켓을 통해 JSON 문자열을 스트리밍합니다. 각 JSON 문자열의 크기는 (몇 바이트에서 몇 K 바이트까지) 달라 지므로 타이밍이 달라집니다. 각 JSON 문자열은 단일 "쓰기"작업으로 전송됩니다.

소켓에서 데이터를 수신하면 JSON.parse()를 호출합니다.

간단한 테스트 케이스는 훌륭하게 작동하지만이 정도면 충분하지는 않습니다.

(1) 'data'에 여러 JSON 객체가 포함되어 있습니다. (2) 단일 JSON 객체가 여러 데이터로 전송됩니다.

+0

나는 같은 질문을 스스로에게 물었다. Message Pack과 같이 JSON 대신 바이너리 프로토콜을 사용하는 것을 고려 했습니까? – plang

답변

4

json 페이로드와 그렇지 않은 프로토콜을 개발해야합니다. 예를 들어 tcp/ip 소켓을 통해 시작 문자를 작성한 다음 json 페이로드, 끝 문자를 작성합니다. 이렇게하면 소켓에서 읽는 메시지가 언제 시작되고 끝나는 지 알 수 있습니다. 이제 여러 개의 json 페이로드를 처리하려는 특별한 경우에는 구분 문자가 필요합니다.

그래서 begin, end 및 separator 문자를 자유롭게 선택하십시오. 당신이 사용할 수있는 수많은 문자가 있습니다. 몇몇 선택을 위해 ascii/Hex 테이블을보십시오. 그러나 인쇄 할 수없는 문자를 사용하는 것이 가장 좋습니다. 그렇지 않으면 페이로드에 이러한 문자가 포함될 수있는 상황이 발생합니다.

경우에 따라 이스케이프 시퀀스에 대해 다른 문자 집합을 개발해야합니다. 즉, 시작, 끝 및 구분 기호를 정의한 후에는 해당 문자가 페이로드에서 불법이며 송신 측의 이스케이프 시퀀스로 대체해야합니다. 즉, 수신 측에서는 이스케이프 시퀀스를 올바른 문자로 다시 설정해야 페이로드를 초기 상태로 되돌릴 수 있습니다.

예를 들어 프로토콜을 다음과 같이 정의 할 수 있습니다.

[begin]  = 0x02  // Hex for Start of text 
[end]  = 0x04  // Hex for end of end of transmission 
[separator] = 0x03  // Hex for end of text 

or 

[begin]  = 0x0B  // Hex for Vertical Tab 
[end]  = 0x1C  // Hex for file separator 
[separator] = 0x1E  // Hex for record separator 

그런 다음 TCP/IP 소켓 (와이어)를 통해 오는 메시지는

[begin][json payload][separator][end].......[begin][json payload][seperator][json payload][separator][json payload][separator][end]....... 

그래서 당신이 작성해야 (여기서 ....... 메시지 사이의 시간)과 같을 것이다 코드가 시작될 때까지 와이어에서 읽을 코드. 그런 다음 구분 기호가 발견 될 때까지 페이로드를 저장하십시오. 그런 다음 구분 기호 다음에 오는 문자가 끝나지 않으면 다음 루프를 저장하고 다음 페이로드를 저장합니다.

나는 또한 MLLP (Minimum Lower Level Protocol)에 대한 Google 검색을 제안합니다.

+0

감사합니다, Joseph. 이것은 매우 도움이된다! 많은 사람들이이 문제를 이해하지 못하고 대부분의 경우 작동하지만 부분적으로는 처리 할 수없는 부분적 구현 (또는 깨진 프로토콜)을 생각해냅니다. XMPP (특수 문자없이 XML 페이로드 스트림을 보내는)조차도 파손됩니다. XMPP 파서는 각 XML 페이로드의 끝을 수신 할 때까지 try & error 구문 분석을 수행해야합니다. 각 페이로드가 크고 조각으로 나눠지면 비용이 많이 듭니다. –

+0

조셉 감사합니다. 이것을 구현하는 데 도움이되는 노드 패키지에 대해 알고 있습니까? 이것은 나에게 복잡한 일처럼 보입니다. 그리고 그것은 이미 여러 번 해결되었습니다. – plang

2

Here은 솔루션 및 코드와 함께이 문제에 대한 매우 완전한 설명입니다.

관련 문제