Socket【C#】Demo

news/2024/10/11 22:33:16 标签: c#, 开发语言

字段:

Socket RJ45;//以太网 

属性:

 public Socket socket { get => RJ45; set => RJ45 = value; }

构造:

//实例化Socket
RJ45 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

连接:

//封装一个EndPoint对象 // ip地址,端口
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port));
try
{
    //建立连接
    RJ45.Connect(endPoint);
}
catch (Exception ex) 
{
    throw ex;
    //MessageBox.Show(ex.Message);
}//显示错误
//catch (Exception ex) {throw ex; }//显示错误

        private static Socket ConnectSocket(string server, int port)
        {
            Socket s = null;
            IPHostEntry hostEntry = null;

            // 获取主机相关信息
            hostEntry = Dns.GetHostEntry(server);

            // 循环浏览AddressList以获得受支持的AddressFamily。这是为了避免
            // 当主机IP地址与地址系列不兼容时发生的异常
            // (通常在IPv6情况下)。
            foreach (IPAddress address in hostEntry.AddressList)
            {
                IPEndPoint ipe = new IPEndPoint(address, port);
                Socket tempSocket =
                    new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                tempSocket.Connect(ipe);

                if (tempSocket.Connected)
                {
                    s = tempSocket;
                    break;
                }
                else
                {
                    continue;
                }
            }
            return s;
        }
 

SET:

        #region 只发送
        /// <summary>
        /// 只发送
        /// </summary>
        /// <param name="stringcmd"></param>
        /// <returns></returns>
        public int send(string stringcmd)
        {
            stringcmd.Replace(" ", "");//去除空白
            byte[] buffer = StringsToHexBytes(stringcmd);//准备报文  //去除空白   StringsToHexBytes
            try
            {
                RJ45.Send(buffer);// 发送
                return 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }


        #endregion
 

PUT:

        #region 发送并接收

        /// <summary>
        /// 发送并接受
        /// </summary>
        /// <param name="SendByte"></param>
        /// <returns></returns>
        public byte[] SendAndReceive(byte[] SendByte, string TXstr)
        {
            try
            {
                //丢弃字节
                if (RJ45.Available != 0)//   丢弃字节
                {
                    #region 加载
                    byte[] buffer = new byte[RJ45.Available];//准备加载
                    RJ45.Receive(buffer, buffer.Length, SocketFlags.None);//开始加载
                    #endregion
                }
                RJ45.Send(SendByte);// 发送
                //====现在时间======================================
                string ATtime = DateTime.Now.ToString("ss's'ffff:");

                #region 委托
                if (Help_ModBus.Wt_set != null)
                {
                    Help_ModBus.Wt_set(SendByte, ATtime + TXstr);
                }
                #endregion

                return ReadMessage();
            }
            catch (Exception ex)
            { 
                throw ex;
                //MessageBox.Show(ex.Message);
            }//显示错误

            return null;
        }

        /// <summary>
        /// 读取缓冲区值
        /// </summary>
        /// <returns></returns>
        private byte[] ReadMessage()
        {
            DateTime startTime = DateTime.Now;//记录开始时间
            do
            {
                if (RJ45.Available >= 5)//   字节
                {
                    #region 计时
                    //====现在时间======================================
                    ATtime = DateTime.Now.ToString("ss's'ffff:");
                    #endregion
                    #region 加载
                    byte[] buffer = new byte[RJ45.Available];//准备加载
                    RJ45.Receive(buffer, buffer.Length, SocketFlags.Peek);//开始加载
                    #endregion
                    #region 委托
                    if (Help_ModBus.Wt_get != null)//委托呼叫ui
                    {
                        Help_ModBus.Wt_get(buffer, ATtime);// ui显示
                    }
                    #endregion
                    return buffer;
                }
                #region 超时跳出
                if ((DateTime.Now - startTime).TotalMilliseconds > ReceiveTimeOut + 1500)// 超时 ___ms
                {
                    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;
            //}
        }


        /// <summary>
        /// 此方法请求指定服务器的主页内容。
        /// int port = 80;
        /// </summary>
        /// <param name="server"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public static string SocketSendReceive(string server, int port)
        {
            string request = "GET / HTTP/1.1\r\nHost: " + server +
                "\r\nConnection: Close\r\n\r\n";
            Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
            Byte[] bytesReceived = new Byte[256];
            string page = "";

            // 使用指定的服务器和端口创建套接字连接。
            using (Socket s = ConnectSocket(server, port))
            {

                if (s == null)
                    return ("连接失败");

                // 向服务器发送请求。
                s.Send(bytesSent, bytesSent.Length, 0);

                // 接收服务器主页内容。
                int bytes = 0;
                page = "Default HTML page on " + server + ":\r\n";

                // 以下内容将被阻止,直到页面被传输。
                do
                {
                    bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
                    page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
                }
                while (bytes > 0);
            }

            return page;
        }

        #endregion
 

断开:

#region 断开
/// <summary>
/// 断开连接
/// </summary>
void DisConnect()
{
    RJ45?.Close();
}

#endregion
 


http://www.niftyadmin.cn/n/5687861.html

相关文章

汽车发动机系统(ems)详细解析

汽车发动机系统EMS&#xff0c;即Engine-Management-System&#xff08;发动机管理系统&#xff09;&#xff0c;是现代汽车电子控制技术的重要组成部分。以下是对汽车发动机系统EMS的详细解析&#xff0c;内容将涵盖其定义、工作原理、主要组成、功能特点、技术发展以及市场应…

定时器定时中断定时器外部中断

基础背景&#xff1a;TIM定时中断-CSDN博客 TIM的函数 // 恢复缺省设置 void TIM_DeInit(TIM_TypeDef* TIMx); // 时基单元初始化&#xff0c;第一个参数TIMx选择某个定时器&#xff0c;第二个参数是结构体&#xff0c;包含了配置时基单元的一些参数。 void TIM_TimeBaseInit…

ArrayList的具体使用

本节目标&#xff1a; 1.简单的洗牌算法 2.杨辉三角形例题 3.消除字符串中特定字母问题 一.简单的洗牌算法 一开始先列一下我们的需求。洗牌算法需要先有牌&#xff0c;第二步进行洗牌&#xff0c;第三步发牌&#xff0c;并且将剩余牌打印&#xff0c;第四步可以让牌排个序 …

嵌入式 ADC基础知识

在现实世界中&#xff0c;常见的信号大都是模拟量&#xff0c;像温度、声音、气压等&#xff0c;但在信号的处理与传输中&#xff0c;为了减少噪声的干扰&#xff0c;较多使用的是数字量。因此我们经常会将现实中的模拟信号&#xff0c;通过 ADC 转换为数字信号进行运算、传输、…

9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解

目录 Redis入门 Redis简介 Redis服务启动与停止 服务启动命令 Redis数据类型 5种常用数据类型介绍 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis Redis的Java客户端 …

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

【Kubernetes】常见面试题汇总(四十九)

目录 110.假设一家公司希望通过采用新技术来优化其工作负载的分配。公司如何有效地实现这种资源分配&#xff1f; 111.考虑一家拼车公司希望通过同时扩展其平台来增加服务器数量。您认为公司将如何处理服务器及其安装&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【…

线程池面试集

目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…