Почему я не могу использовать два потока, содержащих один и тот же сокет в Java? - PullRequest
1 голос
/ 27 марта 2012

Вот код:

TaskA a = new TaskA(this.serverSocket, this.socket);
a.assignConfig(this.config);
this.threada = new Thread(a);
this.threada.start();

TaskB b = new TaskB(this.serverSocket, this.socket);
b.assignConfig(this.config);
this.threadb = new Thread(b);
this.threadb.start();

В TaskA этот класс работает следующим образом:

        if (this.serversocket == null) {
            this.serversocket = new ServerSocket(this.config.getI_respondPort());
        }

        if (this.serversocket != null) {
            System.out
                    .println("this.serversocket " + this.serversocket);
        }

        this.serversocket.setSoTimeout((int) this.config
                .getL_respondSocketInterval());

        while (this.is_keepRun()) {
                System.out.println("Keep Listening");

                Thread.sleep(this.config.getL_heartBeatInterval());
        }

И TaskB выглядит так:

    while (this.is_keepRun()) {

            if (this.serversocket != null) {
                System.out.println("waiting input");

                this.socket = this.serversocket.accept();

                System.out.println("Connection received from "
                        + this.socket.getInetAddress().getHostName());
            }

    }

Я назначаю один и тот же serverSocket и сокет через их собственный конструктор, но когда сокет получил соединение, TaskA может выполнить serversocket.accept, но serversocket TaskB всегда равен null, что я сделал не так?Спасибо.

1 Ответ

2 голосов
/ 27 марта 2012

ServerSockets ищут новые сокетные соединения и блокируют данный порт. Если вы хотите несколько серверных сокетов, используйте несколько портов. Если вы хотите иметь несколько потоков в разных сокетах, то используйте один сокет сервера, и у вас есть поток для выполнения работы после его создания. Подтверждение просто ожидает его создания, здесь вы найдете хорошее базовое введение в сокеты: http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

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