asp.net网站做为websocket服务端的应用该如何写

  最近被websocket的一个问题困扰了好久,有一个需求是在web网站中搭建websocket服务。客户端经过网页与服务器创建链接,而后服务器根据ip给客户端网页发送信息。git

  其实,这个需求并不难,只是刚开始对websocket的内容不太了解。上网搜索了一下,有经过asp.net core 实现的,有经过通常处理程序ashx文件来实现的,这些方法不能知足我当前网站的需求。github

  最后,经过fleck第三方库实现了我想要的功能。下面详细说一下个人实现过程。web

  1.下载fleck第三方库,我是经过Git下载的,源码下载json

   点击页面中的Clone or download -> Download ZIP,下载服务器

   

  下载完以后,能够查看里面的文档,具体的实现能够查看代码。websocket

 

  2.将fleck加入到本身的项目中,并对fleck进行引用。asp.net

  

 

  3.编写咱们本身的websocket类socket

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

namespace FAW.Common
{
    public class WsContext
    {
        //客户端url以及其对应的Socket对象字典
        static IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();

        public static void StartUpWs()
        {
            String ipValue = ConfigurationManager.AppSettings["WebsocketAddress"];
            //建立
            //WebSocketServer server = new WebSocketServer("ws://127.0.0.1:8819/terver");//监听全部的的地址
            WebSocketServer server = new WebSocketServer(ipValue);//监听的地址写在配置文件里
            //出错后进行重启
            server.RestartAfterListenError = true;

            //开始监听
            server.Start(socket =>
            {
                socket.OnOpen = () =>   //链接创建事件
                {
                    //获取客户端网页的url
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    dic_Sockets.Add(clientUrl, socket);
                    LogManager.WriteLog("服务器:和客户端网页:[" + 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);
                    }
                    LogManager.WriteLog("服务器:和客户端网页:[" + clientUrl + "]  断开WebSock链接!");
                };
                socket.OnMessage = message =>  //接受客户端网页消息事件
                {
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    LogManager.WriteLog("服务器:【收到】来客户端网页:" + clientUrl + "的信息:\n" + message);

                };
            });

        }

        public static void SendMsg(String ipAddress, String jsonString)
        {
            if (String.IsNullOrEmpty(jsonString))
            {
                //写日志
                LogManager.WriteLog("停止发送,向客户端发送信息为空。" );
                return;
            }
            foreach (var item in dic_Sockets.Values)
            {
                if (item.IsAvailable == true && item.ConnectionInfo.ClientIpAddress == ipAddress)
                {
                    LogManager.WriteLog("服务器: 向客户端发送信息为 " + jsonString);
                    item.Send(jsonString);
                }
            }
        }
    }
}

 

  这段代码呢,StartUpWs函数主要是创建一个websocket服务端,SendMsg函数是负责提供外部调用向指定的客户端发送内容的工做。函数

            try
            {
                String pdaIP = cameraLogic.QueryPDAIPByIP(cameraIP);
                LogManager.WriteLog("获取摄像头对应的手机机IP:" + pdaIP);
                WsContext.SendMsg(pdaIP, sendMessage);
            }
            catch (Exception ex)
            {
                LogManager.WriteLog("手动抬杆websocket异常:" + ex.Message);
            }            

  这个代码片断就是在网站中调用SendMsg函数,给指定的客户端发送数据。测试

  注意:这里要提一点,若是websocket服务的端口要提供给外网访问的话,须要将端口加入到防火墙入站规则中,而且须要作一下内外网ip和端口的映射,不然外网想访问这个服务是不能够的。

  4.接下来咱们就要将websocket添加到网站中,让它随着网站的启动而启动。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Security;
using FAW.WEB;
using FAW.Common;

namespace FAW.WEB
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // 在应用程序启动时运行的代码
            AuthConfig.RegisterOpenAuth();

            //创建websocket服务器
            WsContext.StartUpWs();
        }
        
    }
}

   这样就能够了。

  5.测试websocket服务是否可用的话,能够经过websocket在线测试的功能。这个只要百度一下,你就全知道了,很简单,这里再也不介绍。

  总结:其实websocket的操做真的不难,就是普通的http请求获得了一次升级后,创建了一个全双工的通道,能够相互发送信息。只是我在网上并无找到asp.net网站做为服务端的例子,其实须要作的只有两步:1.创建一个websocket的服务端;2.将websocket的服务端加入到Global文件中,随程序一块儿启动。我把这个分享出来,但愿能够帮助更多的人。

相关文章
相关标签/搜索