我构建了一个简单的应用程序,该应用程序通过UDP与用户指定IP的端点进行通信。它使用<script type="text/javascript">
$(document).ready(function(){
setInterval(function(){
$( "#transactions" ).remove();
const url = 'http://airport-system.tk/api/get_available_transaction';
let jsondata;
fetch(url).then(
function(u){ return u.json();}
).then(function(json){
//start transaction div
var para_transactions = document.createElement("div");
para_transactions.setAttribute("id","transactions");
var element = document.getElementById("body");
element.appendChild(para_transactions);
//end transaction div
//start col-md-9 div
var para_col_md = document.createElement("div");
para_col_md.setAttribute("class","col-md-9");
para_col_md.setAttribute("id","test_col");
var element_transaction = document.getElementById("transactions");
element_transaction.appendChild(para_col_md);
document.getElementById("test_col").style.marginTop = '50px';
</script>
,在Android上效果很好-我能够相当一致地发送和接收数据包。有一个明显的例外...例外。它似乎完全逃避了System.Net.Sockets.UdpClient
;我的猜测是潜在的实现错误非常困难,无法捕获错误。例如:
try/catch
在实际的Android设备上进行测试时,如果用户输入了错误的IP,则通过UDP ping通该IP的下一步将持续破坏该应用程序。这种行为也是完全怪异的。例如,如果我在后台线程上发出呼叫,就像这样:
UdpClient Udp { get; protected set; }
Udp.Connect("192.168.1.254"); // Any bad IP
try
{
int bytesSent = await udp.SendAsync(bytes, bytes.Length);
}
catch(Exception ex)
{
return null;
}
然后在某些情况下我实际上可以获取异常-但仅在外部捕获!抛出发生在内部try内部的Task.Run(ping).ConfigureAwait(false);
protected async Task ping()
{
try
{
await checkIp();
}
catch(Exception ex)
{
}
}
调用上,并且异常是类型为SendAsync
的{{1}}!取决于我执行过程的精确程度,有时会被发现,有时甚至根本不会被捕获。当它根本不存在时,该应用程序就会崩溃。疯狂!
这是预期的行为吗?难道不应该使用Xamarin UdpClient吗?虫子?比System.Net.Sockets.SocketException
更好的方法?其他吗?