Conexão Socket

8 respostas Resolvido
MisterPompo

Olá pessoal, tudo bem?

Seguinte, estou fazendo um código em que o cliente manda uma solicitação e uma string para o servidor, assim que o servidor receber, ele lerá e enviará uma outra string para o cliente. O problema é que quando eu chamo o método (Objeto BufferedReader).readline no cliente para ler a mensagem do servidor, da um erro dizendo que a conexão Socket foi fechada. Está tudo ocorrendo perfeitamente com o servidor, o problema está só no cliente. Vou deixar o código do cliente e a mensagem de erro, o código do servidor é bem simples, por isso não vou deixa-lo aqui. Mas caso precisem, é só me avisar!

public class Cliente {

public static void main(String [] args) {
	
	Cliente clica = new Cliente();
	clica.fazendoConexao();
	
}

public void fazendoConexao() {
	
	String qeq = "Qualquer coisa";
	
	try {
		
		System.out.println("Aguardando Conexão");
		Socket sock = new Socket("127.0.0.1", 7000);
		System.out.println("Conectado");
		PrintWriter escritor = new PrintWriter(sock.getOutputStream());
		InputStreamReader input = new InputStreamReader(sock.getInputStream());
		BufferedReader leitor = new BufferedReader(input);
		Cliente client = new Cliente();
		client.enviador(escritor, qeq);
		client.receptor(leitor);
		sock.close();
		
	}
	catch(Exception ex){ex.printStackTrace();}
}

public void enviador(PrintWriter writer, String qeq2) {
	
	writer.println(qeq2);
	writer.flush();
	writer.close();
	System.out.println("Enviado");
}

public void receptor(BufferedReader reader) {
	
	try {
		String recebido = null;
		
		while (recebido == null) {
			
		recebido = reader.readLine();
		System.out.println("lido");
		
		}
		
		System.out.println(recebido);
		
	}catch(IOException ex) {ex.printStackTrace();}
}

}

Aqui é o erro:

8 Respostas

Jonas_B_a_r_r_o_s

Tire isso: sock.close();

rmendes08

É interessante que você coloque o código do servidor sim, pois provavelmente você está fechando o socket do lado servidor sem notificar o cliente.

MisterPompo

Então, eu não acredito que isso esteja acontecendo, mas fica ai o código:

public class Servidor {

public static void main(String [] args) {
	Servidor servi = new Servidor();
	servi.vamosFazerAGui();
	servi.go();
}

public void vamosFazerAGui() {
	JFrame janela = new JFrame("Servidor");
	JLabel texto = new JLabel();
	texto.setText("Já ta rolando");
	janela.setSize(400, 200);
	janela.getContentPane().add(BorderLayout.SOUTH, texto);
	janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	janela.setVisible(true);

}

public void go() {
	
	try {
		ServerSocket serverSock = new ServerSocket(7000);
		
		while(true) {
			
			Socket clientSocket = serverSock.accept();
			
			InputStreamReader input = new InputStreamReader(clientSocket.getInputStream());
			
			BufferedReader leitor = new BufferedReader(input);
			
			String pega = leitor.readLine();
			
			System.out.println(pega);
			
			Servidor servi2 = new Servidor();
			
			servi2.go2(pega, clientSocket);
			
			//serverSock.close();
		}
		
	}
	
	catch(IOException ex) {
		
		ex.printStackTrace();
		
	}
}

public void go2(String banana, Socket clientSocket2) {
	
	String resultado = "1,2,3,4,5,6";
	
	if(banana != null) {
		
		System.out.println("Ta dando certo, partiu ficar rico");
		
		try {
			
			PrintWriter writer = new PrintWriter(clientSocket2.getOutputStream());
			
			writer.println(resultado);
			
			writer.flush();
			
			writer.close();
			
			System.out.println("Enviado :)");
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	else{
		
		System.out.print("Deu errado!");
		
	}
}

}
Isso é o que aparece no console, conforme o planejado.(Ignore as frases, é só pra dar uma animada kkk)

As mesmas frases aparecem duas vezes porque tentei me conectar com o cliente duas vezes, então o procedimento de printar as frases também ocorreu duas vezes.

MisterPompo

Não funcionou, cara. Eu acho que a questão é que quando o cliente solicita conexão, o servidor cria outra conexão de soquete por outra porta TCP, e a conexão inicial é fechada. É só uma suposição, mas faria sentido se fosse isso.

rmendes08
Solucao aceita

Dei uma conferida na documentação da classe, o problema é aqui:

writer.close();

quando você chama o close() em algum stream mais externo, a operação vai sendo delegada até o stream mais interno. Assim, quando você chama o close() do PrintWriter a operação vai sendo encadeada até chamar o close() do SocketOutputStream. Quando você fecha o stream do Socket, seja de entrada ou saída, o socket também é fechado. Portanto, a solução é quando escrever no socket, faça apenas o flush() da operação e deixe para fechar o socket somente no final.

peczenyj

de cara isso pareceu um problema do writer.close()

agora tem umas formas de ter certeza. uma delas é usar um debugger e verificar o estado do socket.

outra forma é desconfiar que o cliente pode ter desconectado (as vezes acontece). ai para depurar o que acontece no nivel de rede a ferramenta mais adequada é o WireShark

não é incomum devido a um timeout, ou a algo relacionado a natureza do servidor, que a conexão seja fechada ou perdida. em geral isso da erros levemente diferentes ( o famoso “as vezes da erro” ).

trabalhar com sockets sem conhecer o wireshark é trabalhar as escuras.

MisterPompo

Realmente, o problema era o writer.close(), mas mesmo assim eu agradeço pela sua resposta. Vou pesquisar sobre WireShark, pois com certeza no futuro pode ajudar a evitar problemas. Obrigado e até mais.

MisterPompo

Deu certo, valeu mesmo pela resposta :). Mas eu tenho mais uma duvida só, é para tirar o writer.close() do servidor ou do cliente? Eu tirei dos dois e funcionou, mas quero saber só para ter certeza.

Criado 5 de setembro de 2016
Ultima resposta 6 de set. de 2016
Respostas 8
Participantes 4