C# 多个 socket 当做变量保存

在C#中,可以使用字典(Dictionary)来保存多个Socket对象,其中键(Key)可以是一个标识符,而值(Value)就是Socket对象。以下是一个简单的例子:

using System;
using System.Collections.Generic;
using System.Net.Sockets;
 
public class SocketManager
{
        public static Dictionary<string, Socket> _sockets = new Dictionary<string, Socket>();//key是Socket的名称,value是Socket
        /// <summary>
        /// 添加Socket
        /// </summary>
        /// <param name="id">Key</param>
        /// <param name="socket">Value</param>
        /// <exception cref="ArgumentNullException"></exception>
        public static void AddSocket(string id, Socket socket)
        {
            if (socket != null)
            {
                RemoveSocket(id);//移除同Key的Value
                _sockets[id] = socket;//添加
            }
        }
        /// <summary>
        /// 获取Socket
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static Socket GetSocket(string id)
        {
            if (_sockets.TryGetValue(id, out Socket socket))
                return socket;
            return null;
        }
        /// <summary>
        /// 移除Socket
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool RemoveSocket(string id)
        {
            return _sockets.Remove(id);
        }
}
 
// 使用SocketManager的例子
var socketManager = new SocketManager();
socketManager.AddSocket("socket1", new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp));
socketManager.AddSocket("socket2", new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp));
 
// 获取并使用一个Socket
Socket socket = socketManager.GetSocket("socket1");
// ... 对socket进行操作 ...
 
// 移除一个Socket
socketManager.RemoveSocket("socket2");

在这个例子中,SocketManager 类管理了一个字典 _sockets,用于存储不同的Socket对象。通过 AddSocket 方法添加新的Socket,GetSocket 方法获取指定ID的Socket,RemoveSocket 方法移除指定ID的Socket。使用字典的好处是可以快速通过ID访问或者移除Socket对象。


    public static List<SocketClass> socketList = new List<SocketClass>();//全局变量

    /// <summary>
    /// 添加Socket
    /// </summary>
    /// <param name="Socket"></param>
    /// <param name="CustomCode"></param>
    /// <param name="EquipCodeEnum"></param>
    public static void AddSocket(Socket Socket, string CustomCode, EquipCodeEnum EquipCodeEnum)
    {
        SocketClass modle = new SocketClass();
        modle.Socket = Socket;
        modle.CustomCode = CustomCode;
        modle.EquipCodeEnum = EquipCodeEnum;

        RemoveSocketList(modle.CustomCode);//移除旧的??需要吗??
        socketList.Add(modle);//添加新的Socket(主要是更新端口号)
    }
    public static void RemoveSocketList(string customCode)
    {
        if (socketList != null && socketList.Any() && socketList.Count > 0)
        {
            var b = socketList.RemoveAll(a => a.CustomCode == customCode);//移除旧的socket
        }

    }

    public static bool RemoveSocketList(Socket socket)
    {
        if (socketList != null && socketList.Any() && socketList.Count > 0)
        {
            var b = socketList.RemoveAll(a => a.Socket.RemoteEndPoint == socket.RemoteEndPoint);//移除旧的socket
            if (b > 0)
            {
                Console.WriteLine($"Socket{socket.RemoteEndPoint.ToString()},被移除,第{GetLineNum()}行...");
                return true;
            }
        }
        return false;
    }

    /// <summary>
    /// 获取指定的Socket
    /// 唯一
    /// </summary>
    /// <param name="customCode">设备自定义编码</param>
    /// <param name="equipCodeEnum">设备类型</param>
    /// <returns></returns>
    public static Socket GetSocket(string customCode, EquipCodeEnum equipCodeEnum)
    {
        var entity = socketList.Where(a => a.CustomCode == customCode && a.EquipCodeEnum == equipCodeEnum).FirstOrDefault();
        if (entity != null)
        {
            return entity.Socket;
        }
        return null;
    }

    /// <summary>
    /// 获取指定的Socket List 
    /// 不唯一
    /// </summary>
    /// <param name="equipCodeEnum">设备类型</param>
    /// <returns></returns>
    public static List<Socket> GetSocketList(EquipCodeEnum equipCodeEnum)
    {
        List<Socket> sockets = new List<Socket>();

        if (socketList != null && socketList.Any() && socketList.Count > 0)
        {
            var list = socketList.Where(a => a.EquipCodeEnum == equipCodeEnum).ToList();//根据 
            if (list != null && list.Any() && list.Count > 0)
            {
                foreach (var item in list)
                {
                    sockets.Add(item.Socket);
                }
            }
        }
        return sockets;
    }

    /// <summary>
    /// 获取指定的SocketClass List
    /// 不唯一
    /// </summary>
    /// <param name="equipCodeEnum"></param>
    /// <returns></returns>
    public static List<SocketClass> GetSocketClassList(EquipCodeEnum equipCodeEnum)
    {
        var list = socketList.Where(a => a.EquipCodeEnum == equipCodeEnum).ToList();//根据 

        return list;
    }

    /// <summary>
    /// 判断当前Socket是来自哪个设备:
    /// TH70M | S7020
    /// </summary>
    /// <param name="send"></param>
    /// <returns></returns>
    public static string GetSocketEquipCode(Socket send)
    {
        var entity = socketList.Where(a => a.Socket == send).FirstOrDefault();
        if (entity != null)
        {
            return entity.EquipCodeEnum.ToString();
        }
        return "";
    }

    /// <summary>
    /// 断点打这里看Socket
    /// </summary>
    /// <returns></returns>
    public static List<SocketClass> GetSocketAll()
    {
        return socketList;//全局变量
    }

    /// <summary>
    /// 打印socketList
    /// </summary>
    public static void SocketCheck()
    {
        int index = 0;
        foreach (var _s in socketList)
        {
            Console.WriteLine($"Socket列表[{index++}]:{_s.Socket.RemoteEndPoint.ToString()},设备自定义编码:{_s.CustomCode},设备类型:{_s.EquipCodeEnum.ToString()},第{GetLineNum()}行...");//查看已添加的Socket
        }
    }

        /// <summary>
        /// 取得当前源码的哪一行
        /// </summary>
        /// <returns></returns>
        public static int GetLineNum()
        {
            System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1, true);
            return st.GetFrame(0).GetFileLineNumber();
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值