style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

SERVER HILO POR CONEXION

El problema aqui es que tan pronto algun cliente se conecta, el queda conectado infinitamente, si trato de cerrar la conexion con este servidor ya quedo desconectado y me toca reiniciar la aplicacion cliente para que pueda volver a mandar informacion.

este en un sencillo ejemplo que hice para el manejo de tramas, del cliente recibo una trama el server procesa esa trama y segun el codigo de esa trama se ejucate una funcion a realizar y contrulle una trama de respuesta.

me gustaria añadirle a este server 3 cosas:

1). que desconecte los clientes que después de 1 minuto esten inactivos osea que no esten consultado el socket server
y si el server cierra la conexion en el cliente que hay que indicarle para no tener que reiniciar el aplicativo

2). manejo de timeout que si el cliente intenta conectar al server y no recibe respuesta en 20 segundos recibir una señal para mandar mensaje respectivo

3) como seria para añadir un log en el lado del server

dejo acontinuacion el server y cliente

/**
 *
 * @author hackchan
 */

public class ServidorService

{
    private ServerSocket serverSocket;
    private Socket socket;
 

    public ServidorService()
    {
      serverSocket=null;
      socket=null;
        try {        
           
            serverSocket = new ServerSocket(6666);
       
           
           
              while(true)
              {
       
                   socket = serverSocket.accept();
                   new Thread (new ListenerSocket(socket) ).start();
              }
        } catch (IOException ex) {
            Logger.getLogger(ServidorService.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       
       
    }
   
   

   
}

/**
 *
 * @author hackchan
 */

public class ListenerSocket implements  Runnable{
   
   private  final String ENCODING = "ISO-8859-1";
   private Socket socket;

   private ObjectOutputStream outputObejct;
   private ObjectInputStream inputObject;
   
   
   private DataOutputStream outputdata;
   private DataInputStream  inputdata;
   
   
   //private InputStreamReader inputl;
   
   //version 3 en Uso
   private BufferedReader bufferInput;
 
   
    private BufferedReader entrada;
    private PrintStream salida;
    private InputStream out;
    private LoteriaBussines lot;
    public ListenerSocket(Socket socket)
    {
        try {
            this.socket = socket;
            entrada = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            salida =  new PrintStream(this.socket.getOutputStream());        
            lot = new LoteriaBussines();
       
        } catch (IOException ex) {
            Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
   
   

    @Override
    public void run()
           
           
    {  
        try {
            String msg;
            String tramaSalida;
       
           
             
                 while ((msg=entrada.readLine())!=null){
                     
                       System.out.println("Entrada->:"+msg);
                     
                   
                      ArrayList<String> tra= Util.descompilaraEncabezado(msg);
                     
                     
                      if(tra.size()==3)
                      {
                          if(Long.parseLong(tra.get(0))==msg.length())
                          {
                              switch(Integer.parseInt(tra.get(1)))    
                              {
                                  case 80:
                                 
                                  tramaSalida=transaccion80();
                                 
                                 
                                  break;
                              case 81:
                                   ArrayList<String> head = Util.descompilaraDatos(msg);
                                  tramaSalida=trama81(head.get(0),head.get(1),head.get(2),head.get(3));
                                  break;
                                 
                              case 82:  
                                  ArrayList<String> datosSerie = Util.descompilaraDatos(msg);
                                  tramaSalida=trama82( datosSerie.get(0), datosSerie.get(1), datosSerie.get(2), datosSerie.get(3));
                                  break;
                                 
                                 
                              case 83:
                                  ArrayList<String> datosApuesta = Util.descompilaraDatos(msg);
                                  tramaSalida=trama83( datosApuesta.get(0), datosApuesta.get(1), datosApuesta.get(2), datosApuesta.get(3), datosApuesta.get(4), datosApuesta.get(5), datosApuesta.get(6),datosApuesta.get(7));
                                  break;
                         
                              default:tramaSalida="0010~00~03";
                              }
                           }
                     
                        else
                        {  //tamaño de trama incorrecto
                           tramaSalida="0010~00~02";
                        }
                       
                   } else{
                          //error de trama
                          tramaSalida="0010~00~04";
                          entrada.close();
                          this.socket.close();
                         
                      }
                     
                     
                     
                 System.out.println("SALIDAD->"+tramaSalida);  
                 salida.println(tramaSalida);
                 salida.flush();  
                 
                   
                }
        } catch (IOException ex) {
            Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
           
               
         
       
       
     
           

     
     
       
       
       
    }
   
   
      private String trama83(String numSegurida,String puntoVenta,String idTerminal,String loteriaSel, String sorteo, String numero,String serial,String fraccion)
      {
        String mensaje="~83~00|";  
         
        String claveVenta;
        long colilla;
        String fracciones;
        String dirDistribuidor;
        String ciudadistribuidor;
        String distribuidor;
        String mensajePromosion;
        String fechaVenta;
        DTOCrearLoteriaResponse res=lot.guardarApuesta(Long.parseLong(numSegurida), puntoVenta, idTerminal, Long.parseLong(loteriaSel),Long.parseLong(sorteo), numero,serial,Integer.parseInt(fraccion));  
         
         claveVenta       =res.getClaveVenta();
         colilla          =res.getColilla();
         fracciones       =res.getFracciones().replace("-", "*");
         //dirDistribuidor  =res.getDireccionDistribuidor();
         ciudadistribuidor=res.getCiudadDistribuidor();
         distribuidor     =res.getDistribuidor();
         fechaVenta       =Util.fechaDate2String(res.getFechaVenta(), "ddMMyyhhmm");
         mensajePromosion =res.getMensajePromocion();
                           
         mensaje = mensaje + claveVenta+"~"+colilla+"~"+fracciones+"~"+ciudadistribuidor+"~"+distribuidor+"~"+fechaVenta+"~"+mensajePromosion+"|";
     
         return Util.RPad(String.valueOf(mensaje.length()+4), 4,'0')+mensaje;
      }
   
      //consultas las loterias en loticolombia
      private String trama82(String codLoteria,String codSorteo,String numero,String serie){
     
      String tramaRespuesta="~82~00|";    
         
      DTOFraccionLoteria fracciones= lot.getBuscaFraccionxSerie(251,Long.parseLong(codLoteria) ,Long.parseLong(codSorteo), numero, serie);  
     
      tramaRespuesta=tramaRespuesta+fracciones.getFraccionesDisponibles()+"|";
     
     
      return Util.RPad(String.valueOf(tramaRespuesta.length()+4), 4,'0')+tramaRespuesta;
     
      }
     
      private String trama81(String codLoteria,String totalSeries,String codSorteo, String numero)
      {
          String tramaRespuesta="|";
          System.out.println("verificar datos...");
          System.out.println("Loteria codigo:"+codLoteria);
          System.out.println("codigo sorteo:"+codSorteo);
          System.out.println("numero sel:"+numero);
          ArrayList<DTOFraccionLoteria> seriesdisponibles = lot.getSeriesDispon(251,Long.parseLong(codLoteria),Long.parseLong(codSorteo),numero);
         
          if(seriesdisponibles.size() >0){
         
          for(DTOFraccionLoteria series: seriesdisponibles )
          {
               
              tramaRespuesta=tramaRespuesta+series.getSerie()+"~";
             
          }
         
          tramaRespuesta = tramaRespuesta.substring(0, tramaRespuesta.length()-1);
          tramaRespuesta = tramaRespuesta+"|";
          String head="81~00";
          tramaRespuesta="~"+head+tramaRespuesta;
         
          System.out.println(tramaRespuesta);
          return Util.RPad(String.valueOf(tramaRespuesta.length()+4), 4,'0')+tramaRespuesta;
          }
         
          else
          {
         
            return "0010~81~05";
          }
         
         
       
         
       }
       
       
       private String unEncodingMsn(int message)
       {
           byte textoBytes;
           textoBytes= (byte)message;
           return ""+(char)textoBytes;
         
       }  
   
    private byte[] enCodingMsn(String message) throws Exception{
        int i;
       
        byte [] mensajeAux    =  new byte [message.length()];
        byte [] mensajeSalida =  new byte [message.length()+2];
        // byte [] crc16 = new byte [2];
        //Crc16 codigoRedundacia = new Crc16();
        mensajeAux = StringToByte(message);
        //crc16 = codigoRedundacia.CalcularCRC16(mensajeAux);
        for(i=0;i<mensajeAux.length;i++)
           mensajeSalida [i] = mensajeAux[i];
       
        //mensajeSalida [i]     = crc16[0];
        //mensajeSalida [i + 1] = crc16[1];
       
        return mensajeSalida;
   
    }
   
     private byte[] StringToByte(String string) throws
            UnsupportedEncodingException {

        return string.getBytes(ENCODING);
    }
     
      public ArrayList<String> descompilaraDatos(String trama)
     {
   
        ArrayList<String> loterias= new ArrayList<String>();
        String aux;
        String [] datos;
        aux=trama.substring((trama.indexOf('|')+1),trama.length()-1);
        datos=SplitTrama(aux);
        loterias.addAll(Arrays.asList(datos));
       
        return loterias;
   
    }
   
   public   ArrayList<String> descompilaraEncabezado(String trama){
   
        ArrayList<String> loterias= new ArrayList<String>();
        String aux;
        String [] datos;
       
        if(trama.indexOf("|")>0)
        {
           aux=trama.substring(0,(trama.indexOf('|')));
           datos=SplitTrama(aux);
           loterias.addAll(Arrays.asList(datos));
           return loterias;
        }
        else
        {
          datos=SplitTrama(trama);
          loterias.addAll(Arrays.asList(datos));
          return loterias;
       
        }
   }
     public static  String[] SplitTrama(String tram){
     
         
         
       
       
          String [] datos =tram.split("~");
         
          return datos;
   
    }
     
     
     
   
}

***********************************CLIENTE************************************************************

public class ClienteService {
   
    private  final String ENCODING = "ISO-8859-1";
    private  int readSocketTimeout = 60*1000 ;
    private Socket socket;
 
    private PrintStream out;
   
    public Socket conect()
    {
        try {
           
            this.socket = new Socket("127.0.0.1",6666);
         
           
            this.out = new PrintStream(socket.getOutputStream());
            //this.out2 = new BufferedOutputStream(socket.getOutputStream());
           
        } catch (UnknownHostException ex) {
            Logger.getLogger(ClienteService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteService.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       
        return socket;
       
    }  
   
    public boolean send(String message)
    {
        boolean ok ;
        try {  
           
            out.println(message);
            out.flush();
           
            ok=true;
         
        } catch (Exception ex) {
            Logger.getLogger(ClienteService.class.getName()).log(Level.SEVERE, null, ex);
            ok=false;
           
        }
       
        return ok;
   
    }
 
     private byte[] StringToByte(String string) throws
            UnsupportedEncodingException {

        return string.getBytes(ENCODING);
   
    }
 
}

public class ListenerSocket implements Runnable
{
   
     private Controler c;
     private Socket socket;
     private ObjectInputStream inputObject;
     private ObjectOutputStream outputObject;
     
    // private InputStreamReader input;
     private BufferedReader bufferInput=null ;
     private String tramaRespuestaServer=null;

    private ArrayList<String> datosTrama;
    private ArrayList<String> encabezadoTrama;
   
     public ListenerSocket(Socket socket,Controler c){
         this.socket=socket;
         this.c=c;
         }
     
     
    @Override
    public void run() {
       
       
         try {
              this.bufferInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             while((tramaRespuestaServer = (String) bufferInput.readLine())!=null)
             {
                 
                 System.out.println("TRAMA ENVIADA POR EL SERVER:"+tramaRespuestaServer);
                // ArrayList<String> encabezado = descompilaraEncabezado(tramaRespuestaServer);
                 
                // if(encabezado.get(0)==)
                 System.out.println("TRAMA ENVIADA POR EL SERVER:"+tramaRespuestaServer);
               
                encabezadoTrama= descompilaraEncabezado(tramaRespuestaServer);
                 
                if(Long.parseLong(encabezadoTrama.get(0))==tramaRespuestaServer.length())
                {
               
                   
                     //c.TramaRespuestaLoterias(tramaRespuestaServer);
                      datosTrama=descompilaraDatos(tramaRespuestaServer);
                   
                     
                     
                                           
               
                }
                 
                 
                 
                 
             
       
         
             
             }
         } catch (IOException ex) {
           
             Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
         }
    }
     
    public ArrayList<String> descompilaraDatos(String trama){
   
        ArrayList<String> loterias= new ArrayList<String>();
        String aux;
        String [] datos;
        aux=trama.substring((trama.indexOf('|')+1),trama.length()-1);
        datos=SplitTrama(aux);
        loterias.addAll(Arrays.asList(datos));
        return loterias;
   
    }
   
    public  ArrayList<String> descompilaraEncabezado(String trama){
   
        ArrayList<String> loterias= new ArrayList<String>();
        String aux;
        String [] datos;
        aux=trama.substring(0,(trama.indexOf('|')));
        datos=SplitTrama(aux);
        loterias.addAll(Arrays.asList(datos));
        return loterias;
   
    }
 
    public  String[] SplitTrama(String tram){
     
         ArrayList<String> tramaEncabezado = new ArrayList<String>();
         
       
       
          String [] datos =tram.split("~");
         
          return datos;
   
    }
   
    public String getMensaje(){
   
    return tramaRespuestaServer;
    }
   

}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

timeouts

Pues el timeout de conexión lo especificas en el método Socket.connect del lado del cliente.

Para que los desconectes después de un minuto de inactividad, simplemente ponle un timeout de lectura de un minuto a cada socket que recibes en el server, cachas la SocketTimeoutException y simplemente cierras el socket. Del lado del cliente deberías poner un timeout un poco más amplio, para darle oportunidad al server de que conteste las peticiones. Por ejemplo, si el server se puede tardar 20 segundos en contestar, entonces el timeout de lectura en el cliente debe ser 80 segundos.

Y eso de tener que reiniciar la aplicación me parece que se puede arreglar simplemente reconectando al cliente (es decir, crear un nuevo socket y conectarse de nuevo al server), no veo por qué tienen que reiniciar la aplicación.

cuando le añado al server timeout

en la clase del server listenersocket le añadi un time out en el while(true){....} pense que ese time out era uno para cada cliente pero cunado se cumple el server muere.

en el cliente añadie esto:

 private  int readSocketTimeout = 60*1000 ;
 this.socket.setSoTimeout(readSocketTimeout);

despues de un minuto el cliente queda desactivado y no manda mas informacion, ahi es donde me toca reiniciar y no se porque.

ezamudio es tu blog vi un ejemplo de server el de evitar ataques Dns creo que fue y espera info en bytes... lees el tamaño y hacers un while miestra ese tamaño y timeout, intente hacer algo asi en mi server y se totea al cumplir el timeout, no se si eso solo funcion en ese tipo de server que espera bytes .

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">