c# websocketServer

代码:

https://github.com/AltairCA/.netcore2.0-websocketServerExample

 

查找安装:WebSocketSharp

解析包:这个可以:

/// <summary>
/// 解析客户端发送来的数据
/// </summary>
/// <returns>The data.</returns>
/// <param name="recBytes">Rec bytes.</param>
/// <param name="length">Length.</param>
private string AnalyzeClientData (byte[] recBytes, int length)
        {
if (length < 2) {
return string.Empty;
            }

bool fin = (recBytes [0] & 0x80) == 0x80; // 1bit,1表示最后一帧  
if (!fin) {
return string.Empty;// 超过一帧暂不处理 
            }

bool mask_flag = (recBytes [1] & 0x80) == 0x80; // 是否包含掩码  
if (!mask_flag) {
return string.Empty;// 不包含掩码的暂不处理
            }

int payload_len = recBytes [1] & 0x7F; // 数据长度  

byte[] masks = new byte[4];
byte[] payload_data;

if (payload_len == 126) {
                Array.Copy (recBytes, 4, masks, 0, 4);
                payload_len = (UInt16)(recBytes [2] << 8 | recBytes [3]);
                payload_data = new byte[payload_len];
                Array.Copy (recBytes, 8, payload_data, 0, payload_len);

            } else if (payload_len == 127) {
                Array.Copy (recBytes, 10, masks, 0, 4);
byte[] uInt64Bytes = new byte[8];
for (int i = 0; i < 8; i++) {
                    uInt64Bytes [i] = recBytes [9 - i];
                }
                UInt64 len = BitConverter.ToUInt64 (uInt64Bytes, 0);

                payload_data = new byte[len];
for (UInt64 i = 0; i < len; i++) {
                    payload_data [i] = recBytes [i + 14];
                }
            } else {
                Array.Copy (recBytes, 2, masks, 0, 4);
                payload_data = new byte[payload_len];
                Array.Copy (recBytes, 6, payload_data, 0, payload_len);

            }

for (var i = 0; i < payload_len; i++) {
                payload_data [i] = (byte)(payload_data [i] ^ masks [i % 4]);
            }

return Encoding.UTF8.GetString (payload_data);
        }

这个是不是也可以:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Newtonsoft.Json;
using WebSocketSharp;
using WebSocketSharp.Server;

namespace PrintPlugin
{
    public partial class Form_Main : Form
    {
        public Form_Main()
        {
            InitializeComponent();
        }

        private void Form_Main_Load(object sender, EventArgs e)
        {
            var wssv = new WebSocketServer(54321);
            wssv.AddWebSocketService<PrintServer>("/PrintServer");//添加服务侦听,第一个是类。第二个是调用的接口
            wssv.Start();
            Console.WriteLine("打印服务运行中...");
     
           // wssv.Stop();
        }
        class PrintServer : WebSocketBehavior
        {
            static Dictionary<string, string> dClientAll = new Dictionary<string, string>();
            protected override void OnOpen()
            {
                dClientAll.Add(base.Context.SecWebSocketKey, base.Context.UserEndPoint.ToString());
                Console.WriteLine("连接打开" + dClientAll[base.Context.SecWebSocketKey] + "|" + DateTime.Now.ToString());
                base.OnOpen();
            }
            protected override void OnMessage(MessageEventArgs e)
            {
                var data = e.Data + "|" + DateTime.Now.ToString();
                Console.WriteLine("接收数据" + dClientAll[base.Context.SecWebSocketKey] + "|" + data);
                var retjson = JsonConvert.SerializeObject(new { code = 200, msg = data });
                Send(retjson);

            }
            protected override void OnClose(CloseEventArgs e)
            {
                Console.WriteLine("连接关闭" + dClientAll[base.Context.SecWebSocketKey] + "|" + DateTime.Now.ToString());
                base.OnClose(e);
            }
            protected override void OnError(ErrorEventArgs e)
            {
                Console.WriteLine("错误信息" + dClientAll[base.Context.SecWebSocketKey] + "|" + DateTime.Now.ToString());
                base.OnError(e);
            }
        }
    }
}

 

可以按照以下步骤创建一个 C# WebSocketServer 项目: 1. 创建一个新的 C# 控制台应用程序项目。 2. 添加 `System.Net.WebSockets` 命名空间。 3. 在 `Program.cs` 文件中添加以下代码: ```csharp using System; using System.Net; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace WebSocketServer { class Program { static async Task Main(string[] args) { var listener = new HttpListener(); listener.Prefixes.Add("http://localhost:8080/"); listener.Start(); Console.WriteLine("Listening..."); while (true) { var context = await listener.GetContextAsync(); if (context.Request.IsWebSocketRequest) { ProcessWebSocketRequest(context); } else { context.Response.StatusCode = 400; context.Response.Close(); } } } static async void ProcessWebSocketRequest(HttpListenerContext context) { try { var webSocket = await context.AcceptWebSocketAsync(subProtocol: null); Console.WriteLine("WebSocket connected"); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = null; while (webSocket.State == WebSocketState.Open) { result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Text) { var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"Received message: {message}"); var responseBytes = System.Text.Encoding.UTF8.GetBytes($"Echo: {message}"); await webSocket.SendAsync(new ArraySegment<byte>(responseBytes), WebSocketMessageType.Text, true, CancellationToken.None); } else if (result.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); Console.WriteLine("WebSocket closed"); } } } catch (Exception ex) { Console.WriteLine($"WebSocket error: {ex.Message}"); } } } } ``` 4. 运行程序,WebSocket 服务器将在 `http://localhost:8080/` 上监听连接请求。当客户端连接时,服务器将打印一条消息并开始接收客户端发送的消息。当接收到消息时,服务器将打印消息内容并将其回显给客户端。客户端可以通过发送 `Close` 消息来关闭 WebSocket 连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值