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);
        }
    }
}
相关推荐
典典分享指南1 小时前
一品牌多产品线的 GEO 内容矩阵:从策略到落地
java·c#·bash·symfony
今夜有雨.1 小时前
C# 学习文档(零基础入门)
开发语言·学习·c#
软件黑马王子2 小时前
14.事件中心:主要作用和原理
开发语言·前端框架·c#
海盗12347 小时前
微软技术周报 2026-08-31~09-07:GPT-6 Astra 登陆 Foundry、M365 全球认证故障复盘、C# 15 封闭层级
gpt·microsoft·c#
reasonsummer8 小时前
【办公类-115-01】20260906育儿知识(家园小报)批量制作(2026年9月-2027年6月)
开发语言·数据库·c#
软件黑马王子9 小时前
13.缓存池优化:对象上限配置
开发语言·前端框架·c#
唐青枫9 小时前
C#.NET StructureMap 从依赖注入到项目实战
c#·.net
fujisheng6619 小时前
FUI 编译期装配实践:从反射注册到 Source Generator
c#·unity3d
智码看视界10 小时前
.NET 10 推理大模型TensorSharp 3.3.0 部署实测:纯.NET推理引擎反超llama.cpp 1.5倍,DFlash2提速62%
c#·.net·llama.cpp·.net 10·tensorsharp·本地大模型推理·开源推理引擎
格林威10 小时前
C# 图像异步落盘存储:基于Channel 配合 ArrayPool 实现异步落盘
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测