我正在开发一个系统,该系统必须向大约200个传感器请求信息' usig TCP,所以基本上是一个拥有大量服务器的客户端。每个传感器发送一个未知数量的消息,我必须每次在0.1秒之后用ACK回复,最后的ACK将不会得到传感器的回复。最后一条消息由标签标识。我要在最后收到的消息后延迟0.5秒请求信息。
这就是我使用一个传感器的方式:
首先,信息请求:
public void Request(string request)
{
Send_msg(request, this.EndPoint);
System.Threading.Thread.Sleep(500);
buffer_rcvr = new byte[MaxSizebuffer];
try
{
IAresult3 = socketPC_BB.BeginReceive(buffer_rcvr, 0, MaxSizebuffer, socketFlags, out errorCode, Package_receive, state);
}
catch (SocketException se)
{
(Adds error to log)
}
private void Send_msg(string str_frame, EndPoint BB_ip_and_port)
{
try
{
IAresult2 = this.socketPC_BB.BeginSend(FrameToByte_Encoder(str_frame), 0, str_frame.Length, socketFlags, callback, state);
socketPC_BB.EndSend(IAresult2);
}
catch (SocketException se)
{
(Adds error to log)
}
}
这就是我的倾听方式:
void Package_receive(IAsyncResult answer)
{
Msg= ProcessMessage(ByteToFrame_Decoder(buffer_rcvr));
System.Threading.Thread.Sleep(100);
this.Send_msg(ACK, this.EndPoint);
try
{
IAresult3 = this.socket.BeginReceive(buffer_rcvr, 0, MaxSizebuffer, socketFlags, out errorCode, Package_receive, state);
}
catch (SocketException se)
{
(Adds error to log)
}
}
所以这适用于某个传感器。我没有编写大部分代码,我仍然想知道如何在没有调用EndReceive的情况下如何工作。 (我怀疑它适用于超时 - this.socket.ReceiveTimeout = 3000;)
我的主要问题是,创建具有IP和端口列表的多个套接字并调用这些方法是否会增加每个传感器的延迟或回调是否完全异步并且它们在不同的线程中并行工作。我是否需要在回调中使用线程安全方法将所有数据添加到列表中? 最重要的是:为每个插槽手动创建单独的线程以继续轮询而不会使每个传感器的延迟变得超过一分钟,这是明智的还是浪费精力?
提前谢谢你:)