在大部分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);
}
},
9