Sending data via sockets ():: Software caused connection abort: socket write error

1

I have a client server program that is working when I request the communication, but when the sending of data starts the program generates the following error:

Estabelecar conexão.......
Conexão estabelecida.......
Enviar mensagem......
Mensagem enviada.
Resposta do servidorclient.RegistosOperacao@5ec0a365
Mensagem :
OK
Erro: Software caused connection abort: socket write error

Client Class:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Client {

    public static void main(String[] args) {
        try {
            /*
            1. Estabelecer uma conexao com o servidor
            2. trocar mensagem com o servidor
             */
            //criar a conexao entre o cliente e o servidor
            System.out.println("Estabelecar conexão.......");
            Socket socket = new Socket("localhost", 5555);
            System.out.println("Conexão estabelecida.......");
            //criação dos strem de entrada e saida

            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

            System.out.println("Enviar mensagem......");

            List<RegistosOperacao> listaDeRegisto = new ArrayList<>();

            BuscaDeRegistos b = new BuscaDeRegistos();
            listaDeRegisto = b.Pesquisa();
            RegistosOperacao r = new RegistosOperacao();
            r.setOperacao("Conectar");
            r.setTimeStampNew(Date.valueOf(LocalDate.MAX));
            r.setTimeStampOld(Date.valueOf(LocalDate.MAX));
            output.writeObject(r);
            output.flush();


            System.out.println("Mensagem enviada.");

            r = (RegistosOperacao) input.readObject();

            System.out.println("Resposta do servidor" + r);

            if (r.getOperacao().equalsIgnoreCase("OK")) {
                System.out.println("Mensagem :\n" + r.getOperacao());

                output.writeObject(r);
                output.flush();


            } else {

                System.out.println("Erro :" + r.getOperacao());

            }
            input.close();
            output.close();
            socket.close();

        } catch (Exception ex) {
            System.out.println("Erro: " + ex.getMessage());

        }
    }

}

Server Class:

import client.RegistosOperacao;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;



public class Server {

    private ServerSocket serverSocket;

    private void criarServerSocket(int porta) throws IOException {

        serverSocket = new ServerSocket(porta);

    }

    private Socket esperaConexao() throws IOException {


        Socket socket = serverSocket.accept();
        return socket;

    }

    private void fecharSocket(Socket s) throws IOException {

        s.close();
    }

    private void trataConexao(Socket socket) throws IOException {
        //ponto entre o cliente -------sokect-----servidor
        // protocolo de de comunicação
        //Criar strems de entrada e saída
        //tratar a conversa entre cliente e serfvidor(tratar protocolo)
        try {

            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            /*protocolo
            Cliente -------> Hello
                server<--------Hello word
             */
            System.out.println("Tratando.......");

            RegistosOperacao r = (RegistosOperacao) input.readObject();



            String operacao = r.getOperacao();

            if (operacao.equalsIgnoreCase("Conectar")) {
                r.setOperacao("OK");



            }
            else {
                try {



                } catch (Exception e) {

                }

            }

            output.writeObject(r);
            output.flush();

            //4.2- fechar strem de entrada e saída
            input.close();
            output.close();

        } catch (IOException e) {
            System.out.println("Problema de tratamento da conexão com o cliente" + socket.getInetAddress());
            System.out.println("Erro: " + e.getMessage());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            //final do tratamento do protocolo
            //4.1-Fechar socket de comunicação ente servidor/Cliente
            fecharSocket(socket);

        }

    }







    public static void main(String[] args) {

        try {
//até que o processo não seja interropido ele vai ficar a repetir ou a espera  

            Server server = new Server();
            System.out.println("Aguardando conexão");
            server.criarServerSocket(5555);
            while (true) {
                Socket socket = server.esperaConexao();//protocolo
                System.out.println("Cliente Conecatado");
                //Outro prosesoo
                server.trataConexao(socket);
                System.out.println("Cliente finalizado");
            }
        } catch (IOException ex) {
            //trata exceção
            System.out.println("Erro no servidor" + ex.getMessage());
        }
    }

}
    
asked by anonymous 08.03.2018 / 17:07

1 answer

0

Within the method connexion you are closing the input and output variables. This should only be done, for example, after the client has sent a shutdown command.

    
08.03.2018 / 18:19