2015-08-17 44 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();