ASP.NET Core 中的 WebSocket 支持
WebSocket
WebSocket 测试工具

1、WebSocket 属性
Socket.readyState 属性
CONNECTING      值为0,表示正在连接。
OPEN                    值为1,表示连接成功,可以通信了。
CLOSING              值为2,表示连接正在关闭。
CLOSED               值为3,表示连接已经关闭,或者打开连接失败。

2、WebSocket 事件
open           Socket.onopen         连接建立时触发
message    Socket.onmessage   客户端接收服务端数据时触发
error           Socket.onerror          通信发生错误时触发
close          Socket.onclose         连接关闭时触发
addEventListener          socket.addEventListener('open', function (event) {});          事件监听器
*
*
*
*
3、WebSocket 方法
Socket.send()   使用连接发送数据
Socket.close()  关闭连接


*
*
*、WebSocketServerForm.cs
管理 NuGet 程序包:SuperWebSocketNETServer

using SuperWebSocket;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WebSocket.Windows
{public partial class WebSocketServerForm : Form{WebSocketServer ws;//缓冲字节数组byte[] buffer = new byte[2048];string ipAddress_Connect;string ipAddress_Close;string ipAddress_Receive;//存储session和对应ip端口号的泛型集合Dictionary<string, WebSocketSession> socketSessionList = new Dictionary<string, WebSocketSession>();public WebSocketServerForm(){InitializeComponent();}private void WebSocketServerForm_Load(object sender, EventArgs e){ }private void Start_Click(object sender, EventArgs e){ws = new WebSocketServer();if (!ws.Setup(int.Parse(txtPort.Text)))SetMessage("ChatWebSocket 设置WebSocket服务侦听地址失败");elseSetMessage("ChatWebSocket 设置WebSocket服务侦听地址成功");if (!ws.Start())SetMessage("ChatWebSocket 启动WebSocket服务侦听失败");elseSetMessage("ChatWebSocket 启动WebSocket服务侦听成功");ws.NewSessionConnected += Ws_NewSessionConnected;ws.NewMessageReceived += Ws_NewMessageReceived;ws.SessionClosed += Ws_SessionClosed;}private void btnStop_Click(object sender, EventArgs e){ws.Stop();}private void btnClear_Click(object sender, EventArgs e){txtMsg.Text = "";}private void btnSendMsg_Click(object sender, EventArgs e){//从客户端列获取想要发送数据的客户端的ip和端口号,然后从sessionList中获取对应session然后调用send()发送数据if (cmb_socketlist.Items.Count != 0){if (cmb_socketlist.SelectedItem == null){MessageBox.Show("请选择一个客户端发送数据!");return;}else{//sessionList[cmb_socketlist.SelectedItem.ToString()].Send(txtSendMsg.Text);socketSessionList[cmb_socketlist.SelectedItem.ToString()].Send(txtSendMsg.Text);}}else{SetMessage("当前没有正在连接的客户端!");}txtSendMsg.Clear();}private void btnSign_Click(object sender, EventArgs e){ }void Ws_NewSessionConnected(WebSocketSession session){try{string message = string.Format("New Session Connected:{0}, Path:{1}, Host:{2}, IP:{3}",session.SessionID.ToString(), session.Path, session.Host, session.RemoteEndPoint);ipAddress_Connect = session.RemoteEndPoint.ToString();ComboboxHandle(ipAddress_Connect, OperateType.Add);socketSessionList.Add(ipAddress_Connect, session);SetMessage($"Ws {ipAddress_Connect} 已连接! {message}");}catch (Exception e){}}void Ws_NewMessageReceived(WebSocketSession session, string value){if (value.ToString().Equals("IsHere**"))//客户端定时发送心跳,维持链接return;SetMessage($"{DateTime.Now} 收到 {session.SessionID} {value}");}void Ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value){string message = string.Format("Session Close:{0}, Path:{1}, IP:{2}", value.ToString(), session.Path, session.RemoteEndPoint);ipAddress_Close = session.RemoteEndPoint.ToString();socketSessionList.Remove(ipAddress_Connect);SetMessage($"{ipAddress_Close} 已关闭连接! {message}");}private void ComboboxHandle(string ipAddress, OperateType operateType){if (operateType == OperateType.Add){cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Add(ipAddress); }));}if (operateType == OperateType.Remove){cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Remove(ipAddress); }));}}private void SetMessage(string str){txtMsg.Invoke(new Action(() => { txtMsg.AppendText(str + "\r\n"); }));}enum OperateType{Add = 1,  //添加Remove = 2  //移除}}
}

*、WebSoket.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title></title><script type="text/javascript">var ws;function WebSocketTest() {if ("WebSocket" in window) {console.log("WebSocket is supported by your Browser!");// Let us open a web socketws = new WebSocket("ws://192.168.1.106:3310/");console.log("Ln 13 readyState " + ws.readyState);switch (ws.readyState) {case WebSocket.CONNECTING:// do somethingconsole.log("Ln 17 WebSocket.CONNECTING");break;case WebSocket.OPEN:// do somethingconsole.log("Ln 21 WebSocket.OPEN");break;case WebSocket.CLOSING:// do somethingconsole.log("Ln 25 WebSocket.CLOSING");break;case WebSocket.CLOSED:// do somethingconsole.log("Ln 29 WebSocket.CLOSED");break;default:// this never happensbreak;}ws.onopen = function () {// Web Socket is connected, send data using send()console.log("Ln 37 readyState open");console.log("Ln 38 readyState " + ws.readyState);ws.send("Hello WebSocket");console.log("Ln 40 onopen Message is sent");};ws.onmessage = function (evt) {if (typeof evt.data === String) {console.log("Ln 44 Received data string");}if (evt.data instanceof ArrayBuffer) {var buffer = event.data;console.log("Ln 49 Received arraybuffer");}console.log(evt.data);var received_msg = evt.data;console.log("Ln 53 onmessage Message is received: " + received_msg);};ws.onclose = function (e) {//当客户端收到服务端发送的关闭连接请求时,触发onclose事件console.log("Ln 57 onclose");}//ws.error = function () {//    alert("Error Happended");//};ws.onerror = function (e) {//如果出现连接、处理、接收、发送数据失败的时候触发onerror事件console.log(e);console.log("Ln 65 onerror");}ws.addEventListener('open', function (event) {ws.send('Hello Server!');console.log("Ln 69 addEventListener open");});ws.addEventListener("close", function (event) {var code = event.code;var reason = event.reason;var wasClean = event.wasClean;// handle close eventconsole.log("Ln 76 addEventListener close");});ws.addEventListener("message", function (event) {var data = event.data;// 处理数据console.log("Ln 81 addEventListener message");});ws.addEventListener("error", function (event) {// handle error eventconsole.log("Ln 85 addEventListener error")});}else {// The browser doesn't support WebSocketalert("WebSocket NOT supported by your Browser!");}}function send() {ws.send(document.getElementById("txtMessage").value);}</script>
</head>
<body><a href="javascript:WebSocketTest()">Run WebSocket</a><br /><input type="text" id="txtMessage" /><input type="button" value="发送" onclick="send()" />
</body>
</html>

*、托盘服务
添加 System.Windows.Forms.NotifyIcon 控件
窗体 Activated 事件【激活事件】
窗体 SizeChanged 事件【尺寸改变事件】
NotifyIcon 控件 DoubleClick 事件【】
NotifyIcon 控件 Icon图标

*、TrayForm.cs

using Newtonsoft.Json;
using SuperWebSocket;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Windows.Forms;namespace Tray.Windows
{public partial class TrayForm : Form{WebSocketServer ws;//缓冲字节数组byte[] buffer = new byte[2048];string ipAddress_Connect;string ipAddress_Close;//存储session和对应ip端口号的泛型集合Dictionary<string, WebSocketSession> socketSessionList = new Dictionary<string, WebSocketSession>();public TrayForm(){InitializeComponent();}private void TrayForm_Load(object sender, EventArgs e){ws = new WebSocketServer();string ip = ConfigurationManager.AppSettings["WebSocketIp"];string port = ConfigurationManager.AppSettings["WebSocketPort"];if (!ws.Setup(ip, int.Parse(port)))SetMessage("ChatWebSocket 设置WebSocket服务侦听地址失败");elseSetMessage("ChatWebSocket 设置WebSocket服务侦听地址成功");if (!ws.Start())SetMessage("ChatWebSocket 启动WebSocket服务侦听失败");elseSetMessage("ChatWebSocket 启动WebSocket服务侦听成功");ws.NewSessionConnected += Ws_NewSessionConnected;ws.NewMessageReceived += Ws_NewMessageReceived;ws.SessionClosed += Ws_SessionClosed;#region 定时任务System.Timers.Timer timer = new System.Timers.Timer();timer.Enabled = true;timer.Interval = Convert.ToInt32(interval);//执行间隔时间,单位为毫秒  timer.Start();timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed);#endregion}/// <summary>/// 窗体 激活事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TrayForm_Activated(object sender, EventArgs e){///不能弹出窗体,始终在托盘显示//this.Visible = false;}/// <summary>/// 窗体 尺寸改变事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TrayForm_SizeChanged(object sender, EventArgs e){if (this.WindowState == FormWindowState.Minimized) //判断是否最小化{this.ShowInTaskbar = false; //不显示在系统任务栏notifyIcon1.Visible = true; //托盘图标可见}}/// <summary>/// notify 双击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void notifyIcon1_DoubleClick(object sender, EventArgs e){if (this.WindowState == FormWindowState.Minimized){this.ShowInTaskbar = true; //显示在系统任务栏this.WindowState = FormWindowState.Normal; //还原窗体notifyIcon1.Visible = false; //托盘图标隐藏}}void Ws_NewSessionConnected(WebSocketSession session){try{string message = string.Format("New Session Connected:{0}, Path:{1}, Host:{2}, IP:{3}",session.SessionID.ToString(), session.Path, session.Host, session.RemoteEndPoint);ipAddress_Connect = session.RemoteEndPoint.ToString();socketSessionList.Add(ipAddress_Connect, session);SetMessage($"Ws {ipAddress_Connect} 已连接! {message}");}catch (Exception e){}}void Ws_NewMessageReceived(WebSocketSession session, string value){if (value.ToString().Equals("IsHere**"))//客户端定时发送心跳,维持链接return;session.Send(JsonConvert.SerializeObject(new { code = "200", message = "abcd" }));SetMessage($"{DateTime.Now} 收到 {session.SessionID} {value}");}void Ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value){string message = string.Format("Session Close:{0}, Path:{1}, IP:{2}", value.ToString(), session.Path, session.RemoteEndPoint);ipAddress_Close = session.RemoteEndPoint.ToString();socketSessionList.Remove(ipAddress_Connect);SetMessage($"{ipAddress_Close} 已关闭连接! {message}");}private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e){Invoke(new MethodInvoker(delegate (){this.WindowState = FormWindowState.Minimized;this.ShowInTaskbar = false; //不显示在系统任务栏notifyIcon1.Visible = true; //托盘图标可见lblLoading.Visible = false;btnOpen.Visible = true;}));}private void SetMessage(string str){ }}
}

*
*
*

WebSocket 托盘服务 NotifyIcon 通知栏 Windows Forms相关推荐

  1. 使用C#创建Windows服务 并发布Windows 服务

    一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 二.创建Windows Servic ...

  2. 通过增强的 Windows Forms 支持为 .NET 应用程序精心制作华丽的 UI

    本文将介绍以下内容: • Windows Forms 控件的新增功能 • 设置和资源管理 • 布局.调整大小和缩放 • 数据绑定 • ClickOnce 部署 本文涉及以下技术: Windows Fo ...

  3. Neodynamic Barcode Professional for Windows Forms 14.0

    Neodynamic Barcode Professional for Windows Forms是一个可视化的 .NET 条码控件,允许您使用 VB.NET 或 C# 在 Windows Forms ...

  4. (C#)安全、简单的Windows Forms多线程编程 (一)

    (C#)安全.简单的Windows Forms多线程编程  (一) Chris Sells June 28, 2002 翻译:袁晓辉 www.farproc.com farproc#AT#gmail# ...

  5. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  6. 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)

    WebSocket协议是基于TCP的一种新的网络协议.WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. ...

  7. Spread for Windows Forms高级主题(3)---单元格的编辑模式

    理解单元格的编辑模式 通常情况下,当终端用户双击单元格时,编辑控件将允许用户在该单元格中输入内容.在一个单元格中编辑的能力被称为编辑模式.一些属性和方法可以用来自定义编辑模式的使用. 当一个单元格处于 ...

  8. System.Windows.Forms.Timer在线程中的注意事项

    在WinForm中使用System.Windows.Forms.Timer对象,如果是在单线程中使用,则直接设置该对象的Enabled属性值即可启动计时器,但如果是在多线程窗体中在多线程引发的事件中调 ...

  9. Spread for Windows Forms高级主题(5)---数据处理

    2019独角兽企业重金招聘Python工程师标准>>> 使用表单的API处理数据 你可以将数据以有格式或无格式字符串或者数据对象的形式填充到单元格中.将数据填充到单元格的最好方式取决 ...

最新文章

  1. BH60绝对位置编码器测试
  2. 试题以文件的形式存在C语言,2016年计算机二级C语言上机题库
  3. - (NSString *)description
  4. sqlserver生成脚本
  5. 营销大数据分析 关键技术_营销分析的3个最关键技能
  6. tpm php,TPM系列
  7. windows下面使用nssm设置新的服务实现开机自启等
  8. 软件测试之软件开发模型
  9. android 实现代码混淆
  10. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
  11. Hadoop学习之hadoop安装、JDK安装、集群启动(完全分布式)
  12. 电脑通过android手机上网
  13. python货币转化为资本的前提_Python与《资本论》:生产资本中劳动力 A 与生产资料 Pm 的配比关系...
  14. python爬取有声小说_python写的有声小说爬虫
  15. 【配准】2020年“基于深度学习的医学影像配准”期刊论文速览(PR,TMI,MIA)
  16. 微信小程序 表情小作坊 — 轻松定制表情包
  17. M1芯片真正原生版本photoshop 2021安装 PS2021 Mac版 附详细教程!再无需rosetta转译!!
  18. 利用词向量计算上下位关系
  19. Invalid drive错误的解决方案
  20. 为什么采用实时操作系统?

热门文章

  1. 【实验五 一维数组】7-3 sdut-C语言实验-区间之和
  2. 如何给驱动程序签名?怎么做微软WHQL认证?
  3. 数据库第十一次作业--视图的应用
  4. 将json对象转换为数组,获取json对象的属性值
  5. ESP32-C3通过MQTT协议把温湿度上传到阿里云物联网平台
  6. excel基础函数之逻辑函数
  7. display的各种属性
  8. [LeetCode]682. 棒球比赛(Baseball Game)Java
  9. Latex报错:xxxx.sty文件不存在解决方案
  10. 钉钉低代码是什么,能干什么?