2012-09-14 2 views
2

SockJS - 토네이도 라이브러리의 on_message() 방법에서, 나는 클라이언트에 JSON 메시지를 보낼 : 때때로 특정 클라이언트에 send() 방법을 사용하여, 때로는 클라이언트 그룹은 broadcast() 방법을 사용합니다. 내가 메시지를 보내기 전에 문자열 키가 사전 객체 자신을 인코딩하는 simplejson 같은 것을 사용해야하는지 여부를 궁금해JSON 메시지

, 즉

on_message(self, message): 
    ... 
    data = {'type': 1, 'body': 'blah'} 
    msg = json.dump(data) 
    # self.send(msg) or self.broadcast(conns, msg) 

또는 인코딩 부분은 이미 SockJS - 토네이도에 의해 처리된다? 또한, on_message() 메서드의 message 인수가 항상 JSON 객체이기도합니다.

답변

2

SockJS는 websocket 에뮬레이션 레이어입니다. 웹 소켓은 텍스트 및 이진 데이터를 제외하고는 아무 것도 지원하지 않습니다.

그래서 임의의 파이썬 객체를 유선으로 전송할 수 있지만 (sockjs-tornado는 내부 json 직렬화를 수행하고 문자열을 적용하지 않습니다), 호환성 문제로 인해이를 권장하지 않습니다.

예, 응용 프로그램 프로토콜로 json을 사용하면 이중 인코딩이 발생합니다. 그러나 브로드 캐스트 기능을 사용하려는 경우 - 최적화 된 broadcast() 메소드를 사용하면 json 인코딩을 모든 수신자에게 한 번만 수행합니다.

뿐만 아니라 메일 링리스트에서 관련 논의가 있었다 : https://groups.google.com/forum/?fromgroups#!topic/sockjs/vsFvHqppq5g

+0

그래서 SockJS-Torando가있는 경우에, 난 그냥 할 필요가 각 나가는 MSG에 대한 JSON 인코딩을 수행합니다'MSG = { '유형': 1 , 'body': blah}'그리고 나서'self.send (msg)'또는'self.broadcast (conns, msg)'중 하나이다. 왜 msg를 JSON으로 두 번 인코딩하려고합니까? – skyork

+1

이것은 "나쁜 습관"이기 때문에. 나중에 기본 웹 소켓으로 전환하려면 JSON 인코딩을 적용하기 전에 코드를 수정해야합니다. SockJS를 웹 소켓 대체품으로 생각하면 텍스트 이외의 것을 보낼 수 없습니다. 그렇습니다. 임의의 파이썬 객체를 전송할 수는 있지만, 다음 SockJS 버전에서는 코드가 중단 될 수 있습니다. 예상되는 동작이 아니기 때문입니다. – Joes

+0

그냥'broadcast()'메서드를 사용한다고해도, 호출하기 전에 msg를 스스로 인코딩해야합니다. – skyork