.Net Core 使用WebSocket

public class WebSocketXX 
    {
        static private log4net.ILog log = log4net.LogManager.GetLogger(typeof(WebSocketXX ));  //日志 没用就删了
 
        WebSocket socket;
        WebSocketXX(WebSocket socket)
        {
            this.socket = socket;
        }
 
        /// <summary>
        /// 创建链接
        /// </summary>
        /// <param name="httpContext"></param>
        /// <param name=""></param>
        /// <returns></returns>
        private static async Task Acceptor(Microsoft.AspNetCore.Http.HttpContext httpContext, Func<Task> n)
        {
 
            if (!httpContext.WebSockets.IsWebSocketRequest)
                return;
            var socket = await httpContext.WebSockets.AcceptWebSocketAsync();
 
            var result = await RecvAsync(socket, CancellationToken.None);
 
        }
 
        /// <summary>
        /// 接收客户端数据
        /// </summary>
        /// <param name="webSocket">webSocket 对象</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task<string> RecvAsync(WebSocket webSocket, CancellationToken cancellationToken)
        {
            int isFirst = 0;
            string oldRequestParam = "";
            WebSocketReceiveResult result;
            do
            {
                var ms = new MemoryStream();
                var buffer = new ArraySegment<byte>(new byte[1024 * 8]);
                result = await webSocket.ReceiveAsync(buffer, cancellationToken);
                if (result.MessageType.ToString() == "Close")
                {
                    break;
                }
                ms.Write(buffer.Array, buffer.Offset, result.Count - buffer.Offset);
                ms.Seek(0, SeekOrigin.Begin);
                var reader = new StreamReader(ms);
                var s = reader.ReadToEnd();
                reader.Dispose();
                ms.Dispose();
                if (!string.IsNullOrEmpty(s))
                {
                    
                    await SendAsync(s, webSocket);
                }
                oldRequestParam = s;
                
            } while (result.EndOfMessage);
 
            return "";
        }
        /// <summary>
        /// 向客户端发送数据 
        /// </summary>
        /// <param name="msg">数据</param>
        /// <param name="webSocket">socket对象  sleep 心跳周期</param>
        /// <returns></returns>
        public static async Task SendAsync(string msg, WebSocket webSocket)
        {
            try
            {
                
                
 
                //业务逻辑
                CancellationToken cancellation = default(CancellationToken);
                var buf = Encoding.UTF8.GetBytes(结果信息。。。);
                var segment = new ArraySegment<byte>(buf);
                await webSocket.SendAsync(segment, WebSocketMessageType.Text, true, cancellation);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
        }
 
        /// 路由绑定处理
        /// </summary>
        /// <param name="app"></param>
        public static void Map(IApplicationBuilder app)
        {
            app.UseWebSockets();
            app.Use(WebSocketXX.Acceptor);
        }
    }

创建 WebSocketXX

修改 Startup.csConfigure方法

app.Map("/WebSocketXX", Controllers.DataAnalysis.WebSocketXX.Map); 

前端JS

var socket;
var uri = “ws://192.168.1.250:8090+ "/WebSocketXX";
var output;
var text = { 'State': 0 };
 
$(function () {
    //if (socket.readyState === 1) {
    //    doclose();
    //}
 
    load_init();
});

function load_init() {
    socket = new WebSocket(uri); 
 
    setTimeout(function () {
        console.log(socket.readyState);
        socket.send(JSON.stringify(text));//发送
        //doSend();
    }, 1000);
    //doSend();
}
//接受 
function write(s) {
    //console.log(s);
    if (socket.readyState === 1) {
        socket.send(JSON.stringify(text));
    } else {
        //do something
    }
}
 
function doConnect() {
    //alert(2);
    socket.onopen = function (e) { write("opened " + uri); };
    socket.onclose = function (e) { doConnect(); };
    socket.onmessage = function (e) { write(e.data); };
    socket.onerror = function (e) { console.log(e); write("Error: " + e.data); };
}
 
function doSend() {
    //添加事件监听
    socket.addEventListener('open', function () {
        //write("Sending: " + text);
        socket.send(JSON.stringify(text));
    });
}
function onInit() {
    output = document.getElementById("output");
    doConnect();
}
 
function doclose() {
    socket.onclose = function (e) {
        console.log(e);
        socket.close(); //关闭TCP连接
    }
}
window.onload = onInit;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 .NET Core 可以很方便地实现 WebSocket 通信,以下是一个简单的示例: 1. 创建 WebSocket 控制器 在 .NET Core 中,可以通过继承 `Microsoft.AspNetCore.Mvc.ControllerBase` 来创建控制器。我们可以创建一个 `WebSocketController`,代码如下: ```csharp using Microsoft.AspNetCore.Mvc; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace YourNamespace.Controllers { [ApiController] [Route("[controller]")] public class WebSocketController : ControllerBase { private readonly WebSocketManager _webSocketManager; public WebSocketController(WebSocketManager webSocketManager) { _webSocketManager = webSocketManager; } [HttpGet("{id}")] public async Task Get(string id) { if (HttpContext.WebSockets.IsWebSocketRequest) { var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); _webSocketManager.AddSocket(id, webSocket); await Receive(webSocket, async (result, buffer) => { if (result.MessageType == WebSocketMessageType.Text) { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); await _webSocketManager.SendMessageAsync(id, message); } else if (result.MessageType == WebSocketMessageType.Close) { await _webSocketManager.RemoveSocketAsync(id); } }); } else { HttpContext.Response.StatusCode = 400; } } private async Task Receive(WebSocket webSocket, Action<WebSocketReceiveResult, byte[]> handleMessage) { var buffer = new byte[1024 * 4]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); handleMessage(result, buffer); } } } } ``` 在上面的代码中,我们首先判断 HTTP 请求是否是 WebSocket 请求,如果是,则接受 WebSocket 连接,并将 WebSocket 加入到 `WebSocketManager` 中。然后,我们使用 `Receive` 方法处理接收到的消息,并使用 `SendMessageAsync` 方法发送消息给客户端。如果收到关闭消息,我们将 WebSocket 从 `WebSocketManager` 中移除。 2. 创建 WebSocket 管理器 我们需要一个 WebSocket 管理器来管理所有的 WebSocket 连接。我们可以创建一个 `WebSocketManager` 类,代码如下: ```csharp using System.Collections.Concurrent; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; namespace YourNamespace { public class WebSocketManager { private readonly ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>(); public void AddSocket(string id, WebSocket socket) { _sockets.TryAdd(id, socket); } public async Task SendMessageAsync(string id, string message) { if (_sockets.TryGetValue(id, out WebSocket socket)) { var bytes = Encoding.UTF8.GetBytes(message); await socket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None); } } public async Task RemoveSocketAsync(string id) { _sockets.TryRemove(id, out WebSocket socket); await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by the WebSocketManager", CancellationToken.None); } } } ``` 在上面的代码中,我们使用 `ConcurrentDictionary` 来存储所有的 WebSocket 连接。我们提供了 `AddSocket` 方法来添加 WebSocket 连接,`SendMessageAsync` 方法来发送消息给指定的 WebSocket 连接,`RemoveSocketAsync` 方法来移除指定的 WebSocket 连接。 3. 注册 WebSocket 控制器和 WebSocket 管理器 最后,我们需要在 `Startup.cs` 中注册 WebSocket 控制器和 WebSocket 管理器,代码如下: ```csharp using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; namespace YourNamespace { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddSingleton<WebSocketManager>(); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } } ``` 在上面的代码中,我们首先注册 `WebSocketManager` 类型的单例依赖,然后使用 `AddControllers` 方法来注册控制器。最后,我们使用 `MapControllers` 方法将控制器映射到路由。 现在,我们可以使用浏览器或其他 WebSocket 客户端连接到 `/WebSocket/{id}` 路径,并发送和接收消息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值