NIO SocketChannels

2 respostas
Sad7

Ola pessoal,

Estou migrando minhas conexões para NIO e estou com uma dúvida.
No Socket antigo, uma escrita sincrona de um byte[], fariamos assim:

// "socket" é um Socket
OutputStream out = socket.getOutputStream();

synchronized (out) {
     out.write(meuByteArray);
     out.flush();
}

Agora no NIO, eu possuo um SocketChannel e para escrever faço assim:

// "socket" é um SocketChannel

ByteBuffer buffer = ByteBuffer.wrap(containerBytes);
socket.write(buffer);
buffer.clear();
buffer = null;

Se eu sincronizar a variavel socket, o read dele tambem sera sincronizado, e queremos somente sincronizar o write .

Como podemos fazer uma escrita sincrona no SocketChannel?

Obrigado pela ajuda.

2 Respostas

E

Pelo que imagino, você não pode fazer isso “diretamente” (já que quando você cria um socket assíncrono em alguns sistemas operacionais, como o Windows, você não pode fazer algo que é “meia calabresa, meia mussarela”), mas você pode simular isso lembrando-se que write retorna um Future:

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousSocketChannel.html#write(java.nio.ByteBuffer)

Como você deve saber, um Future é algo que você pode esperar (talvez com um timeout) usando o método get:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get(long,%20java.util.concurrent.TimeUnit)

Sad7

Nossa, ruim isso né, no modo anterior é muito fácil fazer isso, e no NIO que seria uma melhora, fica mais difícil, que coisa.

Eu nunca tinha visto Future, vou dar uma olhada a respeito.

E a documentação que voce me enviou é do java 7, o Future é somente do java 7? Pois nos ambientes que rodam meu aplicativo, eu nao posso garantir o java 7, somente o 6.

Obrigado pela ajuda.

Criado 8 de dezembro de 2011
Ultima resposta 8 de dez. de 2011
Respostas 2
Participantes 2