文章目录[x]
- 0.1:一、使用.net框架内置方法
- 0.2:二、使用Fleck
- 0.3:三、其他Websocket框架
- 0.4:四、测试
一、使用.net框架内置方法
1. 创建一个基类
using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; using System.Threading; namespace WebSockets { public class WebSocketBase { public static void Send(WebSocket ws,string content) { try { ArraySegment<byte> array = new ArraySegment<byte>(Encoding.UTF8.GetBytes(content)); var task = ws.SendAsync(array, WebSocketMessageType.Text, true, CancellationToken.None); task.Wait();//异步改成同步 } catch { ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } } public static string Receive(WebSocket ws) { try { //8kb的缓存区 byte[] b = new byte[1024 * 8]; ArraySegment<byte> buffer = new ArraySegment<byte>(b); var task = ws.ReceiveAsync(buffer, CancellationToken.None); task.Wait(); return Encoding.UTF8.GetString(buffer.Array); } catch (Exception e) { ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } return null; } } }
2.创建WebsocketService类。
using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Net.WebSockets; using System.Net; namespace WebSockets { public class MyWebSocketService:WebSocketBase { HttpListener httpListener; //客户端socket集合 public Dictionary<int, WebSocket> _clientDic = new Dictionary<int, WebSocket>(); public event EventHandler<int> OnConnect; public event EventHandler<string> DataReceive; public void Listening() { httpListener = new HttpListener(); httpListener.Prefixes.Add("http://127.0.0.1:8888/"); httpListener.Start(); Task.Run(() => { while(true) { var httpListenerContext = httpListener.GetContext(); var webSocketContext = httpListenerContext.AcceptWebSocketAsync(null); var _ws = webSocketContext.Result.WebSocket; int id = webSocketContext.Id; _clientDic.Add(id, _ws); OnConnect?.Invoke(_ws,id); Task.Run(() => { while (_ws.State == WebSocketState.Open) { DataReceive?.Invoke(_ws, Receive(_ws)); } }); } }); } public void SendMsg( WebSocket ws,string content) { Send(ws, content); } public void BroadcostMsg(string content) { foreach(var i in _clientDic) { Send(i.Value, content); } } } }
3. 创建WebsocketClient类。
using System; using System.Net.WebSockets; using System.Threading.Tasks; using System.Threading; namespace WebSockets { public class MyWebSocketClient:WebSocketBase { static ClientWebSocket _cws; public event EventHandler<string> DataReceive; public MyWebSocketClient() { _cws = new ClientWebSocket(); } public void Connect(string uriStr) { var task = _cws.ConnectAsync(new Uri(uriStr), CancellationToken.None); task.Wait(); Task.Run(() => { while(true) { string data = Receive(_cws); DataReceive?.Invoke(_cws,data); } }); } public void Close() { _cws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal close", CancellationToken.None); } public void SendMsg(string content) { Send(_cws, content); } } }
二、使用Fleck
1. 使用Nuget安装Fleck或从Github上下载源码后编译。
2. 在项目中添加引用。
3. 示例:
using System; using System.Collections.Generic; using System.Linq; using Fleck; namespace WSFramework_Fleck { class Program { static void Main(string[] args) { FleckLog.Level = LogLevel.Debug; var allSockets = new List<IWebSocketConnection>(); var server = new WebSocketServer("ws://0.0.0.0:8888"); server.Start(socket => { //客户端连接上服务端,则在socket列表添加一个客户端 socket.OnOpen = () => { Console.WriteLine("Open!"); allSockets.Add(socket); }; //客户端主动关闭,则从socket列表删除这个客户端 socket.OnClose = () => { Console.WriteLine("Close!"); allSockets.Remove(socket); }; //接收文本消息 socket.OnMessage = message => { Console.WriteLine(message); //给发送消息的客户端回复一条消息 socket.Send("Echo:" + message); }; //接收二进制消息 socket.OnBinary = b => { }; }); var input = Console.ReadLine(); //给所有客户端发送消息 while (input != "exit") { foreach (var socket in allSockets.ToList()) { socket.Send(input); } input = Console.ReadLine(); } } } }
三、其他Websocket框架
TouchSocket https://rrqm_home.gitee.io/touchsocket/
四、测试
1. 方式一 浏览器打开控制台,注入脚本。
var socket = new WebSocket("ws://172.0.0.1:8888"); socket.onopen = function(){ //打开 } socket.onmessage = function(e){ alert("收到消息:"+e.data); } socket.onclose = function(){ //关闭WebSocket } socket.onerror = function(){ //错误触发 }
2. 方式二 websocket在线测试 http://www.websocket-test.com/