У меня есть небольшая проблема, так как я разработал приложение C # Xamarin для Android, которое является клиентом и параллельно сервером на другом языке.Они взаимодействуют друг с другом через сокеты TCP / IP.
Приложение для Android, в широком смысле, является географически локализованным приложением.Теперь, из-за особенностей сети мобильной связи, я реализовал способ определения наличия подключения к серверу и, если нет, автоматического повторного подключения.При сбое операции с сокетом приложение напрямую переводится в автономный режим.
В течение этого времени все должно работать: основное действие - это карта, которая следует за пользователем.
Если я произвожу сбой сервера, он действительно будет работать как положено: он пытается каждый раз время от времени переподключаться, и в течение этого времени карта «обновляется» (угол изменяется в зависимости от направления и т. Д.), Кнопка «нет подключения»Появляется, и когда сервер снова подключен к сети, он снова подключается.
Но когда у меня больше нет сети или я перевожу телефон в плоский режим, он зависает.
Нет исключений.Я установил контрольные точки везде, безрезультатно.Я понятия не имею, что происходит вообще.Вдобавок ко всему, кажется, что сама система Android зависает, и я не представляю себе, если честно, как Android выполняет то, что просит мое приложение, и что может вызвать такое замораживание.Мне в основном нужно либо перезагрузить телефон, либо ждать очень долго.Подшипники не обновляются, карта не перемещается, как это происходит при сбое сервера.
Я попытался установить таймаут сокета.Я попытался использовать другие свойства сокета, чтобы определить, отключен ли он таким образом.Я поместил блоки try try вокруг каждого использования сокета, заставляя отключаться всякий раз, когда происходит сбой операции.
На самом деле невозможно отобразить все действия, так как у меня есть несколько тысяч строк в этом проекте.Однако я могу показать, как определить состояние подключения и как подключить / повторно подключить сокет.
Как проверить состояние подключения:
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;
}
Я ожидаю, что мое приложение будет вести себя, когда нет сети, точно так же, как при отключенном сервере.