Client WebSocket Example without ASP.NET


ASP.NET을 사용하지 않고 일반적인 C# (Console, Winform) 에서 WebSocket Server에 접속하는 코드 예제 입니다.

결론만 말씀드리자면… WebSocketSharp 만 사용하세요.

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

그래도 나머지의 사용법도 설명해 드리겠습니다.

1. WebSocketSharp

Nuget Manager에서 WebSocketSharpinclude prerelease를 체크한 상태에서 검색해서 설치하세요.

using WebSocketSharp;

WebSocket ws = new WebSocket(url: "ws://localhost:5000");

ws.Connect();

ws.Send(new byte[] { 0x01, 0x02, 0x03 });

ws.OnMessage += (sender, e) =>
{
    Console.WriteLine(e.Data); // string
    byte[] data = e.RawData // byte []
};

2. WebSocketSharp-clone 사용

nuget manager에서 websocket-sharp.clone 로 검색하면 나옵니다.

WebSocketSharp에 비해 사용하기 조금 더 까다롭습니다. 하지만, 비동기(async)처리를 지원해 줍니다.

OnMessage 이벤트를 생성자에게 입력해줘야 하는데, 타입이 까다로워서 쉽지 않습니다. (저도 구현해보려고 시도하다가 귀찮아서 관뒀습니다.)

using WebSocketSharp;

WebSocket ws = new WebSocket(url: "ws://localhost:5000");

await ws.Connect();

Console.WriteLine(ws.ReadyState); // Open

bool result = await ws.Send(new byte[] { 0x03, 0x01, 0x10, 0xFF });

Console.WriteLine(result.ToString()); // true

3. System.Net.WebSockets 사용

별도의 nuget 설치 필요없이 사용이 가능합니다.

SendAsync()가 실행 중 다시 실행하면 오류가 발생합니다. 그러니 별도의 Lock작업을 해주던지 메세지 전송을 Queue처리해서 한 곳에서만 동작하게 구현을 해줘야 합니다.

ReceiveAsync()를 호출해서 값을 읽어야 하므로, 구현하기에 불편함이 있습니다. 해당 함수를 이용해서 Event를 만들어서 구현을 해주면 편리하게 사용이 가능할거라 생각됩니다. 귀찮아서 저도 그렇게 구현해 보려다 말았습니다.

using System.Net.WebSockets;

ClientWebSocket ws = new ClientWebSocket();
Uri uri = new Uri("ws://localhost:5000");

await ws.ConnectAsync(uri, CancellationToken.None);

Console.WriteLine(ws.State); // open

var segment = new ArraySegment<byte>(new byte[] { 0x03, 0x01, 0x10, 0xFF });
await ws.SendAsync(segment, WebSocketMessageType.Binary, true, CancellationToken.None);

이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)