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

东莞品牌网站制作写软文用什么软件

东莞品牌网站制作,写软文用什么软件,b2c电子商务网站设计与实现,宁波seo优化基于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.hkea.cn/news/420684/

相关文章:

  • 可以做英文纵横字谜的网站搜狗网站收录入口
  • web前端开发是不是做网站百家号关键词排名优化
  • 夸克看网站要钱吗电商网站seo优化
  • 自己做网站排版138ip查询网域名解析
  • 东莞做网站 南城石佳2023网站推广入口
  • 广东省省建设厅网站郴州网站建设网络推广平台
  • 校园网站推广方案怎么做应用商店优化
  • 巩义网站建设网络营销公司是做什么的
  • 做网站基本教程一站式营销平台
  • 杭州模板网站建设电脑培训网上培训班
  • 大连做网站不错的公司怎样把广告放到百度
  • 网站上面带官网字样怎么做的网站设计的流程
  • 有个网站是做视频相册的网球排名即时最新排名
  • 论坛网站备案流程图优化大师怎么提交作业
  • 织梦政府网站模板百度在线入口
  • 专业做婚纱摄影网站会员制营销
  • 网站内容丰富互动营销平台
  • 阿里巴巴logo高清图谷歌seo网站推广
  • 网站如何做内链seo高手是怎样炼成的
  • 设计师个人网站建设怎样注册一个自己的平台
  • 徐州营销网站建设产品线上推广渠道
  • 绍兴市网站建设公司企业官网搭建
  • 关于网页设计的网站免费发布信息网站大全
  • 郑州新闻头条seo基础教程
  • 做网站比较大的公司朔州seo
  • 如何制作私人网站福州专业的seo软件
  • 做网站主流技术南宁在哪里推广网站
  • 老板让我做网站负责人微博营销软件
  • 教我做网站百度打开
  • 网站开发时如何兼容电商运营是做什么的