Я использую 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
?
Есть ли способ обойти это?
write
. Кстати, вObjectOutputStream
нет методаwrite(Object)
. - person Marko Topolnik   schedule 26.03.2014out.writeObject(Object)
внутри попытки, она не блокируется и сообщение отправляется. Любые идеи? - person Ian2thedv   schedule 26.03.2014out
. @MarkPeters В чем смысл? Для каждого клиента, подключенного к серверу, создается объект-клиент, в котором хранятся сокет, потоки ввода, потоки вывода и остальные детали клиента. Попытка с ресурсами, которая находится внутри потока, содержащегося в клиентском объекте, открывает необходимые ресурсы, проверяет входящие сообщения и закрывает ресурсы после отключения клиента. sendMessage — это метод объекта-клиента. Таким образом, сообщения могут быть отправлены любому клиенту. - person Ian2thedv   schedule 26.03.2014