Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」

WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」

作者头像
Java架构师必看
发布于 2022-10-04 06:04:25
发布于 2022-10-04 06:04:25
42800
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」,希望能够帮助大家进步!!!

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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服务侦听地址失败");
      else
        SetMessage("ChatWebSocket 设置WebSocket服务侦听地址成功");

      if (!ws.Start())
        SetMessage("ChatWebSocket 启动WebSocket服务侦听失败");
      else
        SetMessage("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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
此代码由Java架构师必看网-架构君整理
<!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 socket
                ws = new WebSocket("ws://192.168.1.106:3310/");
                console.log("Ln 13 readyState " + ws.readyState);
                switch (ws.readyState) {
                    case WebSocket.CONNECTING:
                        // do something
                        console.log("Ln 17 WebSocket.CONNECTING");
                        break;
                    case WebSocket.OPEN:
                        // do something
                        console.log("Ln 21 WebSocket.OPEN");
                        break;
                    case WebSocket.CLOSING:
                        // do something
                        console.log("Ln 25 WebSocket.CLOSING");
                        break;
                    case WebSocket.CLOSED:
                        // do something
                        console.log("Ln 29 WebSocket.CLOSED");
                        break;
                    default:
                        // this never happens
                        break;
                }
                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 event
                    console.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 event
                    console.log("Ln 85 addEventListener error")
                });
            }
            else {
                // The browser doesn't support WebSocket
                alert("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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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服务侦听地址失败");
      else
        SetMessage("ChatWebSocket 设置WebSocket服务侦听地址成功");

      if (!ws.Start())
        SetMessage("ChatWebSocket 启动WebSocket服务侦听失败");
      else
        SetMessage("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)
    { }
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-012,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
websocket即时通讯
websocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
全栈程序员站长
2022/09/15
2.3K0
websocket即时通讯
SpringBoot3-整合WebSocket
WebSocket 是一种网络通信协议,提供全双工通信通道,使服务器可以主动向客户端推送数据。与传统的 HTTP 请求-响应模式不同,WebSocket 在建立连接后,允许服务器和客户端之间进行双向实时通信。
CoderJia
2024/12/16
3520
SpringBoot3-整合WebSocket
一起来学SpringBoot | 第二十五篇:打造属于你的聊天室(WebSocket)
WebSocket 是 HTML5 新增的一种在单个 TCP 连接上进行全双工通讯的协议,与 HTTP 协议没有太大关系....
battcn
2018/08/03
1.4K1
一起来学SpringBoot | 第二十五篇:打造属于你的聊天室(WebSocket)
Spring和WebSocket整合详解(建立Web聊天室)
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
品茗IT
2019/09/12
5.1K0
传统@ServerEndpoint方式开发WebSocket应用和SpringBoot构建WebSocket应用程序
通过websocket的两种使用方式,让你更加深入理解用法。很多人不懂websocket怎么辨别是谁发送过来的,文中说到实现WebSocketConfigurer接口,定义拦截器可以绑定用户信息,还有其他很多,细细品,对比看比较好!
java思维导图
2020/05/20
9.4K0
【WebSocket探秘】解锁 WebSocket:开启实时交互新境界
在传统服务器开发中,一问一答模式是一种常见且基础的交互方式,主要基于 HTTP 协议进行通信。这种模式下,客户端和服务器之间的交互流程较为清晰,每次交互都包含一个明确的请求和对应的响应。
用户11288949
2025/02/10
1390
【WebSocket探秘】解锁 WebSocket:开启实时交互新境界
使用SpringBoot + WebSocket实现单人聊天
在做之前,不管在界面布局,还是功能实现方面都下了一点功夫,最终还是一点点实现了,现在就记录一下。
全栈开发Dream
2021/06/08
2.3K0
使用SpringBoot + WebSocket实现单人聊天
SuperSocket.WebSocket 摸索记录
文档:http://docs.supersocket.net/v1-6/zh-CN
申君健
2018/09/21
2.5K0
从零开始,手把手教你实现基于 Websocket 的微服务
Websocket 协议是为了解决 HTTP 协议缺陷而产生的一种通信协议,它能够在客户端和服务器之间建立持久性的连接,并且允许双向通信。
青山师
2023/05/05
1.1K0
实现websocket的两种方式
1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket
凯哥Java
2019/06/28
2K0
结合WebSocket和Openlayers4实现地图内容的刷新
本文讲述如何结合WebSocket和Openlayers4实现地图内容的实时刷新。
牛老师讲GIS
2018/10/23
9440
结合WebSocket和Openlayers4实现地图内容的刷新
spring-websocket实现聊天室功能
最近看到有些人的博客中有聊天室的功能所以我也在我博客中写了一个,不过他们用的是java原生的,这里我使用了spring封装的spring-websocket
用户10136162
2022/11/15
8070
spring-websocket实现聊天室功能
SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
品茗IT
2020/05/28
1.1K0
Spring整合WebSocket
WebSocket,干什么用的?我们有了HTTP,为什么还要用WebSocket?很多同学都会有这样的疑问。我们先来看一个场景,大家的手机里都有微信,在微信中,只要有新的消息,这个联系人的前面就会有一个红点,这个需求要怎么实现呢?大家思考3秒钟。哈哈,最简单,最笨的方法就行客户端轮询,在微信的客户端每隔一段时间(比如:1s或者2s),向服务端发送一个请求,查询是否有新的消息,如果有消息就显示红点。这种方法是不是太笨了呢?每次都要客户端去发起请求,难道就不能从服务端发起请求吗?这样客户端不就省事了吗。再看看股票软件,每个股票的当前价格都是实时的,这我们怎么做,每个一秒请求后台查询当前股票的价格吗?这样效率也太低了吧,而且时效性也很低。这就需要我们今天的主角WebSocket去实现了。
小忽悠
2020/08/31
7820
Spring整合WebSocket
Spring消息之WebSocket
一、WebSocket简介     WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。     WebSocket 的由来?众所周知,HTTP协议有“无连接”、“不可靠”、“尽最大努力”的特点。WebSocket的出现可以看成是HTTP协议为了支持长连接所打的一个大补丁。首先,由 IETF 制定发布了WebSocket 协议。后来,HTML5为了在Web端支持WebSocket
JMCui
2018/06/14
1.1K0
WebSocket 教程 转
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
wuweixiang
2018/08/14
5250
WebSocket 教程
                                                                            转
Socket、Http、WebSocket?强大的Netty几行语句就帮你实现!
Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
品茗IT
2019/09/12
3.3K0
socket系列(三)——Spring-socket实时通信、推送
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
7230
socket系列(三)——Spring-socket实时通信、推送
resin4.0.44+websocket 实现私信功能服务端消息推送
最近项目开发中,碰到一个新的开发需求——私信功能。 项目要求:类似微博中发送私信功能,给对方发送一条私信消息,如果对方在线就立马接受到消息提示,并显示到页面上。如果对方不在线,则下次登录以后,显示消息
哎_小羊
2018/01/02
1.9K0
webSocket和EventSource的区别
WebSocket和EventSource是两种在Web应用程序中用于实现实时通信的不同技术。WebSocket是一种双向通信协议,允许服务器与客户端建立持久性连接并通过该连接发送消息。而EventSource是一种服务器推送技术,只允许服务器向客户端发送消息,而不允许客户端向服务器发送消息。 在下面的描述中,我将详细介绍WebSocket和EventSource的不同之处,并提供一些代码示例。
世间万物皆对象
2024/03/20
4050
相关推荐
websocket即时通讯
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验