java server disconnects idle users after 5 minutes

Posted on

Question :

I am using this Java methodology for connecting between client and server, I copied it from the internet, and it helped me a lot, but the server allows the user to stay connected while he is sending messages, but if the user stays an average time of 5 minutes without sending anything it is disconnected.
How can I increase this time to about 30 minutes or disable this disconnection by inactivity?

  

Settings:
    Netbeans 8.0
    Windows Seven Ultimate 64 Bit

Follow the code:

package redes;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatCliente extends JFrame {  

    JTextField textoParaEnviar;
    PrintWriter escritor;
    Socket socket;
    String nome;
    JTextArea textoRecebido;
    Scanner leitor;


    private class EscutaServidor implements Runnable{

        public void run() {
            try{
                String texto;
                while((texto=leitor.nextLine()) != null){
                    textoRecebido.append(texto+"n");
                }
            }catch(Exception x){}
        }
    }

    public ChatCliente(){

        super("Chat");
        Font fonte = new Font("Sefif", Font.PLAIN,26);
        textoParaEnviar = new JTextField();
        textoParaEnviar.setFont(fonte);
        JButton botao = new JButton("Enviar");
        botao.setFont(fonte);
        botao.addActionListener(new EnviarListener());

        Container envio = new JPanel();
        envio.setLayout(new BorderLayout());
        envio.add(BorderLayout.CENTER, textoParaEnviar);
        envio.add(BorderLayout.EAST, botao);
        getContentPane().add(BorderLayout.SOUTH,envio);

        textoRecebido= new JTextArea();
        textoRecebido.setFont(fonte);
        JScrollPane scroll= new JScrollPane(textoRecebido);
        getContentPane().add(BorderLayout.CENTER, scroll);

        configurarRede();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500,500);
        setVisible(true);
    }

    private class EnviarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            escritor.println(nome+" : "+textoParaEnviar.getText());
            escritor.flush();
            textoParaEnviar.setText("");
            textoParaEnviar.requestFocus();
        }
    }

    private void configurarRede(){
        try{
            socket = new Socket("127.0.0.1",5000);
            escritor = new PrintWriter(socket.getOutputStream());
            leitor=new Scanner(socket.getInputStream());
            new Thread(new EscutaServidor()).start();
        }catch(Exception e){}
    }

    public static void main(String[] args) {
        new ChatCliente();
    }

}
package redes;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ChatServer {
    List<PrintWriter> escritores =  new ArrayList<>();

    public ChatServer(){

        class EscutaCliente implements Runnable{

            Scanner leitor;
            public EscutaCliente(Socket socket){
                try{
                    leitor =  new Scanner (socket.getInputStream());
                }catch(Exception e){

                }
            }


            void encaminharParaTodos(String texto){
                for(PrintWriter w: escritores){
                    try{
                        w.println(texto);
                        w.flush();
                    } catch(Exception x){}
                }
            }


            public void run() {
                try{
                    String texto;
                    while((texto=leitor.nextLine()) != null){
                        System.out.println(texto);
                        encaminharParaTodos(texto);
                    }
                }catch(Exception x){}
            }
        }

        ServerSocket server;
        try {
            server = new ServerSocket(5000);
            while(true){
                Socket socket = server.accept();
                new Thread(new EscutaCliente(socket)).start();
                PrintWriter p = new PrintWriter(socket.getOutputStream());
                escritores.add(p);
            }

        } catch (IOException e) {}
    }

    public static void main(String[] args) {
        ChatServer c= new ChatServer();
    }
}
package redes;

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

public class ConselhoCliente {

    /**
     * @param args
     * @throws IOException 
     * @throws UnknownHostException 
     */
     public static void main(String[] args) throws UnknownHostException, IOException {
        //Socket conex√£o de rede
         Socket socket = new Socket("127.0.0.1",5000); 
         Scanner s = new Scanner (socket.getInputStream());
         System.out.println("Mensagem"+s.nextLine());
         s.close();

     }

}
package redes;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ConselhoServidor {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        ServerSocket server = new ServerSocket(5000);

        //aguarda chegada de novos clientes
        while(true){
            Socket socket=server.accept();
            try (PrintWriter w = new PrintWriter(socket.getOutputStream())){
                w.println("Aprenda Java");
            }
        }
    }

}

    

Answer :

Just do this

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), TempoParaTimeoutEmMilissegundos);

Or

socket.setSoTimeout(timeout)

Fonts

  

link
   link

    

In addition to defining timeout , as Paul’s answer already explains, it is interesting to implement a mechanism to automatically reconnect the user in the event of a connection to the Internet.

The problem is that setting a timeout is not enough to ensure that the user will not be disconnected. If its Internet fails even though for another few seconds another network error will occur.

Think of something like:

timeout = 0 //tempo infinito
while (!terminarPrograma) {

    socket = conectar()
    socket.setSoTimeout(timeout)
    aguardarSocketTerminar() 

}

    

Leave a Reply

Your email address will not be published. Required fields are marked *