一直好奇,所以简单总结一下
WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:
- WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;
- WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。
WebSocket 的实现分为客户端和服务端两部分,客户端(通常为浏览器)发出 WebSocket 连接请求,服务端响应,实现类似 TCP 握手的动作,从而在浏览器客户端和 WebSocket 服务端之间形成一条 HTTP 长连接快速通道。两者之间后续进行直接的数据互相传送,不再需要发起连接和相应。
PS:一开始一直按照教程用.net core 2.0 调试,但是到json解析这一步报错,说版本不匹配。到存储过程执行这一步,直接没有 SqlParameter[]。直接不会了,只好,重新创建了一个控制台程序,然后手工引入Fleck组件,然后把前面的代码复制过来,json就用以前的办法,存储过程也用SqlParameter[],直接正常执行,那就好,总算可以随便使用了。
服务端
using Fleck;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace web_socket{ class Program { //客户端url以及其对应的Socket对象字典 private static IDictionarydic_Sockets = new Dictionary (); static void Main(string[] args) { //创建 WebSocketServer server = new WebSocketServer("ws://192.168.3.95:1235") { //出错后进行重启 RestartAfterListenError = true };//监听所有的的地址 //开始监听 server.Start(socket => { socket.OnOpen = () => //连接建立事件 { //获取客户端网页的url string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort; dic_Sockets.Add(clientUrl, socket); Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端网页:" + clientUrl + " 建立WebSock连接!"); }; socket.OnClose = () => //连接关闭事件 { string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort; //如果存在这个客户端,那么对这个socket进行移除 if (dic_Sockets.ContainsKey(clientUrl)) { //注:Fleck中有释放 //关闭对象连接 //if (dic_Sockets[clientUrl] != null) //{ //dic_Sockets[clientUrl].Close(); //} dic_Sockets.Remove(clientUrl); } Console.WriteLine(DateTime.Now.ToString() + "|服务器:和客户端网页:" + clientUrl + " 断开WebSock连接!"); }; socket.OnMessage = message => //接受客户端网页消息事件 { string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort; Console.WriteLine(DateTime.Now.ToString() + "|服务器:【收到】来客户端网页:" + clientUrl + "的信息:\n" + message); string res = ""; res = websocket.BaseClass.SelectMethod.GetResult(message); //根据消息返回各种业务 if (res != "") { socket.Send(res); } else { socket.Send("你好" + clientUrl + ",我已经收到你的消息!"); } }; }); //放个计时器,进行任务轮询 Timer t = new Timer(10000); t.Enabled = true; t.Elapsed += T_Elapsed; Console.ReadKey(); foreach (var item in dic_Sockets.Values) { if (item.IsAvailable == true) { item.Send("服务器消息:" + DateTime.Now.ToString()); } } Console.ReadKey(); //关闭与客户端的所有的连接 foreach (var item in dic_Sockets.Values) { if (item != null) { item.Close(); } } Console.ReadKey(); } private static void T_Elapsed(object sender, ElapsedEventArgs e) { Console.WriteLine("hello timer! 2秒一次"); foreach (var item in dic_Sockets) { //这里做主动业务 Console.WriteLine("链接:{0},对象:{1}", item.Key, item.Value); } } }}
客户端
WebSocket测试 WebSocket测试
By:haojun
服务端直接生成exe程序,启动结果如下
客户端运行结果
和服务器断开连接web_socket.html:52 尝试重新连接服务器......web_socket.html:54 状态:true 连接服务器失败,5秒后尝试......web_socket.html:33 已经打开连接!web_socket.html:45 {"status":"1","msg":"OK","result":"{"data":{"status":"1","message":"","allpage":"2","pagelength":"8","data":[{"id":"10","card_no":"12BOuU5qs/MI+lz+sCejM94/WHsQdIW72Q2002","card_money":"200.00","create_date":"2019-02-16 11:22:03","create_user":"测试","sell_flag":"预销售","sell_date":"1900-01-01 00:00:00","update_user":"测试","sys_date":"2019-02-16 11:22:03.280"},{"id":"9","card_no":"12BOuU5qs/MI+lz+sCejM94/WHsQdIW72Q2001","card_money":"200.00","create_date":"2019-02-16 11:21:57","create_user":"测试","sell_flag":"预销售","sell_date":"2019-02-18 15:20:50","update_user":"测试","sys_date":"2019-02-16 11:21:57.143"},{"id":"8","card_no":"12BOuU5qs/MI+lz+sCejM94/WHsQdIW72Q2007","card_money":"700.00","create_date":"2019-02-16 11:21:48","create_user":"测试","sell_flag":"预销售","sell_date":"1900-01-01 00:00:00","update_user":"测试","sys_date":"2019-02-16 11:21:48.590"},{"id":"7","card_no":"12BOuU5qs/MI+lz+sCejM94/WHsQdIW72Q2006","card_money":"502.00","create_date":"2019-02-16 11:21:01","create_user":"测试","sell_flag":"已销售","sell_date":"2019-02-20 16:45:31","update_user":"测试","sys_date":"2019-02-18 15:27:24.923"},{"id":"6","card_no":"12BOuU5qs/MI+lz+sCejM94/WHsQdIW72Q2005","card_money":"500.00","create_date":"2019-02-16 11:19:22","create_user":"测试","sell_flag":"已销售","sell_date":"2019-02-20 16:45:26","update_user":"测试","sys_date":"2019-02-20 16:45:13.107"},{"id":"5","card_no":"12BOuU5qs/MI/m1qmoIH6gZg==9013","card_money":"204.00","create_date":"2019-02-16 11:18:55","create_user":"测试","sell_flag":"待命","sell_date":"2019-02-18 15:30:50","update_user":"测试","sys_date":"2019-02-18 15:26:06.367"},{"id":"4","card_no":"12BOuU5qs/MI96TMhSb7BMFXLCf3UTQ8Q+6666","card_money":"600.00","create_date":"2019-02-16 11:18:23","create_user":"测试","sell_flag":"待命","sell_date":"1900-01-01 00:00:00","update_user":"测试","sys_date":"2019-02-16 11:18:23.607"},{"id":"3","card_no":"12BOuU5qs/MI9TNLZSde8dypYcdUpqwlux2155","card_money":"300.00","create_date":"2019-02-16 11:17:29","create_user":"测试","sell_flag":"预销售","sell_date":"1900-01-01 00:00:00","update_user":"测试","sys_date":"2019-02-18 15:18:26.960"}]}}"}
官方 https://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/
大神 阮一峰 http://www.ruanyifeng.com/blog/2017/05/websocket.html
.net core2.0 官方: https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-build?tabs=netcore2x
.net core2.0 是什么:https://blog.csdn.net/QingHeShiJiYuan/article/details/78184543
.net core2.0 打包: http://www.cnblogs.com/TianFang/p/8370804.html