[Review] WebSocket 정보

13463 단어 websocket
안녕하세요, 이번에는 WebSocket에 대해 설명하고 싶습니다.
간략한 설명을 한 다음 아래의 멋진 분의 구현을 흉내내고, 클라이언트로부터 숫자를 string의 바이트로 송신해 주고, 그것을 서버로 받아 계산을 해 돌려주는 구조를 구현해 보았습니다.
전혀 뭔가 도움이되는 것은 아니지만, 자신의 지식을 일단 정리하고 싶기 때문에 여기에 씁니다.

애초에 WebSocket이란?



양방향 통신을 할 수 있는 프로토콜입니다.
WebSocket은 HTTP의 시너지 프로토콜로, 확립된 HTTP/HTTPS 회선에서 임의 길이 및 임의 형식 데이터의 양방향 통신을 실현합니다.

WebSocket의 등장 이전에는 아래와 같은 Long Polling이라는 시스템이나 Comet라는 개념에 따라 프로그램을 작성하거나 하면서 어떻게든 낭비를 내포하면서도 의사적인 양방향성을 유지하고 있었습니다.

이미지 참조 : htps //w w. 푹신 ckpy. 이 m / ぇ b 소 c ts. HTML

상기의 2개의 설명에 대해서는, 아래의 기사를 읽기 쉽다고 생각하므로, 그쪽을 참조해 주세요.
htps : // 이 m/오 tmb/있어 ms/138f12c8832f78b2534d
htps : // 코데지네. jp/아리치ぇ/에서 싶은 l/7075

그리고, 이번 기사의 메인이 되는 websocket에 대해서는, 아래와 같은 화상에 있는 것 같은 구조가 됩니다.

이미지 참조 : htps //w w. 푹신 ckpy. 이 m / ぇ b 소 c ts. HTML

다른 분의 블로그를 참조하고 있는 가운데 찬반양론 있구나라고 느꼈습니다.
긍정적인 의견은 많이 발견된다고 생각합니다만, 예를 들면, 이쪽은 이 기술을 기형이지만, 당연한 흐름으로 태어난 산물이라고 말하고 있습니다.
h tp // w w.ぇ x. jp / b ぉ g / ぃ ぇ ぇ s / 2016/10 / ぇ b 소 c t. HTML
또, 이쪽의 websocket의 사용예의 기술은 매우 이해하기 쉬웠습니다.
htps : // 이 m/그래 th37/있어 ms/6f92d4268후676347160

예를 들어 Facebook의 채팅 앱처럼 다수의 클라이언트가 한 페이지에 액세스하고 누군가가 메시지를 게시하면 그것을 다른 사용자에게 알리고 싶을 경우가 있어, 그럴 때 양방향 통신의 필요성이 나온다 .

장점



일단 확립한 HTTP/LTS의 통신 기반 위에서 지속적으로 커넥트를 하는 것이므로, 매번 헤더 등을 송신할 필요가 없습니다.또, Firewall나 다른 라우터등은 이 접속에 관해서는 HTTP로 의 접속의 연장선상으로 인식을 하므로, 패킷의 송신등에 있어서의 장해도 없어집니다. 즉, 매우 낭비가 없어집니다.

구현 in Python


# client.py

from websocket import create_connection
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(module)s -  %(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)

ws = create_connection("ws://127.0.0.1:12345")
logger.info("Open")
send = "11 23"
logger.info("Sending '{}'...".format(send))
ws.send(send)
logger.info("sent")
logger.info("Receiving...")
result = ws.recv()
logger.info("Received '{}".format(result))
ws.close()
logger.info("Close")
# server.py
import logging
from websocket_server import WebsocketServer

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(module)s -  %(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)

def new_client(client, server):
    logger.info('New Client {}:{} has joined'.format(client['address'][0], client['address'][1]))

def client_left(client, server):
    logger.info('New Client {}:{} has left'.format(client['address'][0], client['address'][1]))

def message_received(client, server, message):
    logger.info('Message "{}" has been received from {}:{}'.format(message, client['address'][0], client['address'][1]))
    result = message_processing(message)
    server.send_message(client, str(result))
    logger.info('Message "{}" has been received from {}:{}'.format(result, client['address'][0], client['address'][1]))

def message_processing(message):
    content = message.split(' ')
    return int(content[0]) + int(content[1])

if __name__ == '__main__':
    server = WebsocketServer(port=12345, host='127.0.0.1', loglevel=logging.INFO)
    server.set_fn_new_client(new_client)
    server.set_fn_client_left(client_left)
    server.set_fn_message_received(message_received)
    server.run_forever()

아직 실제 HTTP의 Header의 내용 등을 볼 수 없기 때문에 인식이 달콤한 부분은 많을까 생각합니다만, 배독해 주셨습니다, 감사합니다!

이 기사를 저도 더 공부하고 싶습니다!
htps : // msd 응. 미 c 로소 ft. 코 m / 쟈 jp / 마가지네 / j863133. 아 spx
h tps : // / t p ぇ 응 rs 이것. 기주 b. 이오 / RFC6455- 그럼. HTML

좋은 웹페이지 즐겨찾기