首页 > 其他分享 >socket

socket

时间:2024-11-06 18:31:22浏览次数:1  
标签:webSocket socket await socketId var string

public class WebSocketController : ControllerBase
{
    private readonly WebSocketManager _webSocketManager;

    public WebSocketController(WebSocketManager webSocketManager)
    {
        _webSocketManager = webSocketManager;
    }

    [Route("/ws")]
    public async Task Get(string name)
    {
        if (HttpContext.WebSockets.IsWebSocketRequest)
        {
            var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
            await _webSocketManager.AddWebSocketAsync(webSocket, name);
        }
        else
        {
            HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
        }
    }
}

public class WebSocketManager
{
    private ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>();
    private ConcurrentDictionary<string, string> _socketNames = new ConcurrentDictionary<string, string>();

    public async Task AddWebSocketAsync(WebSocket webSocket, string name)
    {
        var socketId = Guid.NewGuid().ToString();
        _sockets.TryAdd(socketId, webSocket);
        _socketNames.TryAdd(socketId, name);

        await HandleWebSocketAsync(socketId);
    }

    public async Task SendMessageAsync(string name, string message)
    {
        foreach(var socket in _socketNames)
        {
            var socketId = socket.Key;
            if (socketId != null && socket.Value!=name && _sockets.TryGetValue(socketId, out var webSocket))
            {
                var buffer = Encoding.UTF8.GetBytes(message);
                await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
    }

    private async Task HandleWebSocketAsync(string socketId)
    {
        var webSocket = _sockets[socketId];
        var buffer = new byte[1024 * 4];
        WebSocketReceiveResult receiveResult;

        do
        {
            receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            string message = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);

            if (!string.IsNullOrEmpty(message))
            {
                await SendMessageToOthersAsync(socketId, message);
            }
        }
        while (!receiveResult.CloseStatus.HasValue);

        await webSocket.CloseAsync(receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription, CancellationToken.None);
        _sockets.TryRemove(socketId, out _);
        _socketNames.TryRemove(socketId, out _);
    }

    private async Task SendMessageToOthersAsync(string senderSocketId, string message)
    {
        foreach (var socket in _sockets.Where(x => x.Key != senderSocketId))
        {
            if (socket.Value.State == WebSocketState.Open)
            {
                var buffer = Encoding.UTF8.GetBytes(message);
                await socket.Value.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
    }
}

  

标签:webSocket,socket,await,socketId,var,string
From: https://www.cnblogs.com/liuqijun/p/18530793

相关文章

  • Python socket传输图像文件
    客户端发送图像文件importsocketdata=numpy.frombuffer(stringData,numpy.uint8)#将获取到的字符流数据转换成1维数组#decimg=cv2.imdecode(data,cv2.COLOR_BGR2GRAY)#将数组解码成图像#cv2.imwrite("./test.jpg",decimg)#imencode()将图片格式转换(编码)成流数据,......
  • 实时金融股票数据API接口websocket接入方法
    一、使用websocket的协议提升传输速度实时金融股票数据对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票类数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。这种接入方法具有多个优势。......
  • websocket用法
    WebSocket是一种在客户端和服务器之间建立持久化连接的协议,允许双向通信。它适用于实时应用程序,如聊天应用、在线游戏或实时数据流。以下是WebSocket在Vue.js中的基本用法:1.建立WebSocket连接首先,创建WebSocket连接:constsocket=newWebSocket('ws://your-server-u......
  • Socket编程与IO多路复用
    0、引言本篇博客将从socket模型为起点,引入IO多路复用的学习。1、Socket模型1.1、Socket的诞生Socket的诞生背景:Socket最早出现在20实际80年代的Unix操作系统中,当时计算机和网络技术逐步发展,分布式计算开始流行,操作系统需要提供一种标准化的网络通信方式来连接不同的设备。这......
  • WebSocket 及时通信 - 2024最新版前端秋招面试短期突击面试题【100道】
    WebSocket及时通信-2024最新版前端秋招面试短期突击面试题【100道】......
  • 【Linux 25】网络套接字 socket 概念
    文章目录......
  • Websocket整合实现聊天操作
    在实际开发中,尤其是web开发,我该如何做才可以实现消息或者数据的实时更新呢。这里我为大家介绍,websocket长连接,它可以简历连接,且创建一个通道,通道中的数据可以实时更新。废话不多说,接下来我将使用vue+springboot基于websocket来实现一个简单的聊天实现。vue前端代码,这里主要......
  • 如何使用Socket.io
    为了实现实时通讯,Socket.io是一个广受欢迎的JavaScript库。以下步骤将指导您如何使用Socket.io:1.安装并设置;2.创建服务器端连接;3.创建客户端连接;4.发送和接收消息;5.了解事件和消息的处理。首先,您需要在项目中安装Socket.io。1.安装并设置Socket.io可以很容易地通过npm或yarn进......
  • WebSocket详解:从前端到后端的全栈理解
    文章目录前言一、WebSocket简介1.1WebSocket的特点二、WebSocket的工作原理2.1握手过程2.2数据传输三、WebSocket在前端的应用四、WebSocket在后端的应用五、WebSocket的局限与解决方案结语前言随着互联网技术的发展,传统的HTTP协议在某些场景下的局限性逐渐显......
  • 如何使用WebSockets在网页应用中实现实时通信
    摘要:实现网页应用中的实时通信,1、选择合适的WebSockets库以简化实施过程;2、在服务器端与客户端建立WebSocket连接;3、设计有效的消息协议;4、确保通信安全性;5、处理网络问题和重连机制。其中选择合适的WebSockets库是基础。它能够帮助开发者快速构建实时通信功能,如Socket.IO、Web......