@inject HttpClient http @code { private string nickName; private string nickNameClass => string.IsNullOrWhiteSpace(nickName) ? "is-invalid form-control" : "form-control"; private string message; private string messageClass => string.IsNullOrWhiteSpace(message) ? "is-invalid form-control" : "form-control"; private int connState = 0; private const int maxDisplayMessage = 1000; private List displayingMessages = new List(maxDisplayMessage); }

Simple Web Chat

@if (connState == 0) {
@if (string.IsNullOrEmpty(nickName)) { } else { }
} else if (connState == 1) { Conecting... } else if (connState == 2) {
@if (string.IsNullOrEmpty(message)) { } else { }
@foreach (var item in displayingMessages) {
@item
} } else { Error }
@code { private System.Net.WebSockets.ClientWebSocket sck; private void NickNameChanged(ChangeEventArgs e) { nickName = e.Value.ToString().Trim(); StateHasChanged(); } private void MessageChanged(ChangeEventArgs e) { message = e.Value.ToString().Trim(); StateHasChanged(); } private async Task Connect() { if (string.IsNullOrEmpty(nickName)) return; connState = 1; StateHasChanged(); try { sck = new System.Net.WebSockets.ClientWebSocket(); sck.Options.AddSubProtocol("swcp"); var b = http.BaseAddress; await sck.ConnectAsync(new Uri($"{(b.Scheme == "https" ? "wss" : "ws")}://{b.Host}:{b.Port}/connect"), default); connState = 2; StateHasChanged(); var buf = System.Text.Encoding.UTF8.GetBytes(nickName); await sck.SendAsync(buf, System.Net.WebSockets.WebSocketMessageType.Text, true, default); while (true) { buf = new Byte[1024]; var r = await sck.ReceiveAsync(buf, default); displayingMessages.Insert(0, System.Text.Encoding.UTF8.GetString(buf, 0, r.Count)); while (displayingMessages.Count >= maxDisplayMessage) displayingMessages.RemoveAt(maxDisplayMessage - 1); StateHasChanged(); } } catch (Exception) { connState = -1; } } private async Task Send() { if (string.IsNullOrEmpty(message)) return; var msg = $"{nickName}: {message}"; await sck.SendAsync(System.Text.Encoding.UTF8.GetBytes(msg), System.Net.WebSockets.WebSocketMessageType.Text, true, default); message = ""; StateHasChanged(); } }