Beispiel #1
0
        /*
         +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
         * 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);
            }
        }
Beispiel #2
0
 protected virtual Task OnReceiveMessage(string uid, ServerSocketResponse package) => Task.FromResult(default(object));
Beispiel #3
0
        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();
        }