C#简易WebSocket通信(非服务器实现)

前言

有项目用到WebSocket,但是资源有限又不能用服务器,所以 做了个简易的WebSocket通信.

 本项目是用C#控制台程序实现WebSocket服务,非服务器实现,非服务器实现,非服务器实现 

步骤

  1. 创建空白 控制台 程序 (不会的自行百度) .net Framework 至少需要4.0,因为需要使用到System.Net.WebSockets.WebSocket
  2. 创建变量
            /// <summary>
            /// HTTP监听服务
            /// </summary>
            private static HttpListener listener;
            /// <summary>
            /// 接收数组
            /// </summary>
            private static ArraySegment<byte> reciveBufs = new ArraySegment<byte>(new byte[0xFFFF]);
            /// <summary>
            /// ws连接管理
            /// </summary>
            private static List<WebSocket> clients = new List<WebSocket>();

     

  3. 异步监听HTTP 
                listener = new HttpListener();      //打开HTTP服务
                listener.Prefixes.Add("http://127.0.0.1:8080/");  //HTTP服务网址
                listener.Start();   //开始监听HTTP
                listener.BeginGetContext(Service, listener);    //异步接收
    

    使用 127.0.0.1:8080网址,此处可以跟据实际情况设定

  4. HTTP处理函数
                var context = listener.EndGetContext(ar);   //读取
                new Task(() => ProContext(context)).Start();    //新进程处理
                listener.BeginGetContext(Service, listener);    //继续异步接收

     

  5. 处理WS连接函数
                var wsContext = await context.AcceptWebSocketAsync(null);   //获取上下文
                Console.WriteLine($"{DateTime.Now} - {context.Request.RemoteEndPoint} - WebSocket conected!");  //显示有WS连接 (WS来者不据,可在此通过IP等筛选连接)
                using (var ws = wsContext.WebSocket)    //使用using保证WS得到释放
                {
                    clients.Add(ws);    //管理WS连接 
                    WebSocketReceiveResult wsdata; //接收结果变量
                    while (true)
                    {
                        try
                        {
                            wsdata = await ws.ReceiveAsync(reciveBufs, cancel); //接收数据
                        }
                        catch {//接收失败,退出连接
                            Console.WriteLine($"{DateTime.Now} - {context.Request.RemoteEndPoint} - out!");
                            clients.Remove(ws); //管理ws连接
                            break;
                        }
                        byte[] bRec = new byte[wsdata.Count];   //接收数组
                        Array.Copy(reciveBufs.Array, bRec, wsdata.Count);   //保存接收数组
                        var sendStr = $"{context.Request.RemoteEndPoint} - {Encoding.UTF8.GetString(bRec)}"; //连接成String字符串
                        Console.WriteLine($"{DateTime.Now} - {sendStr}");   //显示
                        var sendBufs = new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendStr)); //转换成需要发送给所有人的发送数组
                        clients.ForEach(o =>
                        {
                            o.SendAsync(sendBufs, WebSocketMessageType.Text, true, cancel).Wait();  //  发送给所有人
                        });
                    }
                    clients.Remove(ws);
                }

    获取到HTTP连接后,提出WS

    var wsContext = await context.AcceptWebSocketAsync(null);   //获取上下文

     

  6. 循环接收WS信息

    wsdata = await ws.ReceiveAsync(reciveBufs, cancel); //接收数据

    接收到信息后转换成字符串(跟据实际情况自行处理),然后转发给所有WS连接

    Encoding.UTF8.GetString(bRec)
     clients.ForEach(o =>
                        {
                            o.SendAsync(sendBufs, WebSocketMessageType.Text, true, cancel).Wait();  //  发送给所有人
                        });

     

  7. 编写客户端(在此编写了控制台程序和H5网页,代码可在文末自行下载)
  8. 控制台客户端测试控制台客户端发送Hello world!给服务器,服务器再转发给客户端
  9. H5网页测试H5先连接,然后填写发送信息,点击发送后,所有连接的WS都能收到
  10. 水平有限,代码未做深入出错处理,各位大神可帮忙测试
  11. 附上代码下载地址
  12.  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章