TCP通讯握手交互

学习目标:

 TCP通讯交互中有客户提出握手交互的需求,即在通讯开始阶段首选通过客户端发送握手信息给服务器,在指定时间内收到服务器回复信息说明通讯正常,否则报警提醒。


学习内容:

1、使用计时监控是否到达指定时间

2、使用定时器执行定时监控任务

3、筛选服务器返回信息,停止相关任务


任务实现:

在Socket通讯类中添加 握手交互方法HandshakeConnect,方法被调用后会启用定时器和计时器 Stopwatch 

public void HandshakeConnect()
        {
            if (!IsExportEnabled)
                return;

            string eqId = GetLineNumber(Customization.Current.Line == "" ? AutoRunSettings.Default.LineNumber : Customization.Current.Line, 1);
            string serialNum = GetCurrentserialNum();

            string message = string.Format(HandshakeConnect_Format, eqId, serialNum);
            if (SocketClient.Current.GetSocketClient() != null)
            {
                timer.Elapsed += Timer_Elapsed;
                timer.Interval = 500;
                SocketClient.Current.SocketWriteData(message);
                SW = Stopwatch.StartNew();
                timer.Start();
            }
            Trace.WriteLine("HOLLY AOI ============> HandshakeConnect End ");
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            TimeSpan timeout = new TimeSpan(0, 0, 2);

            if (SW.IsRunning == false && SW.Elapsed <= timeout)
            {
                timer.Stop();
                timer.Close();
                timer.Dispose();

                if (HandshakeConnectRevMsg.Count > 0)
                {
                    HandshakeConnectRevMsg.Clear();
                }
            }
            else if (SW.IsRunning && SW.Elapsed > timeout)
            {
                SW.Stop();
                timer.Stop();
                timer.Close();
                timer.Dispose();

                Application.Current.Dispatcher.Invoke(() =>
                {
                    MessageBox.Show("设备与Socket服务器握手通讯超时!");
                });
            }
        }

在信息收取方法中:通过回复信息过滤出特殊回复信息,并通过计时器状态来判断状态。

 void SocketDataReceived()
        {
            try
            {
                if (socketClient == null)
                {
                    return;
                }

                // 持续监听服务端发来的消息
                while (true)
                {
                    byte[] arrRecvmsg = new byte[1024 * 1024 * 2];
                    int length = socketClient.Receive(arrRecvmsg);
                    string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length);
                    if (strRevMsg.Contains("[RC]"))
                    {
                        ControlCMDRevMsg.Add(strRevMsg);
                    }
                    TimeSpan timeout = new TimeSpan(0, 0, 2);
                    if (SW != null)
                    {
                        if (SW.IsRunning && SW.Elapsed <= timeout)
                        {
                            if (strRevMsg.Contains("[TB]"))
                            {
                                HandshakeConnectRevMsg.Add(strRevMsg);
                                SW.Stop();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine("HOLLY AOI ============> SocketClient.SocketDataReceived Exception = " + ex);
            }
        }

学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐细雨如春风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值