tech

웹소켓(WebSocket)과 Websocket-sharp.dll 오류

downfa11 2024. 11. 17. 16:33

웹소켓 등장 이전의 기술

Polling : 새로운 메시지가 있는지 계속 서버에게 물어보기

  • 미친 요청 수(request)와 Latency

Long Polling:메시지가 있거나, TimeOut할때까지 request 잠깐 기다렸다가 response

  • Polling보다는 request 요청이 적지만 그래도 많음

Streaming :이벤트가 발생했을 때 응답을 내려주되, 응답을 완료시키지 않고 계속 연결을 유지하는 방식

  • 연결 시간이 길어질수록 연결 유효성 관리의 부담
  • Request, Response 헤더가 불필요하게 크다.

 

웹소켓(WebSocket)

웹소켓(WebSocket) : 두 프로그램 간의 메시지를 교환하기 위한 통신 방법

웹소켓과 HTTP 통신의 비교 : 수립된 연결을 어떻게 하느냐?

연결성 ↔ 비연결성

 

 

HTTP와 다르게, 한번 연결이 수립되고 나면 간단한 메시지밖에 오가지 않는다 (= 통신에 드는 비용 감소)

 

 

웹소켓의 특징

1. 양방향 통신(Full-Duplex)

    • 서로에게 원할때 데이터를 주고 받을 수 있다.
    • 통상적 http 통신은 Client가 요청을 보내는 경우에만 Server가 응답할 수 있는 단방향 통신

2. 실시간 네트워크(Real-time Network)

    • 연속된 데이터를 빠르게 노출 ex) 채팅, 주식, 비디오 데이터

 

HTML5 이후로 나와서, 그 이전의 기술로 구현된 서비스에서는 사용안됨

→ 웹소켓을 지원하지 않는 브라우저에선 Socket.io, SockJS 로 웹소켓'처럼' 보여지게 기능을 콜백

 
 
 
 

 

STOMP(Simple Text Oriented Messaging Protocal)

STOMP는 TCP나 WebSocket같은 양방향 네트워크 프로토콜 기반으로 동작

 

파이썬에서 SocketIO, flask_socketio를 이용해서 간단한 채팅 애플리케이션을 구현해봤다.

 

브라우저에서 테스트 확인 잘됨

WebSocket-sharp.dll 오류

그리고 팔자에도 없던 웹소켓을 공부한 가장 큰 이유는 진행중인 게임 프로젝트.

로비를 웹서버로 돌려서 게임서버와 분리하니까 생긴 문제....

서버에서 매치메이킹 연산이 끝나고 사용자들에게 알려줄 방법이 없다,,

그래서 고안해낸게 초기 방식의 Polling 통신 >> 너무 구려서 웹소켓을 접목하고자 가볍게 Flask로 먼저 만들어본거임

C# 환경인 Unity3d 엔진 구조상 지원하는 라이브러리중에 가장 간편한게 websocket-sharp.dll

 

https://github.com/sta/websocket-sharp

 

GitHub - sta/websocket-sharp: A C# implementation of the WebSocket protocol client and server

A C# implementation of the WebSocket protocol client and server - sta/websocket-sharp

github.com

 

자료 찾아보면 유니티에서 웹소켓 클라이언트로 쓴 사람들이 분명 있는데, 난 안되더라..

웹서버의 socket.io 의 버전을 못따라와서 생기는 문제인줄 알고 다운그레이드도 몇번 시도해봤지만..

http GET 요청으로 진행하는 초기의 Hand-Shaking 과정에서 400 Bad Request를 뱉어버림. 같은 서버로 브라우저에서 여는건 잘되는데요?

 

좀 뜯어보니 Handshaking 에서 'Host: localhost:5000' 이 가야하는데 'Host:localhost' 만 가는데 내잘못은 아닌듯함

결국 포기하고 매치메이킹만 게임서버에 접속해서 시도하도록 고치는 방향으로 진행했고, 기술적인 부분은 완성 단계에 옴.

나중에 나도 쓰게 websocket-sharp - 400 bad request 문제 해결하신 분 저도 알려주세요ㅠ