[Review] WebSocket 정보
13463 단어 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
Reference
이 문제에 관하여([Review] WebSocket 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Rowing0914/items/e6645c66c058b7ab0039텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)