Имейте прослушиватель, реализованный с использованием AsynchronousServerSocketChannel. Я открываю канал, привязываюсь к порту и начинаю принимать соединения. Я могу слушать и читать сообщения. Событие проблемы после закрытия канала мой слушатель все еще принимает данные.AsynchronousServerSocketChannel не закрывает установленные соединения
Я закрываю подключение к серверному каналу, как показано ниже.
this.serverChannel.close();
this.serverChannel = null;
Вот обработчик завершения, чтобы принимать соединения
this.serverChannel
.accept(null,
new java.nio.channels.CompletionHandler<AsynchronousSocketChannel, Void>() {
@Override
public void completed(
AsynchronousSocketChannel result,
Void attachment) {
acceptConnections();
read(new HSLParsingContext(), result);
}
@Override
public void failed(Throwable exc, Void attachment) {
if (!(exc instanceof AsynchronousCloseException))
});
public void read(final HSLParsingContext context,
final AsynchronousSocketChannel channel) {
try {
channel.read(context.buffer, null,
new java.nio.channels.CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer bytesRead, Void attachment) {
try {
HSLSysLogTcpListener.this.logger.infoFmt(
"Bytes received: %s ", bytesRead);
if (bytesRead > 0) {
messageHandler(context, false);
}
if (bytesRead == -1) {
// when nothing is there to read in the
// channel make sure there
// is nothing in the content buffer before
// closing the channel
if (context.content.length() > 0) {
messageHandler(context, true);
}
throw new EOFException();
}
// keep reading data asynchronously
read(context, channel);
} catch (Exception e) {
failed(e, null);
}
}
@Override
public void failed(Throwable e, Void attachment) {
logReadFailureAndClose(channel, e);
}
});
} catch (Throwable e) {
logReadFailureAndClose(channel, e);
}
я вроде чувствую, что AsynchronousSocketChannel чем открыл метод принимает не закрыт. Следовательно, я получаю сообщение сообщения после закрытия AsynchronousServerSocketChannel.
Есть как способ закрыть AsynchronousSocketChannel при закрытии serversocketchannel.Please дайте мне знать лучше полностью остановить AsynchronousServerSocketChannel и asscoiated AsynchronousSocketChannel
i do close in logReadFailureAndClose(). Это произойдет, будет достигнуто i bytesRead == -1 (конец потока) или некоторое время, когда я получаю сброс соединения с помощью сверстника, и он заставляет закрывать chanel. Но бывают случаи, когда ни одно из этих событий не происходит, а использование хочет отменить прослушиватель. В то время я просто закрываю AsynchronousServerSocketChannel. Как я могу получить список AsynchronousSocketChannel, которые еще не закрыты. Является ли это уникальным атрибутом id для каждого AsynchronousSocketChannel ?? –
Также я прочитал о добавлении AsynchronousChannelGroup в AsynchronousServerSocketChannel и вызове shutdown в группе. Будет ли это работать? –
@ KarthikeyanRamasamy Нет, это просто фабрика нитей. Вы должны сделать то, что я сказал в своем ответе: сохранить коллекцию принятых сокетов и закрыть их всех самостоятельно. – EJP