2013-06-25 70 views
0

我正在开发GPS车辆跟踪项目。这里的设备用于将经纬度信号发送到端口5000上的特定IP(静态IP)。共有17台设备。由于读取延迟导致TcpListener套接字数据丢失

我的问题是,当所有的17设备被激活我没有得到在适当的持续时间从所有设备的读数。这意味着如果我读取了设备1的读数,那么在设备2继续读取5到6个读数时,我将持续从该设备读取5到6个读数。

我在这里要说的是,所有设备都会每隔1分钟向我的IP发送读数(经度和纬度),但是当我从设备获取信号时, 6分钟装置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

为每个连接的客户端启动一个接收者线程。并且不要将每条消息添加到接收者线程的UI中,因为这可能是代码无法遵循的问题。 –

+0

你能否改变你的通信协议?我认为在有17个设备的情况下,需要为每个设备建立连接的tcp可能不太方便。我用UDP开发了这个项目没有问题。另外,我也同意Wouter。 – Masoud

回答

0

我认为这个问题是在与客户交易的线程,它停留在一个循环吃所有的CPU。您应该避免在可供直接读取插座(其实这是你该做的,等到东西进来),使其停止,直到一些数据得到。另外,你可以通过改变

if (Socket_Client.Avilable > 0) 

if (Socket_Client.Poll(1000000, SelectMode.SelectRead)) 

万一你需要偶尔检查某些东西,例如线程不活着。