Bom dia a todos,
Pessoal to com probleminha com socket. Bom o cenário é o seguinte:
Tenho um servidor e vários clientes conectados neste servidor, é
tipo um servidor chat. Onde os clientes mandam uma mensagem, esta vai
para o servidor, o servidor grava em banco e repassa para o destino.
Para isso eu utilizo SocketChannel com NIO Non-Block.
pois bem tudo funciona perfeitamente quando estou na intranet ou em
locais q utilizam banda larga. O problema acontece quando tem cliente
q utiliza conexão discada ou tem conexão muito lenta.
O código esta assim:
Procedimento para enviar os bytes
ByteBuffer buf = null;
if (obj instanceof Pacote) {
buf = NIOUtilsNonBlock.ObjectToBuffer(obj);
} else {
Debug.registra("Aplicação esta tentando transmitir um objeto que não é um pacote", Debug.INFO);
buf = NIOUtilsNonBlock.ObjectToBuffer(obj);
}
while (buf.hasRemaining()) {
int y = channel.write(buf);
if(y == 0){
Debug.registra("Enviando "+y+" restante "+buf.remaining(), Debug.INFO);
Thread.sleep(50);
}
}
Procedimento para recebe os bytes
buf = ByteBuffer.allocate(sc.socket().getReceiveBufferSize());
buf.flip();
boolean readSocket = true;
while (readSocket) {
buf.clear();
bytesRead = sc.read(buf);
buf.flip();
if (bytesRead < 0)
break;
if (bytesRead == 0 ) {
//Debug.registra(bytesRead+" bytes lidos", Debug.INFO);
Thread.sleep(50);
readSocket = true;
continue;
}else{
readSocket = false;
}
}
Bom vamos ao problema, tem horas, não é sempre q no servidor fica gerando log
“Enviando 0 restante 519” , esse 519 varia e ao mesmo tempo o cliente fica
“0 bytes lidos”. isso gera umas 500 linhas, e depois ele consegue mandar e vai embora.
Pelo q da pra entender o servidor não consegue enviar os bytes e ao mesmo tempo o cliente
não consegue ler eles.
Alguém já passou por isso, agora eu não sei se isso é um problema ou se isso é normal, se é
problema em alguma parte do meu código, já esgotaram todas as minha alternativas e nada.
