2023. 3. 7. 17:16ㆍCSharp
이전 강좌에서 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 가 올때 까지 대기하게 된다.
이런 형태가 되면 동기화가 필요한 (응답 동기화) 모든 통신에 응용해서 사용가능하다.
관련영상
'CSharp' 카테고리의 다른 글
Expression Tree (0) | 2023.09.04 |
---|---|
Fleck 을 이용한 WebSocket Server 구현 (with streamjsonrpc) (0) | 2023.03.20 |
WebSocket 에 JsonRPC 및 일반메세지 함께 처리하기 (0) | 2023.03.13 |
.NET Core Console 에서 WebSocket Server 만들기 (0) | 2023.03.07 |
javascript c# 간의 암호화 (RSA 와 JSEncrypt 를 이용) (0) | 2023.02.06 |