C#写一个WebService服务器

首先在NuGet中下载Fleck动态库

创建一个WebSocketHelper类

csharp 复制代码
public class WebSocketHelper
{
    //客户端url以及其对应的Socket对象字典
    IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();
    //创建一个 websocket ,0.0.0.0 为监听所有的的地址
    WebSocketServer server = new WebSocketServer("ws://127.0.0.1:50000");

    //打开连接委托
    public delegate void _OnOpen(string ip);
    public event _OnOpen OnOpen;
    //关闭连接委托
    public delegate void _OnClose(string ip);
    public event _OnClose OnClose;
    //当收到消息
    public delegate void _OnMessage(string ip, string msg);
    public event _OnMessage OnMessage;

    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        //出错后进行重启
        server.RestartAfterListenError = true;

        //开始监听
        server.Start(socket =>
        {
            //连接建立事件
            socket.OnOpen = () =>
            {
                //获取客户端网页的url
                string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                dic_Sockets.Add(clientUrl, socket);
                if (OnOpen != null) OnOpen(clientUrl);
                Console.WriteLine(DateTime.Now.ToString() + " | 服务器:和客户端:" + clientUrl + " 建立WebSock连接!");
            };

            //连接关闭事件
            socket.OnClose = () =>
            {
                string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                //如果存在这个客户端,那么对这个socket进行移除
                if (dic_Sockets.ContainsKey(clientUrl))
                {
                    dic_Sockets.Remove(clientUrl);
                    if (OnClose != null) OnClose(clientUrl);
                }
                Console.WriteLine(DateTime.Now.ToString() + " | 服务器:和客户端:" + clientUrl + " 断开WebSock连接!");
            };

            //接受客户端网页消息事件
            socket.OnMessage = message =>
            {
                string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                Receive(clientUrl, message);
                if (OnMessage != null)
                    OnMessage(clientUrl, message);
            };
        });
    }

    /// <summary>
    /// 向客户端发送消息
    /// </summary>
    /// <param name="webSocketConnection">客户端实例</param>
    /// <param name="message">消息内容</param>
    public void Send(string clientUrl, string message)
    {
        IWebSocketConnection webSocketConnection = GetUserSocketInstance(clientUrl);
        if (webSocketConnection != null)
        {
            if (webSocketConnection.IsAvailable)
            {
                webSocketConnection.Send(message);
            }
        }
    }

    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="clientUrl"></param>
    /// <param name="message"></param>
    private void Receive(string clientUrl, string message)
    {
        Console.WriteLine(DateTime.Now.ToString() + " | 服务器:【收到】来客户端:" + clientUrl + "的信息:\n" + message);
    }

    /// <summary>
    /// 获取用户实例
    /// </summary>
    /// <param name="clientUrl">用户的地址</param>
    public IWebSocketConnection GetUserSocketInstance(string clientUrl)
    {
        if (dic_Sockets.ContainsKey(clientUrl))
            return dic_Sockets[clientUrl];
        else
            return null;
    }

    /// <summary>
    /// 关闭某一个用户的连接
    /// </summary>
    /// <param name="clientUrl"></param>
    public void CloseUserConnect(string clientUrl)
    {
        IWebSocketConnection webSocketConnection = GetUserSocketInstance(clientUrl);
        if (webSocketConnection != null)
            webSocketConnection.Close();
    }

    /// <summary>
    /// 关闭与客户端的所有的连接
    /// </summary>
    public void CloseAllConnect()
    {
        foreach (var item in dic_Sockets.Values)
        {
            if (item != null)
            {
                item.Close();
            }
        }
    }

    public WebSocketHelper()
    {
        Init();
    }
}

使用方法:

csharp 复制代码
internal class Program
{
    private static List<string> IPList = new List<string>();
    private static WebSocketHelper webSocketHelpers = new WebSocketHelper();

    static void Main(string[] args)
    {
        webSocketHelpers.OnOpen += WebSocketHelper_OnOpen;
        webSocketHelpers.OnClose += WebSocketHelper_OnClose;
        webSocketHelpers.OnMessage += WebSocketHelper_OnMessage;

        Console.ReadLine();
    }


    #region WebSocket回调

    //当收到消息
    private static void WebSocketHelper_OnMessage(string ip, string msg)
    {
        for (int i = 0; i < IPList.Count; i++)
        {
            if (IPList[i] != ip)
            {
                webSocketHelpers.Send(IPList[i], msg);
            }
        }
    }

    //当客户端断开连接
    private static void WebSocketHelper_OnClose(string ip)
    {
        if (IPList.Contains(ip))
        {
            IPList.Remove(ip);
        }
    }

    //当客户端连接上服务器
    private static void WebSocketHelper_OnOpen(string ip)
    {
        if (!IPList.Contains(ip))
        {
            IPList.Add(ip);
        }
    }

    #endregion


    //转发所有客户端
    private static void Relay(string content)
    {
        if (IPList.Count == 0) return;

        for (int i = 0; i < IPList.Count; i++)
        {
            webSocketHelpers.Send(IPList[i], content);
        }
    }
}
相关推荐
慧都小妮子4 小时前
C# 实现AI合同审查:从读取、风险标注到批量签发
ai·自然语言处理·c#·.net·办公自动化·ai合同审查·文档ai代理
牛哇网络工作室19 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
zlinear数据采集卡1 天前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel1 天前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡1 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
kingwebo'sZone1 天前
C# 根据公式计算的方法
开发语言·c#
阿部多瑞 ABU1 天前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D1 天前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram2 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜2 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss