我正在开展GPS车辆跟踪项目。这里的设备用于将纬度和经度信号发送到端口5000上的特定IP(静态IP)。总共有17个设备。
我的问题是当所有17个设备都被激活时,我没有在适当的持续时间内从所有设备获得读数。这意味着如果我获得了设备1的读数,那么我将不断从该设备获得5到6个读数,之后设备2我将继续获得5到6个读数,类似地继续读取。
我在这里要说的是所有设备每1分钟向我的IP发送读数(纬度和经度),但是当我从设备获得信号时,我只会在少数5到6之后从设备1获得分钟设备2然后3。
我的问题是我的应用程序正在丢失数据包。这意味着当我的应用程序从设备17接收数据时,应用程序正在接收最后5到6分钟的读数,但它已经丢失了过去10到30分钟的读数。
如何使用一个插座将所有设备的信号与同一端口并联?
这是我实施的代码:
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);
}
}
}
答案 0 :(得分:0)
我认为问题出在处理客户端的线程中,它处于循环中占用所有CPU。您应该避免使用Available并直接读取套接字(实际上这是你想要做的所有事情,等到有什么东西进入),让它停止直到某些数据进入。此外,你可能会改变
if (Socket_Client.Avilable > 0)
通过
if (Socket_Client.Poll(1000000, SelectMode.SelectRead))
如果您需要偶尔检查一次,例如线程不活动。