我正在尝试从我的android设备与嵌入式UDP服务器进行通信,并且在收到UDP数据包后,我正在更新自己的UI。通信可以正常工作约250次迭代(查询-响应),然后弹出GC扫描主屏幕,并且UDP套接字停止接收。我是android开发的新手,我不确定UDP通信的实现是否正确完成]
这就是我所拥有的...
void Initialize_UDP()
{
ThreadPool.QueueUserWorkItem(o => UDPCommunicator());
update_flag = true;
}
void UDPCommunicator()
{
while (true)
{
if (update_flag)
{
try
{
byte[] buffer = FrameGenerator(1, 0, true);
byte[] data = new byte[25];
CheckQuery(buffer);
var sender = default(IPEndPoint);
using (UdpClient udpClient = new UdpClient(15001))
{
udpClient.EnableBroadcast = true;
udpClient.Send(buffer, buffer.Length, "192.168.4.255", 15000);
udpClient.Client.ReceiveTimeout = 500;
data = udpClient.Receive(ref sender);
socket_active = false;
}
CheckResponse(data);
/*RunOnUiThread(() =>
{
Update_UI(data);
}); */
}
catch (SocketException)
{
Log.Debug("Error", "Socket Error: Timeout");
}
}
Thread.Sleep(100);
}
}
这是我收到的错误
09-25 14:20:01.795 D / A(7595):响应:35 68 1 18 56 231 2 0 223 137 23 8 0 0 0 0 2 1 14 19 0 1 185
09-25 14:20:01.896 D / A(7595):查询:35 81 1 0 139
09-25 14:20:01.941 I / zygote(7595):显式并发复制GC已释放4890(372KB)AllocSpace对象,0(0B)LOS对象,50%空闲,1628KB / 3MB,已暂停170us,总计35.511ms] >
09-25 14:20:01.941 D / Mono(7595):GC_TAR_BRIDGE跨接21个对象24不透明1种颜色21种跨接21种颜色-可见21外部参照0缓存命中0缓存半迷糊0缓存缺失0设置0.07 ms tarjan 0.06ms scc设置0.06ms collect-xref 0.00ms xref-setup 0.00ms清理0.05ms
09-25 14:20:01.942 D / Mono(7595):GC_BRIDGE:已完成,运行了37.27ms
09-25 14:20:01.942 D / Mono(7595):GC_MINOR:(并发启动)时间5.32ms,stw 8.02ms提升了114K主要大小:使用848K:170K丢失大小:17408K使用中:16067K
09-25 14:20:01.942 D /单声道(7595):GC_MAJOR_CONCURRENT_START:(LOS溢出)
09-25 14:20:02.442 D /错误(7595):套接字错误:超时09-25 14:20:02.544 D / A(7595):查询:35 81 1 0 139
我正在尝试从我的android设备与嵌入式UDP服务器进行通信,并且在收到UDP数据包后,我正在更新自己的UI。通讯可以正常进行约250次迭代(查询-响应)...
这是超时时间太短的情况。 UdpClient.Client.ReceiveTimeout
是以毫秒为单位的时间。 Stacktrace显示“ GC_MAJOR_CONCURRENT_START:(LOS溢出)”和“套接字错误:超时”之间恰好花费了500毫秒,因此这就是原因。解决方案是增加UDP客户端的超时,默认值为“ 0”,这意味着无限,和/或向超时事件添加错误处理