Leitura não bloqueante em socket

Olá galera…

Tenho uma aplicação cliente-servidor que tem como objetivo compartilhar telas do servidor com os clientes (compartilhamento de tela de um professor com seus alunos).

Estou tentando uma abordagem single-thread. Ou seja o servidor abre uma única thread que fica capturando a tela e enviando para cada um dos usuário conectados (armazenados em um ArrayList). Meu problema é o seguinte, quero que quando o aluno feche o navegador (o cliente é uma applet), o cliente envie uma mensagem para o servidor avisando que quer desconectar, para que o servidor feche a conexão…

Tem como eu colocar um read não bloqueante dentro deste laço no meu método run. Coisa do tipo, se tiver alguma mensagem de um cliente, a leio e trato a desconexão, senão, continua fazendo o laço normalmente?

Para tal serviço, você deve usar um Multicast Socket ( http://java.sun.com/j2se/1.5.0/docs/api/java/net/MulticastSocket.html ) porque você pode mandar a tela para todos os alunos de uma vez.

É que Com MulticastSocket eu uso, invariavelmente, o protocolo UDP…E, em várias redes eu tenho problemas com UDP…Além do mais, o datagrama tem um limite de volume de dados que é menor do que eu preciso. Já dividi em mais de um datagrama, todavia, no cliente raramente consigo receber todos os pacotes necessários para montar um única tela…
Talvez vocês tenham alguma sugestão sobre a utilização do UDP que eu ainda não consegui ver…

Mas mesmo assim, a leitura não bloqueante ainda me gera dúvidas :wink:

Para fazer leitura não-bloqueante, você pode usar NIO, mas aí você precisa entender como é que isso funciona porque é bastante difícil de usar. (Talvez você precise se conectar à Matrix, como o Neo :stuck_out_tongue: )

Não existe outra forma? Usando IO padrão?

A API de Sockets do Unix ou do Windows tem o método “select” (e também “epoll” no Linux) que lhe permite fazer isso (escolher entre N sockets qual está disponível para fazer determinada operação e trabalhar com uma thread apenas); mas essa API só é acessível no Java via NIO de forma indireta. (via http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/SelectableChannel.html e http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/Selector.html ). Nunca fiz um programa com NIO, portanto não sou o melhor guia para lhe ajudar.