code : https://github.com/EomTaeWook/CS-API.Core.WebSocket
작업 중인 소스 .Net Core에 익숙해지기 위해 Core로 작성
http://blogs.microsoft.co.il/applisec/2014/03/12/signalr-message-format/
현재 웹 소켓을 사용할 프로젝트가 있는데
SignalR C++이 카사블랑카(VS2013, VS2015)에서 구동 + SignalR(C++11에서 사용하는 문법(람다식 등))이 존재
현재 클라이언트 프로젝트가 VS2010 C++단에서 돌아가는 환경이라(좀 바꾸자...) SignalR 을 사용하지 못한다.
.Net 환경의 기본 API Websocket 으로 서버를 구성해야 해야 할 판이라 SignalR의 통신 구조가 너무 맘에 드는 관계로
SignalR 의 형태로 제작하려고 한다. (서버 -> 클라이언트 함수 호출, 클라이언트 -> 서버 함수 호출)
SignalR 의 흐름
(C->S)Negotiation -> (S->C)토큰 생성. Response
(C->S)Connect Transports를 선택(sse, longpooling... 자동 선택) -> (S->C) HearBeat 생성. -> Response
(C->S)Start->(S) 인증 및 Hub 확인.
이후 Send url을 달고이후 밑의 포맷대로 송수신 하는 것 같다. (웹 소켓 제외)
소스 분석은 흐름만 파악하고 이 형태로 개발하기 위함이므로 자세히 파보지는 않았음으로 틀렸을 수도 있다.
http://localhost:8080/signalr/send?clientProtocol=1.4&transport=serverSentEvents&connectionData=[%7B%22Name%22:%22Chat%22%7D]&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAoZNjIPEGw02gtEuCVyuU9wAAAAACAAAAAAAQZgAAAAEAACAAAAC48hm5UjuOAIFv3EV3wVKDOrARoODHn7%2FnszwnFA%2FqowAAAAAOgAAAAAIAACAAAAB8yo7vtBUCftMubFVHydoqqFMOihURRECXFJ45iRUOaTAAAAAUnG1QclrL4bpwPsAdt4EtdubVjHEdggFY1QtxTmZWBZ2N60yHlioXbTIMvymSaktAAAAALHWD0Zm0RQkRz07dnnTgLdYhmJVTY8SeylYY3G8NEo2X4Qx93dROFU88aHg%2BJslcKNAakDTtjnHmHkw57E9YIA%3D%3D
SSE Foramt
{"C":"d-E73E9074-B,7|C,0|D,1","M":[{"H":"Chat","M":"send","A":["test"]}]}
WebSocket Foramt
Value에 {"H":"Chat","M":"send","A":["test"]}가 들어감
{
"Source": "f11a643d-914a-4951-9c1f-ab7c1f6fb0ef",
"Key": "h-Chat",
"Value": [
123,
34,
72,
34,
58,
34,
67,
104,
97,
116,
34,
44,
34,
77,
34,
58,
34,
115,
101,
110,
100,
34,
44,
34,
65,
34,
58,
91,
34,
116,
101,
115,
116,
34,
93,
125
],
"CommandId": null,
"WaitForAck": false,
"IsAck": false,
"Filter": "",
"Encoding": {
"BodyName": "utf-8",
"EncodingName": "Unicode (UTF-8)",
"HeaderName": "utf-8",
"WebName": "utf-8",
"WindowsCodePage": 1200,
"IsBrowserDisplay": true,
"IsBrowserSave": true,
"IsMailNewsDisplay": true,
"IsMailNewsSave": true,
"IsSingleByte": false,
"EncoderFallback": {
"DefaultString": "�",
"MaxCharCount": 1
},
"DecoderFallback": {
"DefaultString": "�",
"MaxCharCount": 1
},
"IsReadOnly": true,
"CodePage": 65001
},
"MappingId": 0,
"StreamIndex": 0,
"IsCommand": false
}
Hub Message Format
Hub Request format ("send" request)
Data={"I":index,"H":"samplingstreaminghub","M":"ConnectToStream","A":["StreamUri"]}
Hubs messages format (server to client)
– {"C":"messageId value", "M":[{"H":"HubName","M":"HandlerName","A": ["argument list as json"]}]}
– {"C":"messageId value", "G": ["groupName"],"g": ["groupName"],"T":1,
"M":[{"H":"HubName","M":"HandlerName","A": ["argument list as json"]}]}
Hub Payloads format ("send" request or inside "M" element of Hub message)
- {"H":"HubName","M":"HandlerName","A": [argument list as json], "S":{state as json},"I":index}
- {"H":"HubName","M":"HandlerName","A": [argument list as json],"I":index}
Hub Response examples ("send" response)
- {"I":"0","R":{"return object as json}}
- {"I": 0} -> no result
- {"I": 0, "S":{"x":1},"R":1} –> result
- {"I": 0, "E":"This is an error"} –> error
- {"I": 0, "E":"This is an error", "T": "Some stack trace here"} -> error + stack
The following is a complete list of the messages elements:
Hub Messages:
C – Cursor
M – Messages
T – Timeout (only if true) value is 1
D – Disconnect (only if true) value is 1
R – All Groups (Client groups should be reset to match this list exactly)
G – Groups added
g – Groups removed
Hub payload:
I – Callback Operation index
H – Hub name
M – method name
A – arguments
S – state (if not null)
Hub Method return value:
I – Operation index
R – Result
S – State
E – Error
T – stack trace
D – Error Data
'개발관련 > C#' 카테고리의 다른 글
C++/CLI를 통한 C++ 클래스 마샬링 (0) | 2018.08.11 |
---|---|
sql compact 4.0 설정 (2) | 2018.07.30 |
네트워크 공유 폴더 접근 (0) | 2018.05.09 |
Winform Control 안쪽 여백 제거 (0) | 2018.04.08 |
쿼드 트리 (0) | 2018.03.28 |