Пример #1
0
        public async Task Start <T>(string uri, WebSocketBuildOption options) where T : WebSocketHandler, new()
        {
            var listener = new HttpListener();

            listener.Prefixes.Add(uri);
            listener.Start();

            while (true)
            {
                var listenerContext = await listener.GetContextAsync();

                if (listenerContext.Request.IsWebSocketRequest)
                {
                    var socketContext = await listenerContext.AcceptWebSocketAsync(null, options.KeepAliveInterval);

                    var acceptContext = new WebSocketAcceptContext(socketContext.WebSocket, listenerContext.User, options);
                    await WebSocketHandler.Accept <T>(acceptContext);
                }
                else
                {
                    listenerContext.Response.StatusCode = 404;
                    listenerContext.Response.Close();
                }
            }
        }
Пример #2
0
        public ClientManager(WebSocketBuildOption option)
        {
            this.option = option;

            //开启一个定时器,一定时间去检查一下有没有死亡而没有释放的连接实例
            timer = new Timer(CheckAlive, null, TimeSpan.FromSeconds(10), option.HeartbeatInterval);
        }
Пример #3
0
 public WebSocketAcceptContext(IServiceProvider serviceProvider, WebSocket webSocket, IPrincipal user, WebSocketBuildOption option)
 {
     ServiceProvider = serviceProvider;
     WebSocket       = webSocket;
     User            = user;
     Option          = option;
 }
Пример #4
0
        public virtual void Initialize(WebSocketAcceptContext acceptContext)
        {
            _option = acceptContext.Option;

            //开启一个定时器,一定时间去检查一下有没有死亡而没有释放的连接实例
            if (_option.HeartbeatInterval != TimeSpan.Zero)
            {
                _timer = new Timer(CheckAlive, null, TimeSpan.FromSeconds(10), _option.HeartbeatInterval);
            }
        }
Пример #5
0
        /// <summary>
        /// 初始化 <see cref="DistributedClientManager"/> 类的新实例。
        /// </summary>
        /// <param name="option"></param>
        public DistributedClientManager(WebSocketBuildOption option)
            : base(option)
        {
            aliveKey = option.AliveKey;

            //开启消息订阅,使用aliveKey作为通道
            var subMgr = SubscribeManagerFactory.CreateManager();

            subMgr.AddSubscriber(aliveKey, bytes =>
            {
                //收到消息后,在本地查找连接,并发送消息
                var msg = new JsonSerializer().Deserialize <DistributedInvokeMessage>(Encoding.UTF8.GetString(bytes));
                Clients(msg.Connections.ToArray()).SendAsync(msg.Message.Method, msg.Message.Arguments);
            });
        }
Пример #6
0
 /// <summary>
 /// 初始化 <see cref="SessionReviveMiddleware"/> 类的新实例。
 /// </summary>
 /// <param name="next"></param>
 /// <param name="serviceProvider"></param>
 /// <param name="option"></param>
 public WebSocketMiddleware(RequestDelegate next, IServiceProvider serviceProvider, WebSocketBuildOption option)
 {
     this.next            = next;
     this.serviceProvider = serviceProvider;
     this.option          = option;
 }
Пример #7
0
 internal static ClientManager GetManager(Type handlerType, WebSocketBuildOption option)
 {
     return(managers.GetOrAdd(handlerType, k => option.Distributed ? new DistributedClientManager(option) : new ClientManager(option)));
 }
Пример #8
0
 public WebSocketAcceptContext(WebSocket webSocket, IPrincipal user, WebSocketBuildOption option)
 {
     WebSocket = webSocket;
     User      = user;
     Option    = option;
 }