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(); } } }
public ClientManager(WebSocketBuildOption option) { this.option = option; //开启一个定时器,一定时间去检查一下有没有死亡而没有释放的连接实例 timer = new Timer(CheckAlive, null, TimeSpan.FromSeconds(10), option.HeartbeatInterval); }
public WebSocketAcceptContext(IServiceProvider serviceProvider, WebSocket webSocket, IPrincipal user, WebSocketBuildOption option) { ServiceProvider = serviceProvider; WebSocket = webSocket; User = user; Option = option; }
public virtual void Initialize(WebSocketAcceptContext acceptContext) { _option = acceptContext.Option; //开启一个定时器,一定时间去检查一下有没有死亡而没有释放的连接实例 if (_option.HeartbeatInterval != TimeSpan.Zero) { _timer = new Timer(CheckAlive, null, TimeSpan.FromSeconds(10), _option.HeartbeatInterval); } }
/// <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); }); }
/// <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; }
internal static ClientManager GetManager(Type handlerType, WebSocketBuildOption option) { return(managers.GetOrAdd(handlerType, k => option.Distributed ? new DistributedClientManager(option) : new ClientManager(option))); }
public WebSocketAcceptContext(WebSocket webSocket, IPrincipal user, WebSocketBuildOption option) { WebSocket = webSocket; User = user; Option = option; }