在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。

引用SuperWebSocket相关组件后,在项目中添加WebSocketManager类

using SuperWebSocket;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace WebSocketDemo
{
    public static class WebSocketManager
    {

static Dictionary<string, WebSocketSession> sessionDics =

new Dictionary<string, WebSocketSession>();

static WebSocketServer webSocketServer; public static void Init() { var ip = GetLocalIP(); webSocketServer = new WebSocketServer(); var isSetup = webSocketServer.Setup(ip, 2019); Common.LogHelper.WriteError("WebSocketManager: 服务器端启动" + (isSetup ? "成功" : "失败")); if (!isSetup) return; webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected; webSocketServer.SessionClosed += WebSocketServer_SessionClosed; webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived; var isStart = webSocketServer.Start(); Common.LogHelper.WriteError("WebSocketManager: 服务器端侦听" + (isStart ? "成功" : "失败")); } /// <summary> /// 接收消息 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private static void WebSocketServer_NewMessageReceived(WebSocketSession session, string value) { Common.LogHelper.WriteError("WebSocketManager: 接收消息 \r\n" + value); if (!string.IsNullOrWhiteSpace(value)) { if (!sessionDics.ContainsKey(value)) sessionDics.Add(value, session); else sessionDics[value] = session; } } /// <summary> /// 下线 /// </summary> /// <param name="session"></param> /// <param name="value"></param>

private static void WebSocketServer_SessionClosed(WebSocketSession session,

SuperSocket.SocketBase.CloseReason value)

{

Common.LogHelper.WriteError(string.Format("WebSocketManager:{0} {1}下线",

value, session.RemoteEndPoint));

} /// <summary> /// 上线 /// </summary> /// <param name="session"></param> private static void WebSocketServer_NewSessionConnected(WebSocketSession session) { Common.LogHelper.WriteError(string.Format("WebSocketManager:{0}上线",session.RemoteEndPoint)); } /// <summary> /// 发送消息到客户端 /// </summary> /// <param name="value"></param> /// <param name="msg"></param> public static void SendMsgToRemotePoint(string value, string msg) { if (sessionDics.ContainsKey(value)) { var webSocketSession = sessionDics[value]; if (webSocketSession != null) { webSocketSession.Send(msg); } } } /// <summary> /// 获取本地IP等信息 /// </summary> /// <returns></returns> public static string GetLocalIP() { //本机IP地址 string strLocalIP = ""; //得到计算机名 string strPcName = Dns.GetHostName(); //得到本机IP地址数组 IPHostEntry ipEntry = Dns.GetHostEntry(strPcName); //遍历数组 foreach (var IPadd in ipEntry.AddressList) { //判断当前字符串是否为正确IP地址 if (IsRightIP(IPadd.ToString())) { //得到本地IP地址 strLocalIP = IPadd.ToString(); //结束循环 break; } } //返回本地IP地址 return strLocalIP; } /// <summary> /// 判断是否为正确的IP地址 /// </summary> /// <param name="strIPadd">需要判断的字符串</param> /// <returns>true = 是 false = 否</returns> private static bool IsRightIP(string strIPadd) { //利用正则表达式判断字符串是否符合IPv4格式 if (Regex.IsMatch(strIPadd, "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}")) { //根据小数点分拆字符串 string[] ips = strIPadd.Split('.'); if (ips.Length == 4 || ips.Length == 6) { //如果符合IPv4规则

if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1])

< 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256)

//正确 return true; //如果不符合 else //错误 return false; } else //错误 return false; } else //错误 return false; } } }

  在Global.asax.cs下初始化WebSocket,并启动。

public class WebApiApplication : System.Web.HttpApplication
 {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            WebSocketManager.Init();
        }
  }

  前端连接服务端WebSocket,打开网页调用此js方法,就可以和服务端建立长连接通信。

function WebSocketConnent(){
    var ip= localStorage.getItem("IP");//服务端的IP
    var openId= localStorage.getItem("kmWechatOpenId");//value
    var url="ws://"+ip+":2019";
    var ws;
    if ("WebSocket" in window) {
        ws = new WebSocket(url);
    }
    else if ("MozWebSocket" in window) {
        ws = new MozWebSocket(url);
    }
    else{
      console.log("WebSocketConnent","浏览器版本过低,请升级您的浏览器")
    }

    //注册各类回调
    ws.onopen = function () {
        ws.send(openId);//服务端WebSocketServer_NewMessageReceived 接收到消息
      console.log("WebSocketConnent","连接服务器成功");
    }

    ws.onclose = function () {
      console.log("WebSocketConnent","与服务器断开连接");
    }
    ws.onerror = function () {
      console.log("WebSocketConnent","数据传输发生错误");
    }
    ws.onmessage = function (receiveMsg) {
      localStorage.removeItem("token");//服务端SendMsgToRemotePoint 发送消息后接收

      console.log("WebSocketConnent","服务器推送过来的消息:"+receiveMsg.data);
    }
  },