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循环,因为我必须在窗口服务中使用这个程序。
两个问题。首先,在异步回调中'Thread.Sleep'的目的是什么?其次,你确定回调实际上是多次执行吗?当发送者发送“S8000”时,您的客户似乎不太可能收到“S0000”。 –
另请参阅http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient一个简单的UDP接收器。 –
我只是添加thread.sleep来给予150毫秒的中断,因为这我开始接收准确的数据。我已经看到你的意见在答案http://stackoverflow.com/questions/7266101/receive-messages-continuously-using-udpclient和基于这些建议我已经删除Thread.sleep并调用BeginReceive权限后收到,但其工作真的快速和在数据处理过程中记录为空字符串,但数据实际上进来了! – dawncode