예제 #1
0
 private void ProcessM3u8(HttpListenerContext context, JT1078AVInfo jT1078AVInfo)
 {
     if (authorization.Authorization(context, out IPrincipal principal))
     {
         hLSRequestManager.HandleHlsRequest(context, principal, jT1078AVInfo);
     }
 }
예제 #2
0
        private async ValueTask ProcessRequestAsync(HttpListenerContext context, IPrincipal principal)
        {
            if (context.Request.RawUrl.StartsWith("/favicon.ico"))
            {
                context.Http404();
                return;
            }
            if (context.Request.RawUrl.Contains(".m3u8") || context.Request.RawUrl.Contains(".ts"))
            {
                hLSRequestManager.HandleHlsRequest(context, principal);
                return;
            }
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}-{context.Request.RemoteEndPoint.ToString()}");
            }
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}-{context.Request.RemoteEndPoint.ToString()}");
            }
            string sim     = context.Request.QueryString.Get("sim");
            string channel = context.Request.QueryString.Get("channel");

            if (string.IsNullOrEmpty(sim) || string.IsNullOrEmpty(channel))
            {
                await context.Http400();

                return;
            }
            int.TryParse(channel, out int channelNo);
            if (context.Request.IsWebSocketRequest)
            {
                HttpListenerWebSocketContext wsContext = await context.AcceptWebSocketAsync(null, keepAliveInterval : TimeSpan.FromSeconds(5));

                var jT1078HttpContext = new JT1078HttpContext(context, wsContext, principal);
                jT1078HttpContext.Sim          = sim;
                jT1078HttpContext.ChannelNo    = channelNo;
                jT1078HttpContext.RTPVideoType = RTPVideoType.Ws_Flv;
                SessionManager.TryAdd(jT1078HttpContext);
                //这个发送出去,flv.js就报错了
                //await jT1078HttpContext.WebSocketSendHelloAsync();
                await Task.Factory.StartNew(async(state) =>
                {
                    //https://www.bejson.com/httputil/websocket/
                    //ws://localhost:15555?token=22&sim=1221&channel=1
                    var websocketContext = state as JT1078HttpContext;
                    while (websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Open ||
                           websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Connecting)
                    {
                        var buffer = ArrayPool <byte> .Shared.Rent(256);
                        try
                        {
                            //客户端主动断开需要有个线程去接收通知,不然会客户端会卡死直到超时
                            WebSocketReceiveResult receiveResult = await websocketContext.WebSocketContext.WebSocket.ReceiveAsync(buffer, CancellationToken.None);
                            if (receiveResult.EndOfMessage)
                            {
                                if (receiveResult.Count > 0)
                                {
                                    var data = buffer.AsSpan().Slice(0, receiveResult.Count).ToArray();
                                    if (Logger.IsEnabled(LogLevel.Trace))
                                    {
                                        Logger.LogTrace($"[ws receive]:{Encoding.UTF8.GetString(data)}");
                                    }
                                    await websocketContext.WebSocketSendTextAsync(data);
                                }
                            }
                        }
                        finally
                        {
                            ArrayPool <byte> .Shared.Return(buffer);
                        }
                    }
                    if (Logger.IsEnabled(LogLevel.Information))
                    {
                        Logger.LogInformation($"[ws close]:{websocketContext.SessionId}-{websocketContext.Sim}-{websocketContext.ChannelNo}-{websocketContext.StartTime:yyyyMMddhhmmss}");
                    }
                    SessionManager.TryRemove(websocketContext.SessionId);
                }, jT1078HttpContext);
            }
            else
            {
                var jT1078HttpContext = new JT1078HttpContext(context, principal);
                jT1078HttpContext.Sim          = sim;
                jT1078HttpContext.RTPVideoType = RTPVideoType.Http_Flv;
                jT1078HttpContext.ChannelNo    = channelNo;
                SessionManager.TryAdd(jT1078HttpContext);
            }
        }