/* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= * IMPLEMENTATIONS */ private async Task <ServerSocketResponse> ReceiveResponseAsync(string uid, WebSocket socket, CancellationToken ct = default(CancellationToken)) { try { ServerSocketResponse response = new ServerSocketResponse(); response.Stream = new MemoryStream(); var buffer = new ArraySegment <byte>(new byte[8192]); WebSocketReceiveResult result; do { ct.ThrowIfCancellationRequested(); result = await socket.ReceiveAsync(buffer, ct); if (result == null) { continue; } response.Stream.Write(buffer.Array, buffer.Offset, result.Count); }while (!result.EndOfMessage); response.Stream.Seek(0, SeekOrigin.Begin); response.Type = result.MessageType; return(response); } catch (Exception e) { //this.OnException("ReceiveResponseAsync", uid, e); return(null); } }
protected virtual Task OnReceiveMessage(string uid, ServerSocketResponse package) => Task.FromResult(default(object));
public async Task CallInvoke(HttpContext context) { CancellationToken ct = context.RequestAborted; var socketId = this.OnCreateId(context); if (string.IsNullOrEmpty(socketId)) { Logger.Instance.StartLoggin("ServerSocketBase").Where("ServerSocketBase.CallInvoke") .OnException(new Exception("socketid is empty!")); context.Response.StatusCode = 400; return; } context.Response.Cookies.Append("test", "aa"); WebSocket currentSocket = await context.WebSockets.AcceptWebSocketAsync(); // in case that token is not set propperly if (string.IsNullOrEmpty(socketId)) { await currentSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", ct); return; } _sockets.TryAdd(socketId, currentSocket); this.PassWebsocket(socketId, currentSocket); await this.OnClientConnect(socketId); while (true) { if (ct.IsCancellationRequested) { break; } ServerSocketResponse package = await ReceiveResponseAsync(socketId, currentSocket); if (package == null || !package.HasTransimssion) { if (currentSocket.State != WebSocketState.Open) { break; } if (this.CloseIfConnectionProblem(socketId)) { break; } } else { await this.OnReceiveMessage(socketId, package); } } WebSocket dummy; _sockets.TryRemove(socketId, out dummy); await this.OnClientDisconect(socketId); try { await currentSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", ct); } catch (Exception e) { } currentSocket.Dispose(); }