-
Notifications
You must be signed in to change notification settings - Fork 6
Usage_Chat
Junil Um edited this page Oct 16, 2018
·
1 revision
채팅방을 통해 채널을 개설하고 여러 클라이언트에게 메시지를 전송/수신 받는 방법을 알아봅니다.
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.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 링크로 접속합니다.
이제 여러 사람과 채팅을 즐겨보세요.