首页 > 其他分享 >WebSocket服务搭建

WebSocket服务搭建

时间:2024-05-27 16:33:40浏览次数:15  
标签:服务 value connections result context WebSocket 搭建 webSocket

1、在NuGet包管理工具安装websocket包

 2、添加自定义中间件

app.UseWebSockets();
app.UseMiddleware<CustomWebSocketMiddleware>();

3、编写websocket中间件

private readonly RequestDelegate _next;
private ILogger<CustomWebSocketMiddleware> _Logger;
public List<WebSocketConnect> _connections = new List<WebSocketConnect>();
public CustomWebSocketMiddleware(RequestDelegate next, ILogger<CustomWebSocketMiddleware> logger)
{
_next = next;
_Logger = logger;
}

public async Task InvokeAsync(HttpContext context)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await _next(context); // 如果不是WebSocket请求,则继续处理管道中的下一个中间件
return;
}
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

// 启动WebSocket连接处理任务
await ProcessWebSocketAsync(context, webSocket);
}

private async Task ProcessWebSocketAsync(HttpContext context, WebSocket webSocket)
{
var buffer = new byte[1024 * 4]; // 4KB buffer
WebSocketReceiveResult result;
var ipProt = context.Request.Host.Value.Split(":");
WebSocketConnect connect = new WebSocketConnect
{
Socket = webSocket,
path = context.Request.Path.Value,
ip = ipProt[0],
port = ipProt[1]
};
_Logger.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}写入wobsocket连接,{ipProt[0]} {ipProt[1]}{ context.Request.Path.Value}");
//判断连接池是否存在该链接
if (!_connections.Any(connection => connection.path == context.Request.Path.Value && connection.Socket.State== WebSocketState.Open))
{
for (var i=0;i<_connections.Count;i++)
{
if (_connections[i].path==context.Request.Path && (_connections[i].Socket.State==WebSocketState.Closed || _connections[i].Socket.State == WebSocketState.Aborted))
{
_connections.Remove(_connections[i]);
}
}
_connections.Add(connect);
}
try
{
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
if (result.MessageType == WebSocketMessageType.Text)
{
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received: {receivedMessage}");

// 发送消息回显
//string echoMessage = $"Echo: {receivedMessage}";
await ProcessReceive(receivedMessage, webSocket, context);
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
catch (Exception ex)
{
_Logger.LogError(ex.Message);
if (webSocket.State == WebSocketState.Open)
{
_connections.Remove(connect);
await webSocket.CloseAsync(WebSocketCloseStatus.InternalServerError, "连接异常", CancellationToken.None);
}
}
}

private async Task ProcessReceive(string message, WebSocket webSocket, HttpContext context)
{

//处理消息

}



4、在前端调用websocket服务

const ws = ref(null)
const reconnection = () => {
  ws.value = new WebSocket(env.socket.baseUrl)
  ws.value.addEventListener('open', () => {
    socketState.value = '连接成功'
    console.log('连接成功')
  })
  ws.value.addEventListener('message', (event) => {
    
  })
  ws.value.addEventListener('close', (e) => {
    socketState.value = '连接已关闭'
    console.log('WebSocket连接已关闭')
  })
  ws.value.addEventListener('error', (error) => {
    socketState.value = '连接错误,已断开连接'
    console.error('WebSocket发生错误:', error)
  })
}

 发送消息

 ws.value.send(JSON.stringify(data))
 

 

标签:服务,value,connections,result,context,WebSocket,搭建,webSocket
From: https://www.cnblogs.com/yeyuqian/p/18215853

相关文章

  • websocket实现消息实时通信
    后端代码实现1、导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>3.2.5</version></dependency>2、创建websocket客户端对象。@Getter@Set......
  • FTP服务的拓展知识——基于centos7
     FTP(文件传输协议)是应用非常广泛的服务,配置简单,功能强大。在开始拓展知识的介绍之前先来简单的了解一下FTP的工作模式。FTP拥有两种连接方式管理接连模式:控制ftp服务(客户端使用随机高位端口,服务端使用21端口)数据连接模式:由客户端决定pas(关闭被动模式)在输入就启用——pa......
  • dot net core使用BackgroundService运行一个后台服务
    不管是在控制台程序还是asp.netcore程序中,我们经常会有用到一个需要长时间运行的后台任务的需求。通常最直觉的方式是使用Thread实例来新建一个线程,但是这样需要自行管理线程的启动和停止。在.netcore中提供了一个继承自IHostedService的基类BackgroudService能够方便地实现一......
  • Linux上搭建并使用ffmpeg(Java)
    原网址:https://blog.csdn.net/Just_do_it_HZF/article/details/136404728关于MacOs和Windows系统上使用ffmpeg就不多说了,有很多相关文章,今天给大家分享一个在Linux环境下使用Java语言来使用ffmpeg一、首先去官网下载一个Linux对应的ffmpeg包1、进入ffmpeg官网:官网2、点击左侧导......
  • 服务发现组件 Eureka 的几个主要调用过程
     前言现在流行的微服务体系结构正在改变我们构建应用程序的方式,从单一的单体服务转变为越来越小的可单独部署的服务(称为微服务),共同构成了我们的应用程序。当进行一个业务时不可避免就会存在多个服务之间调用,假如一个服务A要访问在另一台服务器部署的服务B,那么前提是服......
  • 更适合国内的远程访问方法:自建根服务器&基于节点小宝虚拟内网
    网盘限速?异地出差忘文件?出差异地办公,访问公司OA、ERP、CRM系统、文件服务器等,快速组建个人局域网,家庭影院共享,享受高质量的视听体验。等等这样的场景,稳定靠谱的远程访问能力显得就更加至关重要了。总的来说,从外网访问内网的服务大致有三种方案:1、获取公网IP+DDNS解析2、......
  • 【VMware ESXi】使用 smbiosDump 命令获取服务器硬件信息。
    ESXi5.x之前版本,通过SSH连接至ESXi主机,同常规Linux发行版一样,可以使用dmidecode命令来了解服务器的硬件信息。但在之后版本的ESXi主机上,需要使用smbiosDump命令来获取服务器硬件信息,当然运行esxcfg-info命令也可以查找主机信息,不过并没有smbiosDump命令查看方便......
  • 服务器重置实例后的部署工作
    参考:https://www.cnblogs.com/warrenwt/p/18215341(docker安装redis)因为服务器前段时间一直由木马,而且还被挖过矿,想直接重装下系统吧,顺便捋一下整个服务器需要各项配置,以下是我的整理清单使用nginx做反向代理,nginx是直接yum安装的里面docker跑了我的一个项目的两个环境,一个生产......
  • 基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务
    部署前准备:Cloudflare账号https://dash.cloudflare.com/loginCloudDNS账号https://www.cloudns.net/GitHub账号https://github.com/Harry-zklcdc/go-proxy-bingaiCloudflare部署Worker  CloudDNS获取免费二级域名 GitHubNewBingAi项目https://github.co......
  • 京准电子、NTP服务器(时间同步服务器)在煤矿自动化系统中应用
    京准电子、NTP服务器(时间同步服务器)在煤矿自动化系统中应用京准电子、NTP服务器(时间同步服务器)在煤矿自动化系统中应用京准电子科技官微——ahjzsz目前,市场上的NTP网络时间服务器鱼龙混杂,厂家良莠不齐,对此选择一家有实力的厂家及性价比高的NTP网络时间服务器厂家显得尤其重要。......