WebSockets는 실시간 데이터 전송 및 양방향 통신을 지원하는 프로토콜로, .NET 환경에서는 WebSocket을 사용하여 다양한 실시간 애플리케이션을 개발할 수 있습니다. 이 가이드에서는 .NET Core에서 WebSocket을 사용하여 간단한 클라이언트-서버 애플리케이션을 만드는 방법을 설명합니다.
프로젝트 설정
WebSocket을 사용하여 클라이언트와 서버 간의 실시간 통신을 구현하려면, .NET Core 프로젝트를 생성하고 WebSocket 서버와 클라이언트를 구현해야 합니다. 여기서는 Visual Studio Code를 사용하여 이 작업을 수행하겠습니다.
1. .NET Core 프로젝트 생성
- .NET SDK 설치
- 최신 버전의 .NET SDK를 설치합니다.
- 프로젝트 생성
- 명령 프롬프트 또는 터미널을 열고 다음 명령어를 사용하여 새 콘솔 애플리케이션을 생성합니다.
dotnet new console -n WebSocketExample
- 프로젝트 디렉토리로 이동
cd WebSocketExample
- VS Code에서 프로젝트 열기
- VS Code에서
WebSocketExample
폴더를 엽니다.
- VS Code에서
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. 서버와 클라이언트 실행
서버 실행
- 서버 실행
dotnet run --project WebSocketExample
- 서버 코드를 실행하여 WebSocket 서버를 시작합니다.
- 서버 로그 확인
- 서버가 시작되면
Server started at ws://localhost:5000/ws/
메시지가 출력됩니다.
클라이언트 실행
- 클라이언트 실행
dotnet run --project WebSocketExample/WebSocketClient.csproj
- 다른 터미널에서 클라이언트 코드를 실행하여 서버에 연결합니다.
- 메시지 전송 및 수신
- 클라이언트가 서버에 연결되면
Connected to the server!
메시지가 출력됩니다. - 메시지를 입력하고 전송하면 서버로부터 에코된 메시지를 수신합니다.
- 클라이언트가 서버에 연결되면
요약
이 가이드에서는 .NET Core에서 WebSocket을 사용하여 간단한 클라이언트-서버 애플리케이션을 구현하는 방법을 설명했습니다. WebSocket을 사용하면 실시간 통신이 필요한 애플리케이션을 효율적으로 개발할 수 있습니다. 이 예제를 바탕으로 다양한 기능을 확장하여 사용할 수 있습니다.
추가 참고 자료
'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 |