C#의 WebSocket 클라이언트

Haider Ali 2023년10월12일
  1. C#의 WebSocket
  2. C#에서 WebSocket 클라이언트 생성
  3. C#의 Disposing 메서드를 사용하여 WebSocket 클라이언트 만들기
C#의 WebSocket 클라이언트

이 가이드에서는 C# WebSocket이 무엇이며 C#에서 연결을 설정하는 방법에 대해 설명합니다. 마지막으로 이 기사에서는 C#의 WebSocket 클라이언트와 이를 작성하는 방법을 다룰 것입니다.

자, 더 이상 지체하지 않고 바로 들어가 봅시다.

C#의 WebSocket

WebSocket의 개념을 제대로 이해하려면 네트워킹 분야를 살펴봐야 합니다. 이제 WebSocket은 TCP 연결을 사용하여 통신을 위한 전이중 연결을 제공하는 통신 프로토콜입니다.

TCP는 서버 간 연결을 활성화하여 통신합니다. 전이중 통신이기 때문에 서버 간에 앞뒤로 통신할 수 있는 기회도 제공합니다.

WebSocket 프로토콜을 사용하면 웹 브라우저가 웹 서버와 상호 작용할 수 있습니다. 반이중 통신인 HTTP와 같은 다른 프로토콜과 달리 WebSocket은 서버와 클라이언트가 완전히 중단 없이 양방향 통신을 할 수 있도록 합니다.

클라이언트는 서버가 콘텐츠를 보낼 때 콘텐츠를 요청할 필요가 없으므로 통신이 더 쉬워집니다.

이것은 또한 메시지 스트림을 활성화합니다. WebSocket은 자체 메시지 개념 없이 바이트 스트림을 처리할 수 있도록 TCP를 통해 스트리밍되는 이러한 메시지를 활성화합니다.

연결 설정(핸드쉐이킹)

TCP를 통해 서버와 클라이언트 간에 연결이 설정되며 TCP는 핸드셰이크 개념을 사용합니다. 이것은 클라이언트가 서버에 대한 연결을 형성하기 위한 권한을 요청하고 서버가 이 연결을 형성할지 여부를 결정함을 의미합니다.

연결이 형성되면 클라이언트와 서버는 중단 없이 통신할 수 있습니다.

TCP 연결 사용

UDP라는 다른 연결을 알 수 있습니다. 이제 질문이 생깁니다. 왜 UDP가 아닌 TCP를 사용합니까?

첫째, UDP는 TCP가 제공하는 기능을 제공하지 않습니다. 신뢰성도 없고 적절한 연결도 없습니다.

UDP를 사용하는 유일한 이점은 빠른 속도이지만 이 연결을 사용하기에는 이 이유가 충분하지 않습니다. 그래서 우리는 Handshaking 규칙 때문에 신뢰할 수 있는 TCP를 사용합니다.

C#에서 WebSocket 클라이언트 생성

이제 .NET 프레임워크는 WebSocket을 일부 지원합니다. 처음부터 코드를 작성하는 것은 약간 성가신 과정이고 매우 까다로울 뿐입니다. 그래서 WebSocket 전용 라이브러리인 WebSocketSharp를 사용합니다.

우리의 프로그래밍 경험을 훨씬 더 쉽게 만들어주기 때문에 널리 퍼져 있습니다. 이를 사용하려면 소프트웨어에서 다운로드해야 합니다. Visual Studio를 권장합니다.

이 라이브러리를 사용하여 서버와 클라이언트 측 연결을 만드는 방법을 살펴보겠습니다. 이 예에서는 연결하려는 서버의 URL을 사용해야 하며 WebSocket 연결을 생성하므로 항상 ws로 시작해야 합니다.

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;

namespace WebSocket_Client {
  public class Program {
    static void Main(string[] args) {
      // creating a client WebSocket
      WebSocket webSocket = new WebSocket(
          "ws://simple-websocket-server-echo.glich.me/");  // in this string, we will type URL of
                                                           // server we want to connect to

      webSocket.OnMessage += webSocket_OnMessage;  // message for the function below

      webSocket.Connect();                          // connection to server
      webSocket.Send("Hello server, i am client");  // message to server
    }

    public static void webSocket_OnMessage(object viewer,
                                           MessageEventArgs a)  // function for server to respond
    {
      Console.WriteLine("Recived from the server " + a.Data);
    }
  }
}

C#의 Disposing 메서드를 사용하여 WebSocket 클라이언트 만들기

클라이언트 측 코드를 작성하는 또 다른 방법은 using() 기능을 사용하는 것입니다. 이 함수를 사용하여 이 함수 내부에 작성된 코드 블록을 삭제할 수 있습니다.

우리는 TCP 연결로 작업하고 있기 때문에 이 기능을 사용하는 것이 중요합니다. 위에서 설명한 것처럼 TCP에서는 연결을 보호하고 안정성을 높이기 위해 핸드셰이킹 규칙에 따라 연결을 설정합니다.

그러나 설정된 연결이 제대로 닫히지 않는 경우가 있습니다. 이것은 컴파일러의 관점에서 연결이 닫히지 않았기 때문에 연결을 다시 생성하는 데 문제를 일으킬 수 있습니다.

따라서 이 오류 루프를 피하기 위해 using() 함수를 사용하고 코드 블록을 작성하여 연결을 적절하게 실행하고 처리합니다.

using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;

namespace WebSocket_Client {
  class Program {
    static void Main(string[] args) {
      using (WebSocket webSocket = new WebSocket(
                 "ws://simple-websocket-server-echo.glich.me/"))  // write the URL of server to
                                                                  // connect to
      {
        webSocket.OnMessage += webSocket_OnMessage;  // message for the function below

        webSocket.Connect();                          // connection to the server
        webSocket.Send("Hello server, i am client");  // sending a message to the server
      }
    }

    public static void webSocket_OnMessage(object viewer,
                                           MessageEventArgs a)  // function for server to respond
    {
      Console.WriteLine("Recived from the server " + a.Data);
    }
  }
}
작가: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn