我的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();
}
}
}
现在程序启动时会发生什么,它将接收数据&#34; S0000 ..&#34;但是当警报将数据更改提升为&#34; S8000..etc&#34;但是这个班级不断收到相同的&#34; S000 ..&#34;数据,除非我重新开始上课。
当我在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 :(得分: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());
}
使用Close()
方法收到后,请确保您是disposing the udp
connection:
byte[] bytes = udp.EndReceive(ar, ref ip);
udp.Close();