Skip to content

bluetsys/websocket-sample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WebSocket 가상 주식 실시간 업데이트 샘플

이 저장소는 외부 라이브러리 없이 자체 구현한 Web Server + WebSocket Server를 사용해 가상 주식 시세를 1초 단위로 전송하는 예제 프로젝트입니다. 같은 기능을 Python, Node.js, 그리고 .NET(C#)으로 각각 구현해 비교 학습할 수 있도록 구성되어 있습니다.

Github_Logo

주요 특징

  • 외부 라이브러리(패키지) 미사용 — 표준 라이브러리만 사용하여 WebSocket 핸드셰이크/프레임을 직접 구현
  • 정적 파일(static/) 서빙 기능 포함 (웹 브라우저에서 실시간 시각화 가능한 간단한 UI 제공)
  • datas/stocks.json의 초기 데이터를 읽어 1초마다 난수 기반으로 시뮬레이션된 가격을 갱신
  • 각 언어 구현은 동일한 JSON 메시지 포맷으로 업데이트를 전송

구현 언어 & 기본 정보

  • .NET (C#)

    • 프로젝트: dotnet/ (dotnet/Program.cs)
    • 개발 실행 포트(사용자 변경): http://localhost:5000
    • WebSocket 엔드포인트: ws://localhost:5000/
    • 정적 파일 루트: static/ (프로젝트에서 상대 경로로 설정되어 있음)
  • Python

    • 파일: python/main.py
    • 포트: 5020
    • WebSocket 엔드포인트: ws://localhost:5020/
    • 정적 파일: static/ (서버 루트에서 제공)
  • Node.js

    • 파일: node/main.js
    • 포트: 5010
    • WebSocket 엔드포인트: ws://localhost:5010/
    • 정적 파일: static/

메시지 포맷 (WebSocket으로 전송되는 JSON)

서버는 1초마다 아래와 같은 JSON 객체를 텍스트 프레임으로 전송합니다.

예시:

{
	"index": 101.23,
	"stocks": [
		{
			"name": "삼송전자",
			"code": "005930",
			"price": 70200,
			"change": 200,
			"change_rate": 0.29,
			"high": 70500,
			"low": 70000
		},
		...
	]
}
  • 필드 설명
    • index: 초기 시가총액 기반으로 계산한 가상 지수 (소수 2자리)
    • stocks: 주식 배열
      • name: 종목명
      • code: 종목 코드
      • price: 현재가 (정수)
      • change: 직전 대비 변동값
      • change_rate: 변동률 (백분율, 소수 2자리)
      • high: 당일 최고가
      • low: 당일 최저가

실행 방법

다음 예시는 Windows PowerShell(또는 적절한 쉘)에서의 실행 방법입니다.

  • .NET(C#) 서버
cd dotnet
# 실행 전에 stocks.json이 필요합니다. 저장소의 datas/stocks.json을 복사해 넣습니다.
copy ..\datas\stocks.json .\stocks.json

# dotnet 9 SDK 이상이 설치되어 있어야 합니다
dotnet run

서버가 시작되면 http://localhost:5000/ 에서 정적 페이지를 확인할 수 있고, WebSocket 엔드포인트는 ws://localhost:5000/ 입니다.

  • Python 서버
# python 폴더로 이동
cd python
# 필요: Python 3
python main.py

서버가 시작되면 http://localhost:5020/ 에서 정적 페이지를 확인할 수 있고, WebSocket 엔드포인트는 ws://localhost:5020/ 입니다.

  • Node.js 서버
cd node
# Node.js가 설치되어 있어야 합니다 (버전 권장: 최신 LTS)
node main.js

서버가 시작되면 http://localhost:5010/ 및 ws://localhost:5010/ 로 접근할 수 있습니다.


파일 위치 요약

  • datas/stocks.json - 초기 주식 데이터 (예제 데이터)
  • static/ - 브라우저 UI(정적 파일)
  • python/main.py - Python 구현 (표준 라이브러리만 사용)
  • node/main.js - Node.js 구현 (내장 모듈만 사용)
  • dotnet/Program.cs - .NET(C#) 구현 (minimal APIs + WebSockets)

구현 상세 및 주의사항

  • 각 구현은 WebSocket 핸드셰이크(Upgrade, Sec-WebSocket-Accept) 및 텍스트 프레임 형식(간단한 FIN + payload length + payload)을 직접 생성/전송합니다. 따라서 실제 상용 수준의 WebSocket 라이브러리(프레그먼트 처리, 마스킹 처리, 프로토콜 예외 등)를 완벽히 대체하지는 않습니다. 교육/샘플 목적에 맞춰 최소한의 기능만 구현했습니다.

  • 브라우저 클라이언트는 표준 WebSocket API를 사용해 메시지를 수신하면 됩니다. 예) new WebSocket('ws://localhost:5020/')


Server-Sent Events(SSE) 버전 참고

Server-Sent Events(SSE) 버전이 궁금하다면 @bluetsys/serversentevents-sample 저장소를 참고하세요.


WebSocket vs Server-Sent Events 비교

구분 WebSocket Server-Sent Events (SSE)
전송 방향 양방향(Full Duplex) 단방향(서버 → 클라이언트)
프로토콜 ws://, wss:// (WebSocket 프로토콜) http://, https:// (HTTP/1.1 기반)
브라우저 지원 모든 최신 브라우저 지원 대부분 브라우저 지원
(IE, Edge 구버전 미지원)
연결 개수 제한 없음(일반적으로 1:1) 브라우저당 최대 6~10개(HTTP 커넥션 제한 영향)
데이터 포맷 텍스트/바이너리(자유롭게 전송 가능) 텍스트(UTF-8, SSE 포맷 한정)
실시간성 매우 우수(지연 거의 없음) 우수(HTTP 스트림 기반, 지연 적음)
지속성 연결 유지 필요(Keep-Alive) 연결 유지 필요(Keep-Alive)
자동 재연결 직접 구현 필요 브라우저가 자동 지원
방화벽/프록시 일부 환경에서 차단될 수 있음 기존 HTTP 인프라와 완벽 호환
로드밸런싱 별도 설정 필요(세션스티키 등) HTTP 기반이므로 기존 LB와 호환성 우수
보안(SSL) 별도 ws/wss 프로토콜 사용 기존 https 사용(구성 간단)
서버 구현 난이도 복잡(핸드셰이크, 버퍼, 프레임 등 직접 처리) 단순(HTTP 응답 스트림만 유지하면 됨)
모바일 친화성 배터리, 네트워크 환경에 민감(재접속 필요 시 불편) HTTP/2 미지원 환경에서는 커넥션 제한 영향
대용량/대규모 알맞은 선택(게임, 채팅 등) 브로드캐스트/알림 등에 적합
바이너리 지원 지원 미지원
브라우저 API WebSocket EventSource
HTTP/2 지원 제한적(웹소켓은 HTTP/2 업그레이드 불가) HTTP/2 지원(커넥션 공유 가능)

총평

  • WebSocket: 양방향, 실시간, 게임/채팅/양방향 제어 등 복잡한 실시간 통신에 적합
  • SSE: 서버 → 클라이언트 알림, 실시간 모니터링, 단방향 이벤트 등에 적합, 구현이 쉽고 HTTP 인프라 활용에 강점

개선/확장 아이디어

  • WebSocket 메시지 압축 및 프래그먼트 처리 지원 추가
  • 인증/권한(토큰 기반) 추가
  • 더 현실적인 시뮬레이션 (거래량, 호가, 주문서 등) 추가
  • 단일 코드베이스에서 언어별 차이점 정리한 문서 추가

📄 라이선스

이 프로젝트는 오픈소스이며, 교육 및 연구 목적으로 자유롭게 사용할 수 있습니다. 단 쿠팡 빼고 매출 규모 10조원 이상 기업에서 이용시 10억원의 이용료를 받을 수 있습니다.

About

websocket-sample

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors