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);
        }
    }
}
相关推荐
如果'\'真能转义说5 小时前
OOXML 文档格式剖析:哈希、ZIP结构与识别
xml·算法·c#·哈希算法
我是唐青枫5 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
redis·缓存·c#·.net
CHANG_THE_WORLD9 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
zxbmmmmmmmmm15 小时前
在 Avalonia 中编写高性能动画
c#·xaml·avalonia·compositon
加号317 小时前
【C#】 HTTP 请求通讯实现指南
开发语言·http·c#
步步为营DotNet18 小时前
.NET 11 中 Microsoft.Extensions.AI 在智能后端推理与决策优化的应用
云原生·c#·.net
工程师00718 小时前
.NET 线程池 工作线程 扩容 + 空闲 + 回收 原理
c#·线程池·扩容·回收·空闲
njsgcs19 小时前
c# solidworks createline 拉伸发现有微小两点间隙 导致拉伸变成薄壁特征 改bug画了6个小时 解决结果
c#·bug·solidworks
时光追逐者19 小时前
一款基于 C# 开发的 Windows 10/11 系统增强工具,精简、优化、定制一站完成!
开发语言·windows·c#·.net