2015-08-17 68 views
1

我的udp類未接收到來自流的更新值。設備不斷髮送數據,當任何警報激活時,它將代碼添加到流中併發送更新後的值,但我的班級沒有收到更新的值,除非我重新啓動程序。UDP未收到更新值

這裏是我的UDPListener類。

public class 
{ 
    public static int PORT_NUMBER { get; set; } 
    public string IpAddress { get; set; } 
    private readonly UdpClient udp; 
    public event Action<object, EventArgs> msgChanged; 
    IAsyncResult ar_ = null; 

    public UDPListener(string ipaddr, int port) 
    { 
     IpAddress = ipaddr; 
     PORT_NUMBER = port; 
     udp = new UdpClient(PORT_NUMBER); 
     Start(); 
    } 

    public void Start() 
    { 
     StartListening(); 
    } 

    public void Stop() 
    { 
     try 
     { 
      udp.Close(); 
     } 
     catch { /* not necessary */ } 
    } 

    private void StartListening() 
    { 
     ar_ = udp.BeginReceive(Receive, new object()); 
    } 

    private void Receive(IAsyncResult ar) 
    { 
     try 
     { 
      Thread.Sleep(150); 
      IPEndPoint ip = new IPEndPoint(IPAddress.Parse(IpAddress), PORT_NUMBER); 
      byte[] bytes = udp.EndReceive(ar, ref ip); 
      string message = Encoding.ASCII.GetString(bytes); 

      //raise event.. 
      if (message.StartsWith("S")) 
       if (msgChanged != null) 
        msgChanged(message, EventArgs.Empty); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Error in UDPListner..." + ex.Message); 
     } 
     finally 
     { 
      StartListening(); 
     } 
    } 
} 

什麼是現在的程序啓動時,它會接收數據時發生的「S0000 ..」但是,當報警提高數據變爲「S8000..etc」,但這個類連續接收相同的「S000 ..」數據除非我重新開課。

當我在while循環中運行udp監聽器時,它的工作非常好,它接收到更新後的流並在鬧鐘響起時進行更改。

這裏是while循環udp的代碼。

while (!StopRunning) 
{ 
    Thread.Sleep(150); 
    udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork); 
    var ep = default(IPEndPoint); 
    var data = udp.Receive(ref ep); 
    udp.Close(); 
    string msg = Encoding.ASCII.GetString(data); 
    if (msgChanged != null) 
     msgChanged(msg, EventArgs.Empty); 
} 

但是我不能使用while循環,因爲我必須在窗口服務中使用這個程序。

+0

兩個問題。首先,在異步回調中'Thread.Sleep'的目的是什麼?其次,你確定回調實際上是多次執行嗎?當發送者發送「S8000」時,您的客戶似乎不太可能收到「S0000」。 –

+0

另請參閱http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient一個簡單的UDP接收器。 –

+0

我只是添加thread.sleep來給予150毫秒的中斷,因爲這我開始接收準確的數據。我已經看到你的意見在答案http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient和基於這些建議我已經刪除Thread.sleep並調用BeginReceive權限後收到,但其工作真的快速和在數據處理過程中記錄爲空字符串,但數據實際上進來了! – dawncode

回答

0

在UDPListener和while循環的主要區別是,在循環中,您創建的每個要連接到UDP時間udp變量:

udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork); 

Receive(IAsyncResult ar)你只能用相同客戶端連接,所以你仍然有相同的數據。
我認爲你可以重寫你的階級是這樣的:

private void StartListening() 
{ 
    udp = new UdpClient(PORT_NUMBER, AddressFamily.InterNetwork); 
    ar_ = udp.BeginReceive(Receive, new object()); 
} 

確保你disposing the udp connectionClose()方法收到後:

byte[] bytes = udp.EndReceive(ar, ref ip); 
udp.Close();