Адрес BindException уже используется - PullRequest
2 голосов
/ 11 января 2012

У меня проблемы с моим методом serverThreadProc ().Он генерирует исключение BindException при каждом запуске.Думая, что может быть проблема в первых двух строках блока try.Не уверен, что я делаю неправильно, хотя.

private void serverThreadProc() {
    while (!this.stopRequested) {
        Socket sessionSocket = null;
        try {
            serverSocket = new ServerSocket(serverPort);
            sessionSocket = this.serverSocket.accept();
            InetAddress sourceAddress = sessionSocket.getInetAddress();
            Log.i(LOG_TAG, "Accepted new incoming connection ... "
                    + sourceAddress.toString());
            if (clientMap.containsKey(sourceAddress)) {
                ClientProcessor legacyProcessor = clientMap
                        .get(sourceAddress);
                legacyProcessor.shutdown();
            }
            ClientProcessor processor = new ClientProcessor(sessionSocket);
            processor.start();
            clientMap.put(sourceAddress, processor);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public int start() {
    try {
        this.serverSocket = new ServerSocket(0);
        this.serverPort = this.serverSocket.getLocalPort();
        Log.i(LOG_TAG, "Server " + serverName + " started at "
                + this.serverSocket.getLocalSocketAddress());
    } catch (IOException ex) {
        Log.i(LOG_TAG, ex.toString());
    }

    this.serverThread.start();
    return this.serverPort;
}

public void stop() {
    try {
        stopRequested = true;
        if (this.serverSocket) {
            this.serverSocket.close();
        }
    } catch (IOException ex) {
        Log.i(LOG_TAG, ex.toString());
    }

    Log.i(LOG_TAG, "The server " + this.serverName + " has been stopped.");
}

Вот трассировка стека, созданная кодом:

01-11 05:51:53.472: I/ConnectActivity(2151): IP Address:0
01-11 05:51:53.492: I/ServiceServer(2151): Server Whooznear started at /0.0.0.0:35434
01-11 05:51:53.522: I/ConnectActivity(2151): Started at 35434
01-11 05:51:53.542: W/System.err(2151): java.net.BindException: Address already in use
01-11 05:51:53.542: W/System.err(2151):     at org.apache.harmony.luni.platform.OSNetworkSystem.bind(Native Method)
01-11 05:51:53.542: W/System.err(2151):     at dalvik.system.BlockGuard$WrappedNetworkSystem.bind(BlockGuard.java:275)
01-11 05:51:53.571: W/System.err(2151):     at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:165)
01-11 05:51:53.571: W/System.err(2151):     at java.net.ServerSocket.<init>(ServerSocket.java:123)
01-11 05:51:53.592: W/System.err(2151):     at java.net.ServerSocket.<init>(ServerSocket.java:74)
01-11 05:51:53.592: W/System.err(2151):     at com.whooznear.android.ServiceServer.serverThreadProc(ServiceServer.java:63)
01-11 05:51:53.592: W/System.err(2151):     at com.whooznear.android.ServiceServer.access$0(ServiceServer.java:58)
01-11 05:51:53.611: W/System.err(2151):     at com.whooznear.android.ServiceServer$1.run(ServiceServer.java:53)

Ответы [ 2 ]

1 голос
/ 11 января 2012

Вы создаете ServerSocket в процедуре start(), затем вы создаете новый ServerSocket на том же порту в процедуре serverThreadProc(). Вы должны закрыть старый, прежде чем создавать новый сокет сервера. Или используйте другой порт.

0 голосов
/ 11 января 2012

Почему вы используете while в методе serverThreadProc()

Сделайте программу простой. Я думаю, ваш код немного запутан.

Вы можете обратиться к базовым примерам сокетов

Это может помочь вам упростить код кода для задачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...