UdpLogListBox.xaml.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Controls;
  8. namespace FastGithub.UI
  9. {
  10. /// <summary>
  11. /// UdpLogListBox.xaml 的交互逻辑
  12. /// </summary>
  13. public partial class UdpLogListBox : UserControl
  14. {
  15. private readonly byte[] buffer = new byte[ushort.MaxValue];
  16. private readonly Socket socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
  17. public ObservableCollection<UdpLog> LogList { get; } = new ObservableCollection<UdpLog>();
  18. public UdpLogListBox()
  19. {
  20. InitializeComponent();
  21. DataContext = this;
  22. this.InitUdpLoggerAsync();
  23. }
  24. private async void InitUdpLoggerAsync()
  25. {
  26. this.socket.Bind(new IPEndPoint(IPAddress.Loopback, UdpLoggerPort.Value));
  27. while (true)
  28. {
  29. var log = await this.GetUdpLogAsync();
  30. this.LogList.Add(log);
  31. }
  32. }
  33. private async Task<UdpLog> GetUdpLogAsync()
  34. {
  35. EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
  36. var taskCompletionSource = new TaskCompletionSource<int>();
  37. this.socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, this.EndReceiveFrom, taskCompletionSource);
  38. var length = await taskCompletionSource.Task;
  39. var json = Encoding.UTF8.GetString(buffer, 0, length);
  40. return Newtonsoft.Json.JsonConvert.DeserializeObject<UdpLog>(json);
  41. }
  42. private void EndReceiveFrom(IAsyncResult ar)
  43. {
  44. EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
  45. var length = this.socket.EndReceiveFrom(ar, ref remoteEP);
  46. var taskCompletionSource = (TaskCompletionSource<int>)ar.AsyncState;
  47. taskCompletionSource.TrySetResult(length);
  48. }
  49. private void MenuItem_Copy_Click(object sender, System.Windows.RoutedEventArgs e)
  50. {
  51. if (this.listBox.SelectedValue is UdpLog udpLog)
  52. {
  53. udpLog.SetToClipboard();
  54. }
  55. }
  56. private void MenuItem_Clear_Click(object sender, System.Windows.RoutedEventArgs e)
  57. {
  58. this.LogList.Clear();
  59. }
  60. }
  61. }