C#利用行为模式实现socket异步通讯(一)

  1. 背景
    项目中存在多个Socket,按找类型分为两类:一是条码扫描设备,第二种是输送设备。条码扫描设备负责条码采集,是允许接收数据,不存在发送数据的情况。输送设备既可以接收数据,也可以发送数据。并且,输送设备存在多种动作或者流程:入、出、盘点,每种动作对应的逻辑处理都不相同。
    同时考虑存在以后设备数量和设备类型扩展的情况,而且设备动作也会增多。
  2. 连接对象类设计
    在这里插入图片描述
    SocketClient类为抽象类,描述一个socket连接对象,每一个设备都创捷一个连接,即创建一个SocketClient类,类中包含IP、端口号、名称、编码等基本属性,并包含连接、接收、发送等方法定义。可以参考上一篇:c# Socket异步通讯
    根据两种设备类型,创建两个类ScanerSocketClient和MedicineSocketClient,全部继承SocketClient类。
 string ip;
        int port;
        string name = null;
        string code = null;

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        public DelegateMsg OnConnect;
        public DelegateMsg OnErr;

        public DelegateMsg OnSend;
        public DelegateMsg OnReceive;
        public DelegateMsg OnServerDown;

        public string Ip
        {
            get
            {
                return ip;
            }

            set
            {
                ip = value;
            }
        }

        public int Port
        {
            get
            {
                return port;
            }

            set
            {
                port = value;
            }
        }

        public string Name
        {
            get
            {
                return name;
            }

            set
            {
                name = value;
            }
        }

        public string Code
        {
            get
            {
                return code;
            }

            set
            {
                code = value;
            }
        }

        public Socket Socket
        {
            get
            {
                return socket;
            }
        }
        public void Connect()
        {
            try
            {
                socket.BeginConnect(ip, port, new AsyncCallback(ConnectCallback), socket);
            }
            catch (Exception e)
            {
                OnErr(e.Message);
            }
        }
  1. SocketCache类
    同时,为了管理连接对象,创建一个socket对象的管理类。
 public static class SocketCache
    {
        static IList<SocketClient> clientList = new List<SocketClient>();

        public static IList<SocketClient> ClientList
        {
            get
            {
                return clientList;
            }

        }

        //获得发送字符串
        public static string GetData<T>(T[] Data)
        {
            string strData = string.Empty;
            for (int i = 0; i < Data.Length; i++)
            {
                strData += Data[i].ToString() + " ";
            }
            return strData;
        }

        public static void Add(SocketClient client)
        {
            if (ClientList.Count(r => r== client) == 0)
            {
                ClientList.Add(client);
            }
        }

        public static void Remove(SocketClient client)
        {
            if (ClientList.Count(r => r == client) > 0)
            {
                ClientList.Remove(client);
            }
        }

        public static void Clear()
        {
            ClientList.Clear();
        }

        public static SocketClient GetClient(string ip)
        {
            if(ClientList.Count(r=>r.Ip == ip)>0)
            {
                return ClientList.First(r=>r.Ip==ip);
            }
            return null;
        }
         
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑吧鸟蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值