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);
        }
    }
}
相关推荐
人道领域2 小时前
【面试八股速通篇01】锁与并发工具
java·开发语言·面试·c#
宇卿.3 小时前
C#字段、属性、索引器、常量
开发语言·计算机视觉·c#
程序员Linc3 小时前
ONNXOCRSharp 开源手记 02|v0.4.0 PDF识别
开发语言·pdf·c#·ocr·onnxocrsharp
慧都小妮子4 小时前
MSG 附件太占内存?Aspose.Email for .NET 26.9 延迟加载
c#·.net·aspose·内存优化·延迟加载·aspose.email·附件内存
慧都小妮子4 小时前
FastReport PDF/UA 导出:让出海 PDF 满足无障碍合规要求
pdf·c#·fastreport·报表导出·pdf/ua·pdf 无障碍
淡海水8 小时前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
samble1 天前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai1 天前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面1 天前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
chingho1 天前
GitHub上这10个C#项目,不仅实用,还怪好玩的
c#·github·.net·开源项目