0
I am making a program using sockets but a very strange error appears when I juice two numbers for 2 time. The socket goes down and I don’t know why here is the server code
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Servidor2 {
    public static void main(String[] args) throws IOException {
        new Servidor2();
    }
    ServerSocket servidor;
    ObjectOutputStream resultado;
    ObjectInputStream dados;
    double num1, num2, total = 0.0;
    int operacao;
    char opr = '\n';
    public Servidor2() throws IOException
    {
        JFrame f=new JFrame();  
        JTextField texto = new JTextField(5);
        texto.setEditable(false);
        JButton start=new JButton("Ligar Servidor");  
        JButton stop=new JButton("Parar Servidor");  
        f.add(texto);
        f.add(start);
        f.add(stop);
        f.setLayout(new GridLayout(3,3));  
        start.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                texto.setText("servidor inciado!!");
                final Multi3 m1=new Multi3();  
                final Thread t1 =new Thread(m1); 
                t1.start();  
            }
           });
        stop.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                    try {
                        texto.setText("servidor desligado");  
                        servidor.close();
                        //t1.stop();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
            }  
            });  
        f.setVisible(true);  
        f.pack();
    }
}
class Multi3 implements Runnable{  
public void run(){  
System.out.println("thread is running...");  
double num1, num2, total = 0.0;
int operacao;
char opr = '\n';
//Cria um socket na porta 12342
ServerSocket servidor;
    try {
        servidor = new ServerSocket(22);
        System.out.println("Porta " + servidor.getLocalPort() + " aberta!");
        // Aguarda alguém se conectar. A execução do servidor
        // fica bloqueada na chamada do método accept da classe
        // ServerSocket. Quando alguém se conectar ao servidor, o
        // método desbloqueia e retorna com um objeto da classe
        // Socket, que é uma porta da comunicação.
        System.out.print("Aguardando conexão do cliente...");
        Socket cliente = servidor.accept();
        System.out.println("\nNova conexao com o cliente " + cliente.getInetAddress().getHostAddress() + cliente.toString());
        ObjectOutputStream resultado = new ObjectOutputStream(cliente.getOutputStream());
        ObjectInputStream dados = new ObjectInputStream(cliente.getInputStream());
        operacao = dados.readInt();
        num1 = dados.readDouble();
        num2 = dados.readDouble();
        switch(operacao)
        {
        case 1:
            opr = '+';
            total = (num1 + num2);
            resultado.writeDouble(total);
            resultado.writeChar(opr);
            resultado.flush();
            break;
        case 2:
            opr = '-';
            total = (num1 - num2);
            resultado.writeDouble(total);
            resultado.writeChar(opr);
            resultado.flush();
            break;
        }
        /*
        if (operacao == 1) {
            opr = '+';
            total = (num1 + num2);
        } else if (operacao == 2) {
            opr = '-';
            total = (num1 - num2);
        } else if (operacao == 3) {
            opr = 'x';
            total = (num1 * num2);
        } else {
            opr = '/';
            total = (num1 / num2);
        }*/
       //resultado.close();
       //dados.close();
        //servidor.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
} 
client code
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Cliente2{
    public Socket cliente;
    double num1;
    double num2;
    int operacao = 0;
    char opr;
    JTextField texto1 = new JTextField(5);
    JTextField texto2 = new JTextField(5);
    public static void main(String[] args) {
        new Cliente2();
    }
    public Cliente2()
    {
        JFrame f=new JFrame();  
        JButton connect = new JButton("Conectar");
        JButton stop = new JButton("sair");
        JButton sum=new JButton("+");  
        JButton minus=new JButton("-");  
        JButton multiply=new JButton("*");  
        JButton divide=new JButton("/");  
        f.add(connect);
        f.add(stop);
        f.add(texto1);
        f.add(texto2);
        f.add(sum);
        f.add(minus);
        f.add(multiply);
        f.add(divide);
        connect.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                 try {
                    cliente = new Socket("127.0.0.1", 22);
                    System.out.println("O cliente conectou ao servidor");
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
           });
        sum.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
/*
                try {
                    System.out.println(cliente.isConnected());
                    ObjectInputStream resultado = new ObjectInputStream(cliente.getInputStream());
                   ObjectOutputStream dados = new ObjectOutputStream(cliente.getOutputStream());
                        num1 =  Double.parseDouble(texto1.getText());
                        num2 = Double.parseDouble(texto2.getText());
                        dados.writeInt(1);
                        dados.writeDouble(num1);
                        dados.writeDouble(num2);
                        dados.flush();
                        double total = resultado.readDouble();
                        opr = resultado.readChar();
                        boolean check = true;
                                System.out.println("Total de " + num1 + opr + num2 + " = " + total + " is closed:::: " + cliente.isClosed() + " ?? Is Connected " + cliente.isConnected());
                        resultado.close();
                        dados.close();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }*/
                Client result = new Client();
                result.run();
            }
           });
        minus.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                try {
                    System.out.println(cliente.isConnected());
                    ObjectInputStream resultado = new ObjectInputStream(cliente.getInputStream());
                   ObjectOutputStream dados = new ObjectOutputStream(cliente.getOutputStream());
                        num1 =  Double.parseDouble(texto1.getText());
                        num2 = Double.parseDouble(texto2.getText());
                       /* while (!((operacao >= 1) && (operacao <= 4))) {
                            operacao = Integer.parseInt(JOptionPane.showInputDialog("Qual operação desejada? 1= +, 2= -,3= X,4= / "));
                            if (!((operacao >= 1) && (operacao <= 4))) {
                                System.out.println("Você digitou uma operação inválida.");
                            }
                        }*/
                        dados.writeInt(1);
                        dados.writeDouble(num1);
                        dados.writeDouble(num2);
                        dados.flush();
                        double total = resultado.readDouble();
                        opr = resultado.readChar();
                        boolean check = true;
                                System.out.println("Total de " + num1 + opr + num2 + " = " + total + " is closed:::: " + cliente.isClosed() + " ?? Is Connected " + cliente.isConnected());
                        resultado.close();
                        dados.close();
                        //cliente.close();
                        //cliente.close();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
           });
        f.setLayout(new GridLayout(3,3));  
        f.setVisible(true);  
        f.pack();
    }
    /*************************************************/
    class Client extends Thread {
        public void run(){
                System.out.println(cliente.isConnected());
                ObjectInputStream resultado;
                ObjectOutputStream dados;
                try {
                    resultado = new ObjectInputStream(cliente.getInputStream());
                      dados = new ObjectOutputStream(cliente.getOutputStream());
                        num1 =  Double.parseDouble(texto1.getText());
                        num2 = Double.parseDouble(texto2.getText());
                       /* while (!((operacao >= 1) && (operacao <= 4))) {
                            operacao = Integer.parseInt(JOptionPane.showInputDialog("Qual operação desejada? 1= +, 2= -,3= X,4= / "));
                            if (!((operacao >= 1) && (operacao <= 4))) {
                                System.out.println("Você digitou uma operação inválida.");
                            }
                        }*/
                        dados.writeInt(1);
                        dados.writeDouble(num1);
                        dados.writeDouble(num2);
                        dados.flush();
                        double total = resultado.readDouble();
                        opr = resultado.readChar();
                        boolean check = true;
                        System.out.println("Total de " + num1 + opr + num2 + " = " + total + " is closed:::: " + cliente.isClosed() + " ?? Is Connected " + cliente.isConnected());
                           resultado.close();
                           dados.close();
                      // resultado.close();
                       //dados.close();
                        //cliente.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
          }
        }
    /*********************************************/
}
The error that appears in the system is
java.net.Socketexception: Socket is closed
at java.net.Socket.getInputStream(Unknown Source) at Customer2$Client.run(Customer2.java:211) at Cliente2$2.actionPerformed(Customer2.java:121) at javax.swing.Abstractbutton.fireActionPerformed(Unknown Source) at javax.swing.Abstractbutton$Handler.actionPerformed(Unknown Source) at javax.swing.Defaultbuttonmodel.fireActionPerformed(Unknown Source) at javax.swing.Defaultbuttonmodel.setPressed(Unknown Source) at javax.swing.plaf.basic.Basicbuttonlistener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.Jcomponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.Lightweightdispatcher.retargetMouseEvent(Unknown Source) at java.awt.Lightweightdispatcher.processMouseEvent(Unknown Source) at java.awt.Lightweightdispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.Eventqueue.dispatchEventImpl(Unknown Source) at java.awt.Eventqueue.access$500(Unknown Source) at java.awt.Eventqueue$3.run(Unknown Source) at java.awt.Eventqueue$3.run(Unknown Source) at java.security.Accesscontroller.doPrivileged(Native Method) at java.security.Protectiondomain$Javasecurityaccessimpl.doIntersectionPrivilege(Unknown Source) at java.security.Protectiondomain$Javasecurityaccessimpl.doIntersectionPrivilege(Unknown Source) at java.awt.Eventqueue$4.run(Unknown Source) at java.awt.Eventqueue$4.run(Unknown Source) at java.security.Accesscontroller.doPrivileged(Native Method) at java.security.Protectiondomain$Javasecurityaccessimpl.doIntersectionPrivilege(Unknown Source) at java.awt.Eventqueue.dispatchEvent(Unknown Source) at java.awt.Eventdispatchthread.pumpOneEventForFilters(Unknown Source) at java.awt.Eventdispatchthread.pumpEventsForFilter(Unknown Source) at java.awt.Eventdispatchthread.pumpEventsForHierarchy(Unknown Source) at java.awt.Eventdispatchthread.pumpEvents(Unknown Source) at java.awt.Eventdispatchthread.pumpEvents(Unknown Source) at java.awt.Eventdispatchthread.run(Unknown Source)
Here gave u lot of error, minus that of the question. Explain how to simulate the error.
– user28595
Objectinputstream result = new Objectinputstream(.getInputStream() client); basically the socket closes from somewhere
– Claudio
There was no error here. You need to explain what you did that triggered this error. Your code has many problems and ta firing a lot of exception, minus the question
– user28595
ok first start the server, then make an account of Umar because I haven’t done the other accounts
– Claudio
When you close any of the streams connected to the socket, it also closes. You need to check that it is closed with the method
isClosedbefore invoking a new operation.– user28595
on the server or client?
– Claudio
Where the exception burst.
– user28595
so I basically shut down input and output streams? but I have already close the 2 and continue to close the socket, which continues the error when it receives from the Input object;
– Claudio
You don’t understand my comment. That’s why the socket closes. When closing a stream connected to the socket, all streams and the socket itself are closed. You will probably need to reopen each operation.
– user28595
OK with what method then
– Claudio
Read my last 3 comments carefully.
– user28595
reopen what in this case?? the socket or the streams
– Claudio
All, because when one closes, all are closed. But keep closing each of them separately, to facilitate the life of the garbage collector.
– user28595
ok but could indicate ways of it. for to reopen in this case the streams I see reset method?? of the socket I am still looking for
– Claudio