.NET Core Console 에서 WebSocket Server 에 JsonRPC 적용하기

2023. 3. 7. 17:16CSharp

반응형

이전 강좌에서 WebSocket Server 를 만들어 보고 Client 와 동작하는 것을 확인 하였다. 

이번에는 WebSocket 에 Request, Response  Pattern 을 적용하여

마치 REST API 를 처리하는 것처럼 WebSocket Server 와  Client 를 수정해 보겠다. 

이를 위해 JSON-Rpc 라는 원격 프로시저 호출을 위한 간단한 경량의 통신방식을 이용할 것이다.

그리고 그것을 구현해 놓은 StreamJsonRPC 라는 Library 를 이용할 것이다. 

 

우선 Server 쪽 code 를 확인하자

// See https://aka.ms/new-console-template for more information
using StreamJsonRpc;
using System.Net;
using System.Net.WebSockets;

var listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();

Console.WriteLine("Listening...");

while (true)
{
    var context = await listener.GetContextAsync();

    if (context.Request.IsWebSocketRequest)
    {
        Console.WriteLine("WebSocket request received");

        var webSocketContext = await context.AcceptWebSocketAsync(subProtocol: null);
        var webSocket = webSocketContext.WebSocket;

        await ProcessJsonRpcAsync(webSocket);

        Console.WriteLine("WebSocket closed");
        Console.ReadLine();
    }
    else
    {
        context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
        context.Response.Close();
    }
}

static async Task ProcessJsonRpcAsync(WebSocket webSocket)
{
    var rpc = new JsonRpc(new WebSocketMessageHandler(webSocket), new MyService());
    rpc.StartListening();
    await rpc.Completion;
}

class MyService
{
    public string Echo(string message)
    {
        Console.WriteLine($"Received message: {message}");
        return "Echo: " + message;
    }
}

1. HttpListener 객체를 생성하여 로컬 호스트의 8080 포트에서 웹 요청을 수신한다.
2. 웹소켓 요청이 들어오면 WebSocketMessageHandler 객체를 생성하여 JsonRpc 객체와 연결한다.
3. JsonRpc 객체는 MyService 클래스의 메서드를 원격으로 호출할 수 있도록 한다.
4. MyService 클래스에는 Echo라는 메서드가 있으며, 이 메서드는 입력된 문자열에 "Echo: "를 붙여서 반환한다.

 

이제 Client 쪽 코드를 확인하자

// See https://aka.ms/new-console-template for more information
using StreamJsonRpc;
using System.Net.WebSockets;

var webSocket = new ClientWebSocket();
await webSocket.ConnectAsync(new Uri("ws://localhost:8080"), CancellationToken.None);

Console.WriteLine("WebSocket connected");
// Create JsonRpc instance with WebSocketMessageHandler
var rpc = new JsonRpc(new WebSocketMessageHandler(webSocket));

//// Start listening
rpc.StartListening();
// Attach the interface to the JsonRpc instance
var myService = rpc.Attach<IMyService>();

// Call remote method and wait for response
var response = await myService.Echo("Hello, World!");



Console.WriteLine($"Received: {response}");

await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);

Console.WriteLine("WebSocket closed");
Console.ReadLine();
interface IMyService
{
    Task<string> Echo(string message);
}

1. ClientWebSocket 객체를 생성하여 로컬 호스트의 8080 포트에 연결한다.
2. WebSocketMessageHandler 객체를 생성하여 JsonRpc 객체와 연결한다.
3. JsonRpc 객체는 IMyService 인터페이스를 사용하여 원격 서비스에 접근할 수 있도록 한다.
4. IMyService 인터페이스에는 Echo라는 메서드가 정의되어 있으며, 입력된 문자열에 "Echo: "를 붙여서 반환한다.
5. Echo 메서드를 호출하고 응답을 받아 출력한다.

 

이와 같이 JSON-RPC 를 이용하게 되면 특정 Request 를 

WebSocket 의 Remote (Server 일수도 있고 Client 일 수도 있다.)에 호출 하여 

Response 가 올때 까지 대기하게 된다. 

이런 형태가 되면 동기화가 필요한 (응답 동기화) 모든 통신에 응용해서 사용가능하다.

 

 

관련영상

https://youtu.be/fw1dbTBYBkE

 

 

 

반응형