Problema ao ler e escrever em SocketChannel

2 respostas
R

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.

2 Respostas

T

É que a conexão é lenta mesmo :frowning:
Você disse 50 * 500 = 25 segundos - isso não é pouco, considerando uma conexão discada?

R

Tudo bom thingol,

Mas é normal na hora de escrever no socket ele retornar 0, e o mesmo na hora de fazer ler ele ler 0 ?
Ai depois de um tempo q ele fica no while ele consegue enviar.

Criado 12 de junho de 2007
Ultima resposta 12 de jun. de 2007
Respostas 2
Participantes 2