C# 由于读取延迟,TcpListener套接字数据丢失
我正在做一个GPS车辆跟踪项目。这里的设备用于向端口5000上的特定IP(静态IP)发送纬度和经度信号。总共有17台设备 我的问题是,当所有17个设备都被激活时,我没有在适当的时间内从所有设备获取读数。这意味着,如果我得到了设备1的读数,我将继续从该设备获得5到6个读数,之后当设备2我将继续获得5到6个读数时,它将继续进行 这里我要说的是,所有的设备每1分钟将读数(纬度和经度)传输到我的IP,但是当我从设备获得信号时,我只会在5到6分钟后从设备1获得设备2,然后是设备3 我的问题是我的应用程序正在丢失数据包。这意味着,当我的应用程序从设备17接收数据时,应用程序正在接收最后5到6分钟的读数,但它在过去10到30分钟内丢失了读数 如何使用一个套接字将所有设备的信号并行地传输到同一端口 这是我实现的代码:C# 由于读取延迟,TcpListener套接字数据丢失,c#,.net,windows,sockets,C#,.net,Windows,Sockets,我正在做一个GPS车辆跟踪项目。这里的设备用于向端口5000上的特定IP(静态IP)发送纬度和经度信号。总共有17台设备 我的问题是,当所有17个设备都被激活时,我没有在适当的时间内从所有设备获取读数。这意味着,如果我得到了设备1的读数,我将继续从该设备获得5到6个读数,之后当设备2我将继续获得5到6个读数时,它将继续进行 这里我要说的是,所有的设备每1分钟将读数(纬度和经度)传输到我的IP,但是当我从设备获得信号时,我只会在5到6分钟后从设备1获得设备2,然后是设备3 我的问题是我的应用程序正
Thread th_main, th_sub;
bool bool_Start_subTH;
Socket Socket_Client;
TcpListener objListener;
private void Form1_Load(object sender, EventArgs e)
{
bool_Start_subTH=false;
th_main = new Thread(GetDataFromClient);
th_main.Start();
}
void GetDataFromClient()
{
objListener = new TcpListener(5000);
objListener.Start();
while (th_main.IsAlive)
{
Socket_Client= objListener.AcceptSocket();
if(!bool_Start_subTH)
{
th_sub=new Thread (SubFunctionThread);
th_sub.start();
bool_Start_subTH=false;
}
}
}
void SubFunctionThread()
{
while(th_sub.IsAlive)
{
if(Socket_Client.Avilable>0)
{
byte[] something = new byte[Socket_Client.Available];
Socket_Client.Receive(something);
string strmessage = Encoding.ASCII.GetString(something);
Listbox1.Items.Add( strmessage);
}
}
}
我认为问题在于处理客户机的线程,它停留在一个循环中,占用了所有的CPU。您应该避免使用可用的套接字,直接读取套接字(事实上,这就是您所要做的,等待某些数据进入),使其停止,直到一些数据进入。而且,你可能会改变
if (Socket_Client.Avilable > 0)
借
如果您需要偶尔检查一次,例如线程不活动。为每个连接的客户端启动一个接收器线程。不要将每条消息都添加到接收方线程的UI中,因为这可能是代码无法遵循的问题。您可以更改通信协议吗?我认为在有17个设备的情况下,tcp(需要为每个设备建立连接)可能不是很方便。我已经开发了这个项目与UDP没有问题。此外,我同意沃特太。
if (Socket_Client.Poll(1000000, SelectMode.SelectRead))