Duvida readLine() (BufferedReader, Sockets)

5 respostas
Z

Estou tentando fazer um servidor e cliente utilizando sockets.

Fiquei com dúvidas na linha 35: “line = in.readLine();”.

Eu quero entender se o comando readLine fica aguardando uma mensagem ser recebida, semelhante ao funcionamento do .accept que aguarda uma conexão, ou se ele simplesmente verifica se há algo para ler e, se não houver, continua o while.

Realizando alguns testes, me pareceu que ele não aguarda, simplesmente tenta ler. Como não é sempre que há algo para ler, ele vai para o catch e finaliza o programa.

Podem ajudar?
Obrigado.

import java.io.*;
import java.net.*;
import java.lang.*;

public class PkrServidor {
  public static void main(String[] args) {
      try {
    	  ServerSocket serv = new ServerSocket(12346);
    	  System.out.println("Servidor iniciado, ouvindo a porta " + 12346);

    	  while(true) {
             Socket clie = serv.accept();
             new ThreadCliente(clie).start();
    	  }    
      }
    catch(Exception e) {}
  }
}

class ThreadCliente extends Thread {
  private Socket cliente;
  public ThreadCliente(Socket cliente) {
	System.out.println("b" + cliente);
        this.cliente = cliente; 
  }
  public void run() {
	BufferedReader in = null;
	PrintWriter out = null;
	String line;
    try {
    	in = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
    	out = new PrintWriter(cliente.getOutputStream(), true);
        while (true) {
        	try {
        		line = in.readLine();
        		System.out.println(line.length());
        		if (line.length() > 0) {
        			System.out.println(line);
        			out.println("ok");
        		}
        	} catch(IOException e) {
        		System.out.println("Read failed");
        		System.exit(-1);
        	}
        }
    }
    catch(IOException e) {
       System.out.println("Excecao ocorrida na thread: " + e.getMessage());
    }     
   } 
 }

5 Respostas

T

Diferentemente de um arquivo, um read em um socket pode eventualmente retornar 0 bytes. Não testei com readLine, que em tese deveria esperar até que chegasse um separador de linha.

Em particular, não gosto nem um pouco de tratar sockets como sendo arquivos-texto; mesmo o protocolo HTTP tenta passar por cima desse problema de não ter comprimentos definidos e ter de ficar procurando fins de linha usando aquele tag no header chamado “Content-Length”.

K

Vejo 2 blocos de catch, afinal, em qual dos dois ele acaba caindo? Consigo usar o método “readLine()” da classe BufferedReader normalmente para mensageria nos meus projetos pessoais usando Sockets.

Inté.

Z

KWill,

Ele cai no catch que mostra a mensagem “Read failed”.
No meu teste, enviei uma mensagem do cliente para o servidor, e funcionou. Logo em seguida ele caiu no catch e deu o System.exit, porque não mandei nenhuma outra mensagem.
Eu preciso saber como deixar o servidor aguardando por alguma mensagem, do mesmo modo que é feito com o “.accept”. Acredito que não devo deixar o while rodando até conseguir ler algo no .readLine(), correto?

thingol,

Essa é a única maneira que sei fazer, o que devo pesquisar para melhorar?

K

Desconfio que a outra ponta da conexão deve estar desconectando então, se você tem controle sobre a outra ponta da conexão pare de desconectar a outra ponta da conexão (o cliente). Use o método “flush()” nos OutputStreams dos Sockets para tentar garantir o envio das informações.

Inté.

Z

Ah sim, entendi. Acabei prestando atenção somente no servidor.
Chegando ao final do arquivo cliente, o programa é finalizado e a conexão também. Preciso arranjar uma maneira de fazer o programa continuar ativo.
Obrigado!

Criado 15 de junho de 2009
Ultima resposta 15 de jun. de 2009
Respostas 5
Participantes 3