Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

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 errao: 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

package br.com.teste.servidor;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class ServidorPrincipal {
    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

package br.com.teste.cliente;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Cliente {

    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();

    }

}
2 respostas
solução!

Testei o código do seu servidor (mas sem a parte de escrever no arquivo) e quando fechei o scanner logo após saidaCliente.close(); não aconteceu erro. Obs: não testei/usei o seu cliente.

Bom dia Luz, muito obrigado pela resposta, era isso mesmo, eu estava fechando o Scanner antes, e isto faz com que ele feche o InputStream e consequentemente o Socket, deixei para fechar tudo no final e deu certo.