C# websocket的使用

        实现背景:有两个设备(A跟B两个冰箱,两者都装有app),现在需要在A上面控制B进行开门。A需要调用服务器接口,然后服务器发送消息控制B开门;此处记录下服务器端实现过程。

    1,包使用的Fleck,直接去nuget里下载安装即可。

     2,【这一步可忽略不是重点】app端定死了只能是http的请求,由于各种原因(不做赘述),我们这边只能加了一个路由来重定向一下。在Global的Application_Start方法中加代码

#region 自定义路由
        //扩展自定义路由(app请求的地址格式都是 app/xxx/这种)(项目是aps.net)
        var defaults = new System.Web.Routing.RouteValueDictionary { { "Controller", "*" }, { "Action", "*" } };
        System.Web.Routing.RouteTable.Routes.MapPageRoute("CongGuiRoute", "app/{Controller}/{Action}", "~/CongGui.aspx", true, defaults);//defaults可为null
        //RouteConfig.RegisterRoutes(System.Web.Routing.RouteTable.Routes);//官方aspx路由规则
        #endregion




 //websocket,这是为了启动socket,对后面有用
            HS.Common.FleckHelper fleckHelper =  HS.Common.FleckHelper.GetFleckHelper();
            fleckHelper.StartUp();

2,创建FleckHelper帮助类(里面一些代码都没用到,用到时候再研究研究),里面的日志LogDBHelper类就不提供了,自己记录下就行了。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using Fleck;

namespace HS.Common
{
    public class FleckHelper
    {
        /*客户端保活关键词*/
        private static string FLAG = "KeepAlive";
        /*服务器返回的保活关键字*/
        private static string RETURN_FLAG = "rKeepAlive";
        //socket链接池
        private static Dictionary<string,  IWebSocketConnection> socketsPool;
        //sockets链接地址
        private static Dictionary<string, string> socketsAddress;
        //websocket服务对象
        private WebSocketServer server;
        //监控端口
        private string pointAddress;
        //单例模式锁对象
        private static object lockObj = new object();
        private static FleckHelper fleckHelper = null;


        private FleckHelper()
        {
            socketsPool = new Dictionary<string,IWebSocketConnection>();
            socketsAddress = new Dictionary<string, string>();
            pointAddress = ConfigurationManager.AppSettings["FleckWebSocketPoint"];
            server = new WebSocketServer(pointAddress);
        }

        /// <summary>
        /// 单例模式
        /// </summary>
        /// <returns></returns>
        public static FleckHelper GetFleckHelper()
        {
            if (fleckHelper == null)
            {
                lock (lockObj)
                {
                    if (fleckHelper == null)
                    {
                        fleckHelper = new FleckHelper();
                    }
                }
            }
            return fleckHelper;
        }

        /// <summary>
        /// 初始化
        /// </summary>
        public void Initialization()
        {
            socketsPool = new Dictionary<string,  IWebSocketConnection>();
            socketsAddress = new Dictionary<string, string>();
            pointAddress = ConfigurationManager.AppSettings["FleckWebSocketPoint"];
            server = new WebSocketServer(pointAddress);
        }
        
