У меня есть служба, которая запускает Thread для выполнения некоторых операций с сокетом. Код выглядит следующим образом:java.net.BindException: bind failed: EADDRINUSE (адрес уже используется)
public class ServerRunnable implements Runnable {
@Override
public void run() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(ProtocolConstants.USB_SERVER_PORT));
while (true) {
Socket client = serverSocket.accept();
// some code
} catch (Exception e) {
Log.e("Exception while listening on socket.", e);
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
Log.e(e);
}
}
}
Когда я начала службы в первый раз, все нормально, но тогда я должен остановить его, используя stopService
метод. Когда я начинаю это еще раз, она возвращает следующее исключение:
java.net.BindException: bind failed: EADDRINUSE (Address already in use)
Кроме того, я добавил ServerSocket
закрытие в onDestroy
методы обслуживания, но это не помогло.
setReuseAddress
Выполняется перед bind
, так почему он не работает?
Я предлагаю вам войти, когда 'ServerSocket' фактически закрывается. Либо вы повторно используете чужой порт, либо служба не вышла полностью при перезапуске. – EJP