有项目用到WebSocket,但是资源有限又不能用服务器,所以 做了个简易的WebSocket通信.
本项目是用C#控制台程序实现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都能收到水平有限,代码未做深入出错处理,各位大神可帮忙测试附上代码下载地址