        /// <summary>
        /// 启动
        /// </summary>
        public void StartUp() {
            //出错后进行重启
            server.RestartAfterListenError = true;
            //开始监听
            server.Start(socket =>
            {
                socket.OnOpen = () =>   //连接建立事件
                {
                    //获取客户端标识
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    LogDBHelper.WriteOperatDiary("websocket", clientUrl + "建立websocket链接");
                };
                socket.OnClose = () =>  //连接关闭事件
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    LogDBHelper.WriteOperatDiary("websocket", socketsAddress[clientUrl] + "断开websocket链接,地址" + clientUrl);
                };
                socket.OnMessage = message =>  //接受客户端消息事件
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    //心跳消息
                    if (FLAG == message)
                    {
                        socket.Send(RETURN_FLAG);
                    }
                    else
                    {
                        lock (socketsPool)
                        {
                            socketsPool[message] = socket;
                        }
                        lock (socketsAddress)
                        {
                            socketsAddress[clientUrl] = message;
                        }
                        LogDBHelper.WriteOperatDiary("websocket", message + "收到信息" + message + "地址" + clientUrl);
                    }
                };
            });
        }

        /// <summary>
        /// 向客户端发送消息
        /// </summary>
        /// <param name="clientID">客户端标志</param>
        /// <param name="message">信息</param>
        public void SendMessage(string clientID, string message)
        {
            lock (socketsPool)
            {
                IWebSocketConnection socket = null;
                socketsPool.TryGetValue(clientID, out socket);
                if (socket == null)
                {
                    LogDBHelper.WriteErrorDiarylog("websocket", "websocket链接不存在!"+ clientID);
                    throw new Exception("websocket链接不存在!");

                }
                else
                {
                    socketsPool[clientID].Send(message);
                    LogDBHelper.WriteOperatDiary("websocket", clientID + "发送信息" + message);
                }
            }
        }

        /// <summary>
        /// 检查一个客户端标志是否有对应链接
        /// </summary>
        /// <param name="clientID">客户端标志</param>
        /// <returns></returns>
        public bool Exist(string clientID)
        {
            IWebSocketConnection socket = null;
            lock (socketsPool)
            {
                socketsPool.TryGetValue(clientID, out socket);
                if (socket != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// 关闭所有链接
        /// </summary>
        public void Close()
        {
            foreach (var item in socketsPool.Values)
            {
                if (item != null)
                {
                    item.Close();
                }
            }
        }
    }
}

3,调用代码:CongGui.appx.cs

using HS.Business;
using HS.Business.Cooperation;
using HS.Common;
using HS.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class app_CongGui : System.Web.UI.Page
{

     
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Clear();
        Response.ContentType = "application/json";
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
        string result = "";
//通过Global路由过来的请求
        string Controller = Page.RouteData.Values["Controller"] == null ? null : Page.RouteData.Values["Controller"].ToString();
        string Action = Page.RouteData.Values["Action"] == null ? null : Page.RouteData.Values["Action"].ToString();
        LogDBHelper.WriteServiceDiaryLog("CongGui", "从柜接口调用:" + Controller + "|" + Action);
        if (Controller == "icebox" && Action == "openDoor")
        {
            result = openDoor();
        }
         

        Response.Write(result);
        Response.End();

    }
    /// <summary>
    /// 主冰箱控制从冰箱开门 (大冰箱)
    /// </summary>
    /// <returns></returns>
    private string openDoor()
    {
        try
        {
            string iceBoxId = Context.Request["iceBoxId"].ToString();
            LogDBHelper.WriteServiceDiaryLog("openDoor", iceBoxId + "主冰箱控制从冰箱开门");
            if (string.IsNullOrEmpty(iceBoxId))
            {
                LogDBHelper.WriteErrorDiarylog("openDoor", "冰箱信息错误");
                return "冰箱信息错误!";
            }
            using (AP_Equ_IceBoxBB iceBoxBB = new AP_Equ_IceBoxBB())
            {
                var iceBox = iceBoxBB.GetModel(Convert.ToInt32(iceBoxId));
                if (iceBox == null)
                {
                    LogDBHelper.WriteErrorDiarylog("openDoor", "未找到冰箱信息");
                    return "未找到冰箱信息!";
                }
                using (DV_CompanyBB companyBB = new DV_CompanyBB())
                {
                    var company = companyBB.GetModelByCompanyId(iceBox.corpId);
                    if (company == null)
                    {
                        LogDBHelper.WriteErrorDiarylog("openDoor", "冰箱关联企业信息错误");
                        return "冰箱关联企业信息错误!";
                    }
                    //websocket发送开门信息
                    var message = new JObject();
                    message["hospitalcode"] = company.companyNo;
                    message["iceboxNo"] = iceBox.iceBoxNo;
                    message["machineCode"] = iceBox.controlBoardCode;
                    message["boxNo"] = "";
                    message["type"] = 5;
                    message["description"] = "";
                    message["data"] = null;
                    FleckHelper fleckHelper = FleckHelper.GetFleckHelper();
                    fleckHelper.SendMessage(iceBox.controlBoardCode, message.ToString());
                    //创建开锁记录
                    using (AP_OP_IceBoxLockListBB iceboxLockBB = new AP_OP_IceBoxLockListBB())
                    {
                        AP_OP_IceBoxLockListData iceboxLock = new AP_OP_IceBoxLockListData();
                        iceboxLock.iceBoxId = iceBox.id;
                        iceboxLock.freezeAreaId = 0;
                        iceboxLock.dt = DateTime.Now.ToString();
                        iceboxLock.lockState = "主冰箱控制从冰箱开门";
                        iceboxLockBB.AddRecord(iceboxLock);
                    }
                    return @"{""Desc"":""获取成功"",""Type"":0,""Code"":""0000""}";
                }
            }
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }
}

4,写在最后:这是第一次用,所以代码理解上可能偏差地方,欢迎各位指出错误以更好的更正。这里仅仅是做一个记录,方便以后翻阅。还可以看看这篇帖子网页端是如何实现的https://blog.csdn.net/weixin_46867655/article/details/106799674

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C#中的ClientWebSocket类连接WebSocket服务的基本步骤: 1. 引用命名空间System.Net.WebSockets。 2. 创建一个ClientWebSocket实例。 3. 使用ConnectAsync方法连接WebSocket服务。 4. 使用SendAsync方法发送消息到WebSocket服务。 5. 使用ReceiveAsync方法接收WebSocket服务发送的消息。 6. 使用CloseAsync方法关闭WebSocket连接。 下面是一个简单的示例代码: ```csharp using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; public class WebSocketClient { private ClientWebSocket _webSocket; public async Task ConnectAsync(Uri uri) { _webSocket = new ClientWebSocket(); await _webSocket.ConnectAsync(uri, CancellationToken.None); } public async Task SendAsync(string message) { var buffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(message)); await _webSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } public async Task<string> ReceiveAsync() { var buffer = new ArraySegment<byte>(new byte[1024]); var result = await _webSocket.ReceiveAsync(buffer, CancellationToken.None); return System.Text.Encoding.UTF8.GetString(buffer.Array, 0, result.Count); } public async Task CloseAsync() { await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); } } ``` 使用示例: ```csharp var client = new WebSocketClient(); await client.ConnectAsync(new Uri("ws://localhost:8080")); await client.SendAsync("Hello, WebSocket!"); var message = await client.ReceiveAsync(); Console.WriteLine(message); await client.CloseAsync(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值