当前位置: 首页 > news >正文

网页设计美工培训班苏州百度推广排名优化

网页设计美工培训班,苏州百度推广排名优化,网站管理助手数据库,我先做个网站怎么做基于WebSocket实现的后台服务,用于接收客户端的心跳消息,并根据心跳消息来维护客户端连接。 具体实现中,服务启动后会创建一个HttpListener对象,用于监听客户端的WebSocket连接请求。当客户端连接成功后,服务会为每个…

基于WebSocket实现的后台服务,用于接收客户端的心跳消息,并根据心跳消息来维护客户端连接。

具体实现中,服务启动后会创建一个HttpListener对象,用于监听客户端的WebSocket连接请求。当客户端连接成功后,服务会为每个连接创建一个Task实例,用于接收客户端发送的心跳消息,并根据心跳消息更新心跳时间戳。服务还会定期向客户端发送心跳消息,以保持连接的活跃状态。

如果服务在一定时间内没有收到客户端发送的心跳消息,就会认为客户端已经掉线,服务会关闭连接并从连接列表中移除该客户端。

此服务适用于需要实现长连接的场景,例如实时消息推送、在线游戏等。需要注意的是,此服务只能用于WebSocket通信,客户端必须实现WebSocket协议。

using Microsoft.Extensions.Hosting;
using MSEBP.Kernel.Common.Logging;
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace Authorization.WebApi
{/// <summary>/// 此代码只能用于 websocket通信,客户端必须websocket实现,暂时无用。/// </summary>public class WebSocketBackgroundService : IHostedService, IDisposable{private const int _heartBeatInterval = 30000; // 心跳间隔(毫秒)private const int _heartBeatTimeout = 60000; // 心跳超时时间(毫秒)private const int _clientIdLength = 10;private readonly CancellationTokenSource _cts = new CancellationTokenSource();private readonly ConcurrentDictionary<string, WebSocket> _clients = new ConcurrentDictionary<string, WebSocket>();private readonly ILogger _logger;/// <summary>/// /// </summary>/// <param name="logger"></param>public WebSocketBackgroundService(ILogger logger){_logger = logger;}/// <summary>/// /// </summary>/// <param name="cancellationToken"></param>/// <returns></returns>public async Task StartAsync(CancellationToken cancellationToken){IPAddress localIp = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);if (localIp == null){throw new Exception("Cannot find local IP address.");}IPEndPoint localEndPoint = new IPEndPoint(localIp, 8181);HttpListener listener = new HttpListener();//listener.Prefixes.Add($"http://{localEndPoint}/");listener.Start();_ = Task.Run(async () =>{try{while (!_cts.IsCancellationRequested){HttpListenerContext context = await listener.GetContextAsync();if (context.Request.IsWebSocketRequest){WebSocket webSocket = await AcceptWebSocketAsync(context);_ = Task.Run(async () =>{await ReceiveHeartbeatAsync(webSocket);}, _cts.Token);}else{context.Response.StatusCode = 400;context.Response.Close();}}}catch (Exception ex){_logger.Error(ex, "WebSocket server error.");}}, _cts.Token);}private async Task<WebSocket> AcceptWebSocketAsync(HttpListenerContext context){HttpListenerWebSocketContext wsContext = await context.AcceptWebSocketAsync(null);WebSocket webSocket = wsContext.WebSocket;return webSocket;}private async Task ReceiveHeartbeatAsync(WebSocket webSocket){byte[] buffer = new byte[1024];CancellationToken token = _cts.Token;DateTime lastHeartbeatTime = DateTime.UtcNow;try{while (webSocket.State == WebSocketState.Open && !token.IsCancellationRequested){WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);if (result.CloseStatus.HasValue){await CloseWebSocketAsync(webSocket, result.CloseStatus.Value, result.CloseStatusDescription);break;}else if (result.MessageType == WebSocketMessageType.Text){string message = Encoding.UTF8.GetString(buffer, 0, result.Count).Trim();if (message.StartsWith("heartbeat")){lastHeartbeatTime = DateTime.UtcNow;string clientId = message.Substring(0, Math.Min(message.Length, _clientIdLength));_clients.TryAdd(clientId, webSocket);}else if (string.IsNullOrEmpty(message)){await CloseWebSocketAsync(webSocket, WebSocketCloseStatus.NormalClosure, "Closed by client");break;}else{// 处理业务逻辑}}// 检测心跳超时if ((DateTime.UtcNow - lastHeartbeatTime).TotalMilliseconds > _heartBeatTimeout) { await CloseWebSocketAsync(webSocket, WebSocketCloseStatus.NormalClosure, "Heartbeat timeout");break;}}}catch (WebSocketException ex) when (ex.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely){// WebSocket 连接被意外关闭,忽略异常}catch (Exception ex){_logger.Error(ex, "WebSocket error.");}finally{// 移除客户端连接foreach (var item in _clients){if (item.Value == webSocket){_clients.TryRemove(item.Key, out _);break;}}await CloseWebSocketAsync(webSocket, WebSocketCloseStatus.NormalClosure, "Closed by server");}}private async Task CloseWebSocketAsync(WebSocket webSocket, WebSocketCloseStatus closeStatus, string closeStatusDescription){try{await webSocket.CloseAsync(closeStatus, closeStatusDescription, CancellationToken.None);}catch (WebSocketException ex) when (ex.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely){// WebSocket 连接已经关闭,忽略异常}catch (Exception ex){_logger.Error(ex, "Failed to close WebSocket.");}}public async Task StopAsync(CancellationToken cancellationToken){_cts.Cancel();await Task.CompletedTask;}public void Dispose(){_cts.Dispose();}}
}

http://www.laogonggong.com/news/36706.html

相关文章:

  • 烟台汽车租赁网站建设成品短视频app源码的优点
  • 政府部门建设宣传网站的意义全网整合营销推广方案
  • 优秀网站作品截图百度上海总部
  • 惠阳区城市建设规划局网站企业网站推广注意事项
  • 建设通类型网站叫啥青岛seo优化公司
  • 全面的手机网站建设百度网页版主页
  • php网站开发多少钱找个免费网站这么难吗
  • 给我看电影全集十堰seo排名公司
  • 香港做最好看的电影网站有哪些哔哩哔哩b站在线看免费
  • 哪里有建网站的公司关键词排名优化官网
  • 网站制作的核心是什么阿里大数据平台
  • 免费的网站怎么做免费发布友链
  • 怎样建立自己网站视频做网站推广需要多少钱
  • 商城网站开发需要哪些人员无代码建站
  • 用什么软件可以做网站怎么做小程序
  • 上海网站建设要多少钱济南网站优化排名推广
  • 招聘网站分析报告怎么做武汉建站优化厂家
  • flash网站轮播广告怎么做长沙网动网络科技有限公司
  • 网站建设上市厦门零基础学seo
  • 做商城类的网站需要做些什么东莞搜索排名提升
  • 最新网站建设语言游戏推广是什么工作
  • 网站建设 软件保定百度推广联系电话
  • 昆明学校网站建设网站开发流程
  • 做网站的做app的广州网站建设正规公司
  • 做预算查价格的网站是哪个新媒体运营哪个培训机构好
  • 内蒙古网站建设百度企业培训员工培训平台
  • 东莞seo排名优化东莞百度seo推广公司
  • 网页制作与网站建设技术大全 pdfseo关键词排名软件
  • 太原网站建站模板广西seo关键词怎么优化
  • 网站开发程序用什么好优化营商环境 提升服务效能