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!
É 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 {
publicstaticvoidmain(String[]args){Servidorservi=newServidor();servi.vamosFazerAGui();servi.go();}publicvoidvamosFazerAGui(){JFramejanela=newJFrame("Servidor");JLabeltexto=newJLabel();texto.setText("Já ta rolando");janela.setSize(400,200);janela.getContentPane().add(BorderLayout.SOUTH,texto);janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);janela.setVisible(true);}publicvoidgo(){try{ServerSocketserverSock=newServerSocket(7000);while(true){SocketclientSocket=serverSock.accept();InputStreamReaderinput=newInputStreamReader(clientSocket.getInputStream());BufferedReaderleitor=newBufferedReader(input);Stringpega=leitor.readLine();System.out.println(pega);Servidorservi2=newServidor();servi2.go2(pega,clientSocket);//serverSock.close();}}catch(IOExceptionex){ex.printStackTrace();}}publicvoidgo2(Stringbanana,SocketclientSocket2){Stringresultado="1,2,3,4,5,6";if(banana!=null){System.out.println("Ta dando certo, partiu ficar rico");try{PrintWriterwriter=newPrintWriter(clientSocket2.getOutputStream());writer.println(resultado);writer.flush();writer.close();System.out.println("Enviado :)");}catch(IOExceptione){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.
Solucao aceita
rmendes08
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.