Socket is closed

Estou tentando criar uma aplicação bem simples, realizar apenas uma conexão TCP/IP utilizando Java Socket, gravar a mensagem do cliente em um arquivo e retornar a resposta ao cliente, porém a última parte, que seria enviar a resposta ao cliente, não está funcionando, retorna o seguinte erro: java.net.SocketException: Socket is closed
at java.base/java.net.Socket.getOutputStream(Socket.java:970)
at br.com.teste.servidor.ServidorPrincipal.main(ServidorPrincipal.java:46)
Podem me ajudar? seguem os códigos.
ServidorPrincipal.java

public static void main(String[] args) throws IOException {
	ServerSocket servidor = new ServerSocket(30062);
	Socket socket;
	File arquivo;
	FileWriter fw;
	Scanner s;
	String mensagem;
	BufferedWriter bw;
	try {

		System.out.println("Iniciando Servidor");

			socket = servidor.accept();
			arquivo = new File("log.txt");
			fw = new FileWriter(arquivo, true);
			s = new Scanner(socket.getInputStream());
			mensagem = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")) + " - "
					+ s.nextLine();
			System.out.println("Cliente conectado: " + socket.getInetAddress().getHostAddress());

			// Gravar arquivo
			bw = new BufferedWriter(fw);
			bw.write(mensagem);
			bw.newLine();
			bw.close();
			s.close();
			fw.close();

			// Enviar resposta
			PrintStream saidaCliente = new PrintStream(socket.getOutputStream());
			saidaCliente.println(mensagem);
			saidaCliente.close();
			socket.close();]
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Cliente.java

public static void main(String[] args)
		throws ClassNotFoundException, InterruptedException, UnknownHostException, IOException {
	Socket socket = new Socket("localhost", 30062);
	try {

		System.out.println("Conectando");
		Scanner s = new Scanner(System.in);
		System.out.print("Digite a mensagem a ser enviada para o servidor: ");
		String msg = s.nextLine();
		s.close();
		PrintStream ps = new PrintStream(socket.getOutputStream());
		ps.println(msg);
		Scanner respostaServidor = new Scanner(socket.getInputStream());
		while (respostaServidor.hasNextLine()) {

			String linha = respostaServidor.nextLine();
			System.out.println(linha);
		}

		respostaServidor.close();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	socket.close();

}

Esse Scanner usa o InputStream do Socket.

Aqui você fecha o Scanner, que por sua vez fecha o InputStream, que fecha o Socket.

Deixa para fechar tudo depois de enviar a resposta.

Muito obrigado pela resposta, era isso mesmo, fiquei o dia todo quebrando a cabeça. Salvou meu resto do dia :sweat_smile:

1 curtida