我为Android开发了一个C#Xamarin应用程序时遇到了一个问题,该应用程序是客户端,同时是另一种语言的服务器。它们通过TCP / IP套接字相互交互。
从广义上讲,Android应用是地理本地化应用。现在,由于移动网络的性质,我实现了一种方法来检测服务器是否存在连接,如果没有,则自动重新连接。当套接字上的操作失败时,该应用将直接置于离线模式。
这段时间里,一切都应该正常进行:主要活动是跟随用户的地图。
如果我使服务器崩溃,则它确实会按预期工作:它会不时尝试重新连接,在此期间,地图“已更新”(角度根据方位等而改变),“否”连接”按钮,然后服务器重新联机时,它将重新连接。
但是当我没有网络或将手机设置为平面模式时,它会冻结。
也不例外。我到处都设置了断点,但没有任何效果。我完全不知道发生了什么。 最重要的是,似乎Android系统本身处于冻结状态,老实说,我没有真正的主意,Android如何执行我的应用程序要求其执行的操作,以及导致此冻结的原因。我通常需要重启手机或等待很长时间。方位没有更新,地图也没有像服务器崩溃时一样移动。
我尝试使套接字超时。我试图使用套接字的其他属性来确定它是否以这种方式断开连接。我在每次使用套接字时都尝试了catch块,一旦操作失败,就会强制断开连接。
由于我在该项目上有成千上万的线路,因此不可能显示全部活动。但是,我可以显示如何确定连接状态以及如何连接/重新连接套接字。
我如何检查连接状态:
public bool checkConnectionStatus()
{
bool part1 = true;
try
{
part1 = sock.Poll(1000, SelectMode.SelectRead);
}
catch
{
connected = false;
return false;
}
bool part2 = (sock.Available == 0);
if (part1 && part2)
{
connected = false;
return false;
}
else
{
connected = true;
return true;
}
}
什么是第一次启动套接字,也包括什么时候它断开连接并且我希望它重新连接:
public void socketStartup()
{
socketStartupLocked = true;
ip = IPAddress.Parse(ipstring);
ipe = new IPEndPoint(ip, port);
try
{
sock = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, ProtocolType.Tcp)
{
};
}
catch
{
connected = false;
socketStartupLocked = false;
return;
}
try
{
sock.Connect(ipe);
connected = true;
}
catch
{
connected = false;
socketStartupLocked = false;
return;
}
socketStartupLocked = false;
}
我希望我的应用在没有网络的情况下能够像在服务器关闭时那样正常运行。
答案 0 :(得分:1)
您可能应该只在检查设备网络连接后才检查服务器/套接字连接。
有关如何做的参考:
请记住将以下权限添加到清单中:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />