栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C#网络通讯01

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#网络通讯01

C#网络通讯编写 网络通讯分为UDP和TCP,两者具体的差异在于TCP是是通过三次握手连接的,UDP是一个只管发,一个只管收。具体差别可以去百度查询看看。 通讯连接:

1、首先要确定好,Socket连接需要的参数

public class NetworkPortBaseDal
    {
        /// 
        /// ip
        /// 
        public string ip { get; set; }
        /// 
        /// 端口
        /// 
        public int port { get; set; }
        /// 
        /// 返回结果
        /// 
        public string Res { get; set; }
        /// 
        /// 发送的指令
        /// 
        public byte[] Cmd { get; set; }
        /// 
        /// 接收的超时时间
        /// 
        public int ReceiveTimeout { get; set; }
        /// 
        /// 发送的超时时间
        /// 
        public int SendTimeout { get; set; }
    }

确定好参数后,就需要构思如何进行连接,这里我们可以申明一个abstract(抽象类),便于后续类继承,所有的Socket都需要连接,我们把它直接写到抽象类中,其中NetworkPortParam是上面的参数,通过构造函数进行赋值,Conn进行连接,ReadData是一个抽象函数,后续继承的类需要对其完善。

    public abstract class NetworkPortBase
    {
        public NetworkPortBaseDal NetworkPortParam;
        /// 
        /// socket对象
        /// 
        protected Socket socket { get; set; }
        /// 
        /// 构造函数
        /// 
        /// 
        /// 
        /// 
        protected NetworkPortBase(NetworkPortBaseDal NetworkParam)
        {
            try
            {
                NetworkPortParam = new NetworkPortBaseDal()
                {
                    ip = NetworkParam.ip,
                    port = NetworkParam.port,
                    Cmd = NetworkParam.Cmd,
                    ReceiveTimeout = NetworkParam.ReceiveTimeout,
                    SendTimeout = NetworkParam.SendTimeout
                };
            }
            catch 
            {
            }
            
        }
        /// 
        /// 连接tcp
        /// 
        /// 
        /// 
        protected bool Conn(ref string exceptionMessage)
        {
            try
            {
                if (this.socket != null)
                {
                    this.socket.Close();
                    this.socket.Dispose();
                }
                this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse(NetworkPortParam.ip), NetworkPortParam.port);
                this.socket.ReceiveTimeout = NetworkPortParam.ReceiveTimeout;
                this.socket.SendTimeout = NetworkPortParam.SendTimeout;
                this.socket.Connect(ipPort);
                return true;
            }
            catch (Exception ex)
            {
                exceptionMessage = ex.Message;
                return false;
            }

        }
        /// 
        /// 读取数据2
        /// 
        /// 
        /// 
        public abstract bool ReadData(string msg, ref string exceptionMessage);

    }

接着我们构造派生类 这里使用的例子是扫码枪,大家可根据自己实际需要发送的指令进行更改。
其中对ReadData进行了重写,NetworkPortParam.Res获得返回的数据

    public class SRScan : NetworkPortBase
    {
        /// 
        /// 构造函数
        /// 
        /// 
        /// 
        protected internal SRScan(NetworkPortBaseDal SRNetworkParam):base(SRNetworkParam)
        {
        }
        public override bool ReadData(string msg,ref string exceptionMessage)
        {
            try
            {
                NetworkPortParam.Res = "ERROR";
                if (socket == null || socket.Connected == false)
                {
                    if (this.Conn(ref exceptionMessage))
                    {
                        exceptionMessage = "扫码枪重连成功";
                    }
                    else
                    {
                        exceptionMessage = "扫码枪重连失败请检查:" + exceptionMessage;
                        return false;
                    }
                }
                socket.Send(msg);
                byte[] buffer = new byte[1024];
                int bufferLenght =socket.Receive(buffer);
                string temp_Res_Sn = Encoding.Default.GetString(buffer, 0, bufferLenght).Replace("r", "");
                NetworkPortParam.Res = temp_Res_Sn.Replace("n", "");
                socket.Close();
                return true;
            }
            catch (Exception ex)
            {
                exceptionMessage = ex.Message;
                Logging.NetworkLog("扫码失败rn" + ex.Message);
                try
                {
                    if (socket != null && socket.Connected)
                    {
                        socket.Send(NetworkPortParam.Cmd2);
                        byte[] buffer = new byte[1024];
                        int bufferLenght = socket.Receive(buffer);
                        NetworkPortParam.Res = "ERROR";
                        exceptionMessage += "扫码超时";
                    }
                }
                catch
                {

                }

                return false;
            }
        }
        /// 
        /// 不使用,只实现抽象函数的重构
        /// 
        /// 
        /// 
        public override bool ReadData(string msg, ref string errMsg)
        {
            return false;
        }
        /// 
        /// 设计着玩,不使用
        /// 
        public void Destroy()
        {
            socket.Close();
            NetworkPortBaseFactory.Destroy(this);
        }
    }

到这里基本就算完成了,不过为了以后方便,我们可以再建立一个工厂,首先申明一个枚举

public enum NetworkPortBaseEnum
    {
        SRScan,
        PrinterEquipment,
        GT2Object
    }

接着创建工厂

 public static NetworkPortBase Greate(NetworkPortBaseEnum networkEnum,NetworkPortBaseDal NetworkParam)
            {
                NetworkPortBase objectr;
                switch (networkEnum)
                {                
                    case NetworkPortBaseEnum.SRScan:
                        objectr = new SRScan(NetworkParam);
                        break;
                    case NetworkPortBaseEnum.PrinterEquipment:
                        objectr = new PrinterEquipment(NetworkParam);
                        break;
                    case NetworkPortBaseEnum.GT2Object:
                        objectr = new GT2Object(NetworkParam);
                        break;
                    default:
                        objectr = new ObjectNetwork(NetworkParam);
                        break;
                }
                return objectr;
            }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号