老乡zx 2023-11-06 08:29 采纳率: 0%
浏览 4

关于c#sokect通信的问题:LogUtil.Logger.Error("Connection failed: " + e.Message)

关于c#和plc这方面的问题,这段代码是一个接收硬件按钮后,网络控制器会主动推送数据过来,为什么这段代码在过一段时间后就收不到硬件推送的消息了,是代码有问题,还是硬件的问题呢


        static Socket tj10clientSocket = null;
private static void ConnectToServer()
        {
            while (true)
            {
                try
                {
                    string serverIP = "192.168.0.18";
                    if (ConfigUtil.device_no.IndexOf("PM") == 0)
                    {
                        serverIP = "192.168.2.18";
                    }
                    int serverPort = 50000;//按钮开关设备端口号

                    tj10clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
                    tj10clientSocket.Connect(serverEndPoint);
                    LogUtil.Logger.Info("Connected to server at " + serverEndPoint);

                    // Start a background thread for receiving messages
                    Thread receiveThread = new Thread(tj10ReceiveMessages);
                    receiveThread.IsBackground = true;
                    receiveThread.Start();

                    openSemaphore();
                    break; // Break the loop if connected successfully
                }
                catch (Exception e)
                {
                    LogUtil.Logger.Error("Connection failed: " + e.Message);
                    Thread.Sleep(5000); // Wait for 5 seconds before attempting reconnection
                }
            }
        }

        private static void tj10ReceiveMessages()
        {
            byte[] buffer = new byte[1024];
            while (true)
            {
                try
                {
                    int bytesRead = 0;
                      bytesRead = tj10clientSocket.Receive(buffer);
                    string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    if (bytesRead > 5 && buffer[5] == 1)
                    {
                        openGreenLight();
                        bool mesRet = HttpUtil.PostCuttingBordToMes();
                        Thread.Sleep(5000);
                        closeGreenLight();
                        if (!mesRet)
                        {
                            Thread.Sleep(500);
                            openYellowLight();
                            Thread.Sleep(5000);
                            closeYellowLight();
                        }
                        LogUtil.Logger.Info("科星切板成功");
                    }
                }
                catch (Exception e)
                {
                    LogUtil.Logger.Error("Connection lost: " + e.Message);
                        tj10clientSocket.Close();
                    ConnectToServer(); // Attempt to reconnect
                    break;
                }
            }
        }



        public static void openGreenLight()
        {
            try
            {
                    if (tj10clientSocket.Connected)
                    {
                        // 要发送的字节数组
                        byte[] dataToSend = new byte[] { 0xCC, 0xDD, 0xA1, 0x01, 0x00, 0x01, 0x00, 0x01, 0xA4, 0x48 };
                        tj10clientSocket.Send(dataToSend);
                    }
            }
            catch (Exception e)
            {
                LogUtil.Logger.Error("异常信息:"+e.ToString());
            }
        }

        public static void openSemaphore()
        {
            try
            {
                    if (tj10clientSocket.Connected)
                    {
                        // 要发送的字节数组
                        byte[] dataToSend = new byte[] { 0x55, 0xAA, 0x66, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x55 };

                        tj10clientSocket.Send(dataToSend);
                    }
            }
            catch (Exception e)
            {
                LogUtil.Logger.Error("异常信息:" + e.ToString());
            }
        }


        public static void closeGreenLight()
        {
            try
            {
                    if (tj10clientSocket.Connected)
                    {
                        // 要发送的字节数组
                        byte[] dataToSend = new byte[] { 0xCC, 0xDD, 0xA1, 0x01, 0x00, 0x00, 0x00, 0x01, 0xA3, 0x46 };
                        tj10clientSocket.Send(dataToSend);
                    }
            }
            catch (Exception e)
            {
                LogUtil.Logger.Error("异常信息:" + e.ToString());
            }
        }


        public static void openYellowLight()
        {
            try
            {
                    if (tj10clientSocket.Connected)
                    {
                        // 要发送的字节数组
                        byte[] dataToSend = new byte[] { 0xCC, 0xDD, 0xA1, 0x01, 0x00, 0x02, 0x00, 0x02, 0xA6, 0x4C };
                        tj10clientSocket.Send(dataToSend);
                    }
            }
            catch (Exception e)
            {
                LogUtil.Logger.Error("异常信息:" + e.ToString());
            }
        }

        public static void closeYellowLight()
        {
            try
            {
                    if (tj10clientSocket.Connected)
                    {
                        // 要发送的字节数组
                        byte[] dataToSend = new byte[] { 0xCC, 0xDD, 0xA1, 0x01, 0x00, 0x00, 0x00, 0x02, 0xA4, 0x48 };
                        tj10clientSocket.Send(dataToSend);
                    }
            }
            catch (Exception e)
            {
                LogUtil.Logger.Error("异常信息:" + e.ToString());
            }
        }

  • 写回答

2条回答 默认 最新

  • wanghui0380 2023-11-06 08:42
    关注

    string message = Encoding.UTF8.GetString(buffer, 0, bytesRead)

    打印他看看,网络编程入门。Stream流是连续不断的流,不是一顿一顿,一卡一卡的数据包。他并不保证每次就刚好一包
    所以if (bytesRead > 5 && buffer[5] == 1) 是不靠谱的凭运气判定,一但错过,你只能凭运气才能碰到下一个好女孩儿。

    让你打印 string message = Encoding.UTF8.GetString(buffer, 0, bytesRead),只是让你看到你到底收了没有,if错过,不代表没收到数据

    评论

报告相同问题?

问题事件

  • 创建了问题 11月6日

悬赏问题

  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决