前言
有项目用到WebSocket,但是资源有限又不能用服务器,所以 做了个简易的WebSocket通信.
本项目是用C#控制台程序实现WebSocket服务,非服务器实现,非服务器实现,非服务器实现
步骤
- 创建空白 控制台 程序 (不会的自行百度) .net Framework 至少需要4.0,因为需要使用到System.Net.WebSockets.WebSocket
- 创建变量
/// <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>();
- 异步监听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网址,此处可以跟据实际情况设定
- HTTP处理函数
var context = listener.EndGetContext(ar); //读取 new Task(() => ProContext(context)).Start(); //新进程处理 listener.BeginGetContext(Service, listener); //继续异步接收
- 处理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); //获取上下文
-
循环接收WS信息
wsdata = await ws.ReceiveAsync(reciveBufs, cancel); //接收数据
接收到信息后转换成字符串(跟据实际情况自行处理),然后转发给所有WS连接
Encoding.UTF8.GetString(bRec)
clients.ForEach(o => { o.SendAsync(sendBufs, WebSocketMessageType.Text, true, cancel).Wait(); // 发送给所有人 });
- 编写客户端(在此编写了控制台程序和H5网页,代码可在文末自行下载)
- 控制台客户端测试控制台客户端发送Hello world!给服务器,服务器再转发给客户端
- H5网页测试H5先连接,然后填写发送信息,点击发送后,所有连接的WS都能收到
- 水平有限,代码未做深入出错处理,各位大神可帮忙测试
- 附上代码下载地址
-