При перезапуске приложения я получил исключение BindException.Он действует как сервер, ожидающий сообщений удаленного управления.ServerSocket работает в фоновом потоке (AsyncTask).После перезапуска моего приложения я всегда получаю исключение, упомянутое выше.Мне нужно ждать около 10 минут, пока он не сможет снова привязаться к порту, чтобы прослушать.
Я пробовал разные порты (все> 50000), поэтому я уверен, что нет другого приложения, блокирующего мой порт.Я пытался быть осторожным с закрытием сокета и пытался использовать опцию SO_REUSEADDR.Также я уверен, что во время выполнения открыто только одно соединение, так как я регистрировал каждое гнездо.
Так что я думаю, что соединение не закрыто должным образом.Я читал о привычке сокетов не закрываться мгновенно.Но я не могу ждать, как 10 минут при каждом перезапуске приложения, и я не нашел способ сократить или убить это время.
У вас есть какие-либо идеи?
Исключение:
10-04 16:39:22.526: WARN/System.err(4974): java.net.BindException: Address already in use
10-04 16:39:22.526: WARN/System.err(4974): at org.apache.harmony.luni.platform.OSNetworkSystem.bind(Native Method)
10-04 16:39:22.526: WARN/System.err(4974): at dalvik.system.BlockGuard$WrappedNetworkSystem.bind(BlockGuard.java:275)
10-04 16:39:22.526: WARN/System.err(4974): at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:165)
10-04 16:39:22.526: WARN/System.err(4974): at java.net.ServerSocket.<init>(ServerSocket.java:123)
10-04 16:39:22.526: WARN/System.err(4974): at java.net.ServerSocket.<init>(ServerSocket.java:74)
10-04 16:39:22.526: WARN/System.err(4974): at com.*******.remote.RemoteHandlerListener$1.doInBackground(RemoteHandlerListener.java:114)
Код:
ServerSocket server;
try {
server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(serverport));
} catch (IOException e) {
e.printStackTrace();
return null;
}
while (true) {
BufferedReader inStream = null;
Socket client = null;
try {
client = server.accept();
inStream = new BufferedReader(new InputStreamReader( client.getInputStream()));
// read from stream
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) { }
}
if (client != null) {
try {
client.close();
} catch (IOException e) { }
}
}
}
try {
server.close();
} catch (IOException e) { }
Исключение выдается в операторе server.bind.
РЕДАКТИРОВАТЬ: причина проблемы: поток не завершит себятак как принять вызов блокируется.Программа не завершилась полностью, и сокет не был освобожден.
Решение: Установите SO_TIMEOUT на сокет и проверьте isCancelled в цикле while ().Таким образом, поток завершится, если вы вызовете на нем метод cancel ().