С java многопоточным сервером / клиентом, как определить, закрыт ли клиентский поток? - PullRequest
0 голосов
/ 08 октября 2011

Я делаю серверную / клиентскую программу на Java. Сервер ожидает подключения, затем создает новый поток для этого подключения. Затем сервер возвращается и прослушивает соединения на других портах.

sck = srvrSckt.accept();
server.numConnections++;
System.out.print("Connection was made on " + server.port[i] + ".\n");
Connections conn = new Connections(sck);
server.threads[i] = new Thread(conn);
server.threads[i].start();

После того, как соединение было установлено, я хочу вернуться и проверить, были ли закрыты все предыдущие соединения. Затем я отмечу эти порты как доступные для будущих подключений. Есть ли способ сделать это?

Я прочитал, что лучший способ связи между потоками - это общая переменная. Тем не менее, я не могу найти хороший пример этого. Кроме того, я не уверен, будет ли работать переменная общего доступа, потому что я хочу проверять не только соединения, которые были успешно закрыты, но также и соединения, которые были внезапно отключены.

Любая помощь, которую вы можете предложить, будет принята с благодарностью. Спасибо вам.

EDIT:

Вот большая часть кода. Это может сделать мой вопрос более ясным.

if (server.isAvailable[i] == true)
{
    availablePort = server.allPorts[i];
    server.isAvailable[i] = false;
    ServerSocket srvrSckt = new ServerSocket(availablePort);
    System.out.println("Waiting for connection on port " + availablePort + "...");
    srvrSckt.setSoTimeout(5000);
    try {
        sck = srvrSckt.accept();
        server.numConnections++;
        System.out.print("Connection was made on " + server.port[i] + ".\n");
        Connections conn = new Connections(sck);
        server.threads[i] = new Thread(conn);
        server.threads[i].start();
    } catch (Exception e) {
    server.isAvailable[i] = true; // no connection was made
    srvrSckt.close();
}

Ответы [ 2 ]

1 голос
/ 09 октября 2011

После того, как соединение было установлено, я хочу вернуться и проверить, закрылись ли какие-либо предыдущие соединения

Обычно, лучший способ обнаружить на сервере конец сеансас клиентом - установить «протокол прощания» между клиентом и сервером.Фиксированный токен публикуется клиентом на сервере, и сервер подтверждает, закрывая канал.Если клиент завершает работу внезапно, то единственный способ узнать об этом на сервере - это настроить протокол сердцебиения, каждый определенный момент бездействия сервер будет пинговать клиента, и клиент должен ответить пингбэком.Если ответа нет, сервер должен прекратить сеанс клиента.

Что касается разделения переменной между потоками, вы можете обратиться: http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

1 голос
/ 08 октября 2011

Насколько я понимаю, у вас нет абсолютно никакого контроля над назначением портов для входящих удаленных соединений TCP. Это работа операционной системы. Сокет закрывается, когда Socket.isClosed возвращает true или когда Socket.getInputStream.read возвращает -1, указывая конец потока .

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