728x90

WebSockets는 실시간 데이터 전송 및 양방향 통신을 지원하는 프로토콜로, .NET 환경에서는 WebSocket을 사용하여 다양한 실시간 애플리케이션을 개발할 수 있습니다. 이 가이드에서는 .NET Core에서 WebSocket을 사용하여 간단한 클라이언트-서버 애플리케이션을 만드는 방법을 설명합니다.

프로젝트 설정

WebSocket을 사용하여 클라이언트와 서버 간의 실시간 통신을 구현하려면, .NET Core 프로젝트를 생성하고 WebSocket 서버와 클라이언트를 구현해야 합니다. 여기서는 Visual Studio Code를 사용하여 이 작업을 수행하겠습니다.

1. .NET Core 프로젝트 생성

  1. .NET SDK 설치
    • 최신 버전의 .NET SDK를 설치합니다.
  2. 프로젝트 생성
    • 명령 프롬프트 또는 터미널을 열고 다음 명령어를 사용하여 새 콘솔 애플리케이션을 생성합니다.
    dotnet new console -n WebSocketExample
  3. 프로젝트 디렉토리로 이동
  4. cd WebSocketExample
  5. VS Code에서 프로젝트 열기
    • VS Code에서 WebSocketExample 폴더를 엽니다.

2. WebSocket 서버 구현

.NET Core에서는 WebSocket 서버를 쉽게 구현할 수 있습니다. 아래 예제에서는 기본적인 WebSocket 서버를 만들어 클라이언트로부터 메시지를 수신하고 에코하는 기능을 구현합니다.

Program.cs 파일 수정

Program.cs 파일을 열고 다음 코드를 입력합니다.

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using Systehttp://m.Threading.Tasks;

namespace WebSocketExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Starting WebSocket server...");
            HttpListener httpListener = new HttpListener();
            httpListener.Prefixes.Add("http://localhost:5000/ws/");
            httpListener.Start();
            Console.WriteLine("Server started at ws://localhost:5000/ws/");

            while (true)
            {
                // 클라이언트 연결 대기
                HttpListenerContext context = await httpListener.GetContextAsync();

                if (context.Request.IsWebSocketRequest)
                {
                    HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
                    WebSocket webSocket = webSocketContext.WebSocket;
                    Console.WriteLine("Client connected!");

                    // 메시지 수신 및 에코
                    await Echo(webSocket);
                }
                else
                {
                    context.Response.StatusCode = 400;
                    context.Response.Close();
                    Console.WriteLine("Not a WebSocket request.");
                }
            }
        }

        static async Task Echo(WebSocket webSocket)
        {
            var buffer = new byte[1024 * 4];

            while (webSocket.State == WebSocketState.Open)
            {
                WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    Console.WriteLine("Client disconnected.");
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
                else
                {
                    var receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
                    Console.WriteLine($"Received: {receivedMessage}");

                    // 에코 메시지 전송
                    var sendMessage = Encoding.UTF8.GetBytes($"Echo: {receivedMessage}");
                    await webSocket.SendAsync(new ArraySegment<byte>(sendMessage, 0, sendMessage.Length), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }
        }
    }
}

설명

  • HttpListener: HTTP 요청을 수신하는 간단한 서버를 설정합니다. WebSocket은 HTTP 연결을 통해 업그레이드됩니다.
  • WebSocket 연결 수락: AcceptWebSocketAsync 메서드를 사용하여 클라이언트의 WebSocket 연결을 수락합니다.
  • 메시지 수신 및 에코: 클라이언트로부터 메시지를 수신하고, 같은 내용을 클라이언트에 다시 전송(에코)합니다.

3. WebSocket 클라이언트 구현

이제 WebSocket 클라이언트를 만들어 서버에 연결하고 메시지를 전송할 수 있도록 합니다.

클라이언트 구현

클라이언트 코드를 작성하여 서버에 연결하고 메시지를 전송하는 기능을 구현합니다. 클라이언트는 서버로부터 에코된 메시지를 수신합니다.

새로운 파일 생성

VS Code에서 새로운 C# 파일을 생성하고 다음 코드를 작성합니다. 여기서는 WebSocketClient.cs 파일을 사용합니다.

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using Systehttp://m.Threading.Tasks;

namespace WebSocketExample
{
    class WebSocketClient
    {
        static async Task Main(string[] args)
        {
            using (ClientWebSocket client = new ClientWebSocket())
            {
                Uri serverUri = new Uri("ws://localhost:5000/ws/");
                await client.ConnectAsync(serverUri, CancellationToken.None);
                Console.WriteLine("Connected to the server!");

                // 메시지 전송 및 수신
                await SendAndReceiveMessages(client);
            }
        }

        static async Task SendAndReceiveMessages(ClientWebSocket client)
        {
            while (client.State == WebSocketState.Open)
            {
                Console.Write("Enter a message to send: ");
                string message = Console.ReadLine();

                if (string.IsNullOrWhiteSpace(message))
                {
                    Console.WriteLine("Empty message. Closing connection...");
                    await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
                    break;
                }

                var sendMessage = Encoding.UTF8.GetBytes(message);
                await client.SendAsync(new ArraySegment<byte>(sendMessage, 0, sendMessage.Length), WebSocketMessageType.Text, true, CancellationToken.None);

                var buffer = new byte[1024 * 4];
                WebSocketReceiveResult result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

                var receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
                Console.WriteLine($"Received from server: {receivedMessage}");
            }
        }
    }
}

설명

  • ClientWebSocket: 클라이언트 측 WebSocket 연결을 설정합니다.
  • 메시지 전송: 사용자가 입력한 메시지를 서버로 전송합니다.
  • 메시지 수신: 서버로부터 에코된 메시지를 수신하여 콘솔에 출력합니다.

4. 서버와 클라이언트 실행

서버 실행

  1. 서버 실행
    dotnet run --project WebSocketExample
  2. 서버 코드를 실행하여 WebSocket 서버를 시작합니다.
  3. 서버 로그 확인
  4. 서버가 시작되면 Server started at ws://localhost:5000/ws/ 메시지가 출력됩니다.

클라이언트 실행

  1. 클라이언트 실행
    dotnet run --project WebSocketExample/WebSocketClient.csproj
  2. 다른 터미널에서 클라이언트 코드를 실행하여 서버에 연결합니다.
  3. 메시지 전송 및 수신
    • 클라이언트가 서버에 연결되면 Connected to the server! 메시지가 출력됩니다.
    • 메시지를 입력하고 전송하면 서버로부터 에코된 메시지를 수신합니다.

요약

이 가이드에서는 .NET Core에서 WebSocket을 사용하여 간단한 클라이언트-서버 애플리케이션을 구현하는 방법을 설명했습니다. WebSocket을 사용하면 실시간 통신이 필요한 애플리케이션을 효율적으로 개발할 수 있습니다. 이 예제를 바탕으로 다양한 기능을 확장하여 사용할 수 있습니다.

추가 참고 자료

 
728x90
반응형

'Software > C#' 카테고리의 다른 글

C# 시작하기 - 멀티스레드  (0) 2024.08.17
C# 시작하기 - 피아노 소리  (0) 2024.07.29
MAUI 시작하기 - HttpClient 및 WebSocket  (0) 2024.07.28
MAUI 시작하기 - 숫자맞추기  (0) 2024.07.28
MAUI 시작하기 - Barcode  (0) 2024.07.28

+ Recent posts