Skip to content

Usage_Chat

Junil Um edited this page Oct 16, 2018 · 1 revision

채팅방 만들기

채팅방을 통해 채널을 개설하고 여러 클라이언트에게 메시지를 전송/수신 받는 방법을 알아봅니다.

Startup 구성하기

Startup.cs 파일을 생성하여 아래와 같이 WebSocketIo 를 사용할 수 있도록 구성합니다.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvcWithWebSocketIo();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseWebSockets()
            .UseWebSocketIo()
            .UseMvc();
    }
}

ChatController 만들기

채팅방 기능을 수행하는 ChatController.cs 파일을 생성 한 후 WebSocketIoController를 상속합니다. IWebSocketIoPacket 은 클라이언트로부터 전송된 패킷(Packet) 정보입니다.

[Route("/api/channels/{channelName}")]
public class ChannelsController : WebSocketIoController
{
    private readonly IWebSocketIo _webSocketIo;
    private readonly IWebSocketIoPacket _packet;

    public ChannelsController(IWebSocketIo webSocketIo,
        IWebSocketIoPacket packet) : base(webSocketIo)
    {
        _webSocketIo = webSocketIo;
        _packet = packet;
    }
}

이제 채팅방(채널)에 참여시킬 수 있는 Join 메서드를 만듭니다. 클라이언트가 채널에 참여하기 되면 _webSocketIo.Broadcast.In(channelName) 명령을 통해 채널의 모든 사람에게 메시지를 보냅니다.

In 명령과 To 명령의 차이점은 다음과 같습니다.

  • In 메서드 : 채널에 나를 포함한 모든 클라이언트를 반환
  • To 메서드 : 채널에 나를 포함하지 않은 모든 클라이언트를 반환
[Route("join")]
public async Task<IActionResult> JoinAsync(string channelName)
{
    _webSocketIo.Disconnecting += WebSocketIoOnDisconnecting;
    _webSocketIo.Leaved += WebSocketIoOnLeaved;

    await _webSocketIo.JoinAsync(channelName);
    await _webSocketIo.Broadcast.In(channelName).SendDataAsync(
        WebSocketIoResponse.CreateEvent(_packet, "chat.joined", $"Joined {_webSocketIo.SocketId} in {channelName}."));

    return Ok();
}

private async void WebSocketIoOnLeaved(object sender, WebSocketIoEventArgs e)
{
    await e.WebSocketIo.Broadcast.To(e.ChannelKey).SendDataAsync($"Leaved {e.WebSocketIo.SocketId} in {e.ChannelKey}");
}

private async void WebSocketIoOnDisconnecting(object sender, EventArgs e)
{
    foreach (var channel in _webSocketIo.JoinedChannels)
    {
        await _webSocketIo.Broadcast.In(channel).SendDataAsync($"Disconnect {_webSocketIo.SocketId} in {channel} room");
    }
}

이제 채팅 메시지를 보낼 수 있는 Chat 메서드를 구현해 봅니다.

메서드의 매개변수인 ChatRequest 는 클라이언트로부터 전송된 데이터 입니다. _webSocketIo.Broadcast.In(channelName) 명령을 통해 채널의 모든 클라이언트에게 전송된 데이터 중 메시지(Message) 를 전송합니다. 모든 클라이언트는 chat.received 이벤트로 메시지를 전송합니다.

[Route("chat")]
public async Task<IActionResult> ChatAsync(string channelName, ChatRequest request)
{
    await _webSocketIo.Broadcast.In(channelName).SendDataAsync(
        WebSocketIoResponse.CreateEvent(_packet, "chat.received", request.Message));

    return Ok();
}

채팅 웹 페이지

프로젝트를 실행하고 웹 브라우저를 구동하여 http://localhost:12345 링크로 접속합니다.

이제 여러 사람과 채팅을 즐겨보세요.