学习目标:
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 个