• 大小: 15KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: C#
  • 标签: WebSocket  C#  

资源简介

本项目是用C#控制台程序实现服务,非服务器实现,非服务器实现,非服务器实现 TestWebSocket - 服务器程序 TestWebSocket_Client - 客户端控制台程序 Index.html - 客户端H5页面(直接双击打开即可) 博文https://blog.csdn.net/u012949563/article/details/102873181

资源截图

代码片段和文件信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;

namespace TestWebSocket
{
    class Program
    {
        /// 
        /// HTTP监听服务
        /// 

        private static HttpListener listener;
        /// 
        /// 接收数组
        /// 

        private static ArraySegment reciveBufs = new ArraySegment(new byte[0xFFFF]);
        /// 
        /// ws连接管理
        /// 

        private static List clients = new List();
        /// 
        /// 中途取消
        /// 

        private static System.Threading.CancellationToken cancel;
        static void Main(string[] args)
        {
            var cancelSource = new System.Threading.CancellationTokenSource();  //初始化中途取消实例 (可能通过这个中途取消WS)
            cancel = cancelSource.Token;
            listener = new HttpListener();      //打开HTTP服务
            listener.Prefixes.Add(“http://127.0.0.1:8080/“);  //HTTP服务网址
            listener.Start();   //开始监听HTTP
            listener.BeginGetContext(Service listener);    //异步接收
            Console.WriteLine(“WebSocket service start!“);
            while (true) //循环接收用户输入防止程序结束
            {
                var str = Console.ReadLine();   //读取一行输入
            }
        }
        /// 
        /// 异步接收(未做出错处理(try catch))
        /// 

        /// 
        private static void Service(IAsyncResult ar)
        {
            var context = listener.EndGetContext(ar);   //读取
            new Task(() => ProContext(context)).Start();    //新进程处理
            listener.BeginGetContext(Service listener);    //继续异步接收
        }
        /// 
        /// 处理ws连接
        /// 

        /// 
        private static async void ProContext(HttpListenerContext context)
        {
            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(recive

评论

共有 条评论