C#以太网Sockets客户端设计实现

 更新时间:2023年02月06日 14:24:42   作者:cfqq1989  
本文主要介绍了C#以太网Sockets客户端设计实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

【1】客户端对象

using System.Net;// DNS_静态对象
using System.Net.Sockets;
 
// 字段位置
private Socket socket业务;  //对象既可以当服务器,又可以当客户端
TcpListener tcpListener;   //服务器对象
TcpClient tcpClient;       //客户端对象

【2】初始化

Socket tcpClient客户端;

tcpClient客户端 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

【3】连接

 #region 连接
 
        /// <summary>
        /// 建立连接
        /// </summary>
        /// <param name="ip">IP地址</param>
        /// <param name="port">端口号</param>
        public void Connect(string ip, string port)
        {
            try
            {
                //实例化Socket
                tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
                //设置Socket属性
                tcpClient.SendTimeout = this.SendTimeOut;
 
                tcpClient.ReceiveTimeout = this.ReceiveTimeOut;
 
                //封装一个EndPoint对象
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port));
 
                //建立连接
                tcpClient.Connect(endPoint);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
 
        #endregion

【4】收发

  #region 读取并接受
 
        /// <summary>
        /// 发送并接受
        /// </summary>
        /// <param name="SendByte"></param>
        /// <returns></returns>
        public byte[] SendAndReceive(byte[] SendByte)
        {
            try
            {
                if (tcpClient.Available >= 1)//   丢弃字节
                {
                    #region 加载
                    byte[] buffer = new byte[tcpClient.Available];//准备加载
                    tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//开始加载
                    #endregion
                }
                #region 计时
                //====现在时间======================================
                str_发送后记时 = new StringBuilder(String.Format("{0,9}",
                    DateTime.Now.Second.ToString() + "s"
                    + DateTime.Now.Millisecond.ToString() + "ms:"));  //固定长度9 右对齐
                #endregion
                tcpClient.Send(SendByte);// 发送
               
                #region 委托
                if (Help_ModBus.Wt_set != null)
                {
                    Help_ModBus.Wt_set(SendByte, str_发送后记时.ToString());
                }
                #endregion
 
                return ReadMessage();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
            finally
            {
                //InteractiveLock.Leave();
            }
            return null;
        }
 
 
        /// <summary>
        /// 读取缓冲区值
        /// </summary>
        /// <returns></returns>
        private byte[] ReadMessage()
        {
            DateTime startTime = DateTime.Now;//记录开始时间
            do
            {
                if (tcpClient.Available >= 5 )//   字节
                {
                    #region 计时
                    //====现在时间======================================
                    str_发送后记时 = new StringBuilder(String.Format("{0,9}",
                        DateTime.Now.Second.ToString() + "s"
                        + DateTime.Now.Millisecond.ToString() + "ms:"));  //固定长度9 右对齐
                    #endregion
                    #region 加载
                    byte[] buffer = new byte[tcpClient.Available];//准备加载
                    tcpClient.Receive(buffer, buffer.Length, SocketFlags.None);//开始加载
                    #endregion
                    #region 委托
                    if (Help_ModBus.Wt_get != null)//委托呼叫ui
                    {
                        Help_ModBus.Wt_get(buffer, str_发送后记时.ToString());// ui显示
                    }
                    #endregion
                    return buffer;
                }
                #region 超时跳出
                if ((DateTime.Now - startTime).TotalMilliseconds > ReceiveTimeOut+500)// 超时 1.5s
                {
                    break;// 已经超时
                }
                #endregion
 
            } while (true);
            return null; // 相当失败
 
 
 
            //Thread.Sleep(ReceiveTimeOut);// 延时15ms
            //int count = tcpClient.Available;  //  字节
            //if (count == 0)
            //{
            //    return null;
            //}
            //else
            //{
            //    byte[] buffer = new byte[count];
            //    tcpClient.Receive(buffer, count, SocketFlags.None);
            //    //byte[] buffer2 = Encoding.Default.GetBytes(str_发送后记时.ToString());
            //    byte[] buffer3 = { buffer2 , buffer };
            //    //return buffer2;
            //    #region 计时
            //    //====现在时间======================================
            //    str_发送后记时 = new StringBuilder(String.Format("{0,9}",
            //        DateTime.Now.Second.ToString() + "s"
            //        + DateTime.Now.Millisecond.ToString() + "ms:"));  //固定长度9 右对齐
            //    #endregion
            //    if (Wt_get!=null)
            //    {
            //        Wt_get(buffer, str_发送后记时.ToString());
            //    }
            //    return buffer;
            //}
 
            //==================================
            //int count = tcpClient.Available;
            //int cycletimer = 0;
            //while (count == 0)
            //{
            //    count = tcpClient.Available;
            //    cycletimer++;
            //    Thread.Sleep(20);
            //    if (cycletimer > MaxCycleTimer)
            //    {
            //        break;
            //    }
            //}
            //if (count == 0)
            //{
            //    return null;
            //}
            //else
            //{
            //    byte[] buffer = new byte[count];
            //    tcpClient.Receive(buffer, count, SocketFlags.None);
            //    return buffer;
            //}
        }
        #endregion

【5】断开

 #region 断开
        /// <summary>
        /// 断开连接
        /// </summary>
        public void DisConnect()
        {
            if (tcpClient != null)
            {
                tcpClient.Close();
            }
        }
 
        #endregion

参数参考:

C#以太网Sockets服务器设计

到此这篇关于C#以太网Sockets客户端设计实现的文章就介绍到这了,更多相关C#以太网Sockets客户端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C#统计C、C++及C#程序代码行数的方法

    C#统计C、C++及C#程序代码行数的方法

    这篇文章主要介绍了C#统计C、C++及C#程序代码行数的方法,较为详细的分析了C#统计文本文件的原理与相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • winform多线程组件BackgroundWorker使用

    winform多线程组件BackgroundWorker使用

    这篇文章介绍了winform多线程组件BackgroundWorker的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 深入理解C#中的扩展方法

    深入理解C#中的扩展方法

    下面这篇文章主要给大家介绍了关于c#中扩展方法的相关资料,文中通过示例代码介绍的非常详细,供大家学习参考,感兴趣的朋友可以了解下
    2020-06-06
  • C#实现获取程序路径方法小结

    C#实现获取程序路径方法小结

    这篇文章主要介绍了C#实现获取程序路径方法,实例分析了C#获取文件路径的各种常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 详解Asp.Net MVC的Bundle捆绑

    详解Asp.Net MVC的Bundle捆绑

    这篇文章主要介绍了Asp.Net MVC的Bundle捆绑方法,具体实现方法给大家做代码整理,一起参考一下。
    2017-11-11
  • C# Guid.NewGuid获得随机数

    C# Guid.NewGuid获得随机数

    根据GUID获得种子,然后获得随机数,这个是完全随机的
    2013-04-04
  • C#难点逐个击破(7):checked与unchecked

    C#难点逐个击破(7):checked与unchecked

    checked 关键字用于对整型算术运算和转换显式启用溢出检查。
    2010-02-02
  • Unity 如何设定 Animator分割播放

    Unity 如何设定 Animator分割播放

    这篇文章主要介绍了Unity 设定 Animator分割播放的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#实现俄罗斯方块

    C#实现俄罗斯方块

    这篇文章主要为大家详细介绍了C#实现俄罗斯方块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • c# 数据库的 sql 参数封装类的编写

    c# 数据库的 sql 参数封装类的编写

    c# 数据库的 sql 参数封装类的编写...
    2007-12-12

最新评论