Использование ресурсов попытки с ресурсами вне попытки

Я использую SocketChannel для отправки сообщения между сервером и клиентом. Как только клиент подключается к серверу, сервер открывает InputStreams и OutputStream в попытке с использованием ресурсов, чтобы получать сообщения от клиента и отправлять сообщения в клиенту. , вот так:

try (ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
     ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {}

Я хочу получить доступ к out вне попытки. Попытка содержит цикл while, который неоднократно проверяет, пришли ли сообщения in, что работает нормально.

Я попытался установить глобальную переменную, скажем, global_out, выполнив:

ObjectOutputStream global_out;
...
try (ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
     ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {

    setOut(out);
    while(should_check) {
        Object message = in.readObject();   
        //do something
    }
}

И затем я попытался написать в этот OutputStream, вот так:

public void sendMessage(Object message) {
    global_out.writeObject(message);
}

Я вызываю sendMessage(Object) только тогда, когда should_ceck является true, и проверяю, является ли global_out null, что не так. Однако sendMessage(Object) никогда не возвращается. Если global_out не является null, то должно быть что-то установлено, так почему же ресурсы нельзя использовать до завершения try-with-resources?

Есть ли способ обойти это?


person Ian2thedv    schedule 26.03.2014    source источник
comment
Я не вижу, чтобы все это имело какое-либо отношение к попытке с ресурсами. У вас возникла проблема с блокировкой вызовов write. Кстати, в ObjectOutputStream нет метода write(Object).   -  person Marko Topolnik    schedule 26.03.2014
comment
@MarkoTopolnik изменить на writeObject (объект). Я предположил, что это связано с попыткой с уловом, потому что если я out.writeObject(Object) внутри попытки, она не блокируется и сообщение отправляется. Любые идеи?   -  person Ian2thedv    schedule 26.03.2014
comment
Откуда вызывается sendMessage? Вызывается ли он синхронно из блока try? Асинхронно? В общем, бессмысленно и опасно передавать ссылку на ресурс, открытый в операторе try-with-resources, потому что ресурс открыт только во время выполнения блока try в любом случае (в конце оператора ресурсы закрываются; в этом весь смысл заявления). Итак, поскольку global_out находится в допустимом состоянии только в пределах области выполнения блока try, зачем вам нужен доступ к нему вне области действия? Какова цель?   -  person Mark Peters    schedule 26.03.2014
comment
@MarkPeters Я думаю, что цель ясна: OP не хочет утомительно передавать этот поток всем методам. По сути, ему нужна динамическая область действия для потока.   -  person Marko Topolnik    schedule 26.03.2014
comment
@ Ian2thedv Когда вы перемещаете вызов в пределах попытки, вы также меняете время этой записи. Может быть что-то в другом промежуточном коде, который вызывает блокировку.   -  person Marko Topolnik    schedule 26.03.2014
comment
sendMessage вызывается вне блока try асинхронно. Ничто в попытке не коснется out. @MarkPeters В чем смысл? Для каждого клиента, подключенного к серверу, создается объект-клиент, в котором хранятся сокет, потоки ввода, потоки вывода и остальные детали клиента. Попытка с ресурсами, которая находится внутри потока, содержащегося в клиентском объекте, открывает необходимые ресурсы, проверяет входящие сообщения и закрывает ресурсы после отключения клиента. sendMessage — это метод объекта-клиента. Таким образом, сообщения могут быть отправлены любому клиенту.   -  person Ian2thedv    schedule 26.03.2014