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

NECESITO CREAR UN LISTENER EN JAVA

Hola muchachos soy novato total en cuestiones de listener y mi primer tarea en mi nuevo trabajo es crear un listerner , para reemplazar el listener actual hecho en .net yo sugeri hacerlo en java y pues les comento u poco como es que se trabaja porque el listener tienen que ser algo muy efeciente.

el trabajo es una casa de apuestas que cuenta con 2500 puntos de ventas en todo el pais... cada punto de venta cuenta con uno o dos pc y en el se encuetra el sw cliente java que realiza las apuestas.... aparte de esos 2500 puntos de ventas se cuenta con 800 terminales con conexion grps que son esas maquinitas que ves en los supermercados de cadenas o restaurates donde pasa la tarjeta de credito y pagas en cualquier sitio... el problema de esas maquinitas actualmente es que cuando se conecta al socket esa conexion se deja abierta siempre ya que en ellas segun me explica el ing es muy costoso que cierren la conexion ya que el proceso conexion y desconexion consume timpo critico en dichosos aparatos. todo esas peticiones va al listener y el listener se comunica con la base datos que es oracle, al parecer hay dos instancias de la base de datos.

la idea muchacho esque me indique como debo debo hacer el listener para soportar todas esas conexiones, que seria lo mas recomendable un listener.. varios listener??? creo que actualmente en la empresa se manejas 10 o 12 listener diferentes y no se porque ???? necesito que me indiquen como debo empesar a desarrollas que debo tener en cuenta y lo que voy programando lo voy subiendo a ver que tal. bueno muchahos saludos

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.

PRIMERA APROXIMACION DEL SERVER

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class ServidorService {
   
    private ServerSocket serverSocket;
    private Socket socket;
 

    public ServidorService()
    {
       
        try{
       
        serverSocket = new ServerSocket(6667);
       
        while(true)
        {
       
            socket = serverSocket.accept();
           
           
            new Thread (new ListenerSocket(socket) ).start();
           
       
        }
       
       
        }
        catch(IOException e){
            System.out.println("....");
        }
       
    }
   
   
   
   
}

Imagen de tuxin39

Listener

Hola Hacman, puede llegar a ser un tema para hacer una tesis te digo porque: mucho de los éxitos de un switch's transaccional están detrás de algoritmos y estructuras eficientes, optimas para aceptar N cantidad de conexiones lo más rápido posible , y que tenga buen performance, no solo es lis tener, sino que el protocolo de envío y recepción de los datos, para que esté sea eficiente, el tratamiento de los datos (listas, ring-buffer, etc.). Y puedes incluso llegar a utilizar balanceadores de carga con apache, o algún hardware F5, para levantar varias instancias de tu listener. En este foro han echo muchas contribuciones valiosísimas sobre alguno de los temas que te mencione arriba, por ejemplo :

http://www.javamexico.org/blogs/ezamudio/disruptor_una_nueva_estructura_...

Lo que puedo concluir separando un poco, un buen servidor se puede obtener de la siguiente forma :

1.- A nivel conexión : balanceador de carga
2.- A nivel Socket puede ser concurrente o como mencionas una sola conexión sostenida. Pero lo que hace realmente poderoso esto es el protocolo que utilices para recibir y enviar los arreglos, ya que si sostienes una conexión hay que programar el loop que acepte el protocolo y separa las tramas que recibes por el socket.
3.- El algoritmo de tratamiento ve Disruptor.
4.- Analizar el consumo de memoria, tiempo de respuesta y uso de procesador de la aplicación. Tratar de que las utilidades de tu aplicación y requerimientos no funcionales (LOGs) sean desatendidos , no bloqueantes y ligeros.

Si tienes especial cuidado con estos puntos, puedes tener una aplicación robusta.

Saludos

ok tuxin39

todos tus puntos los voy a tener en cuenta muchas gracias por comentar, muchas gracias por compartir el conocimiento be free!!

Imagen de tuxin39

Listener

Un poco de pseudocódigo:

def server.listenNow();
por  siempre {
     si server == LISTEN {
           def socketCliente=server.accept();
           def buffer=server.read( );  // Acción bloqueante hasta que entre el primer mensaje
           si aceptaProtocol(buffer)== OK{
                       //Aquí entran las estructuras como la de la liga o tareas en hilos, para que tu socket siga en listen, por ejemplo
                       generaHilo(buffer, socketCliente); // le mandas el descriptor del socket para que por ahí regreses la respuesta.
                       generaHilo.start();
           }si no ->  print "El mensaje recibido no se identifica";
     }si no -> {
        print "Socket Servidor  no abierto, intentando"
         server.listenNow();
         sleep(1);
     }
}

Donde:
aceptaProtocol (Cadena) // Acepta una cadena y revisa si cumple el protocolo propietario que se defina, para llevar un orden.

Es muy recomendable que lo primero que viaje en tu cadena sea la longitud, de echo el pseudocódigo optimizado quedaría con dos read, uno para leer la longitud de tu cadena y otro para identificar de que se trata, la longitud es importante cuando hay mucho stress, ya que si hay mucha carga los mensajes se traslapan , quedaría algo así, si quieremos leer "Hello world", el cliente enviaría: "011Hello world":

def longitud socket read(3);
print longitud
def buffer socket.read(longitud);

Y así no hay pierde, no vas a tener remanentes.

Saludos

AQUI VA UN EJEMPLO SOCKETS HILO POR CONEXION SERVIDOR

package com.fanelsoft.app.service;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author hackchan
 */

public class ServidorService

{
    private ServerSocket serverSocket;
    private Socket socket;
 

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

   
}

package com.fanelsoft.app.service;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Fabio A. Rojas
 */

public class ListenerSocket implements  Runnable{

   private ObjectOutputStream outputObejct;
   private ObjectInputStream inputObject;
   
   
   private DataOutputStream outputdata;
   private DataInputStream  inputdata;
   
   
   private InputStreamReader input;
   private BufferedReader bufferInput ;
 
   private Socket socket;
   private PrintWriter out;
   
   
    public ListenerSocket(Socket socket)
    {
       try
       {
           this.socket = socket;
           this.outputObejct = new ObjectOutputStream(socket.getOutputStream());
           this.inputObject  = new ObjectInputStream(socket.getInputStream());
           
           this.outputdata = new DataOutputStream(socket.getOutputStream());
           this.inputdata = new DataInputStream(socket.getInputStream());
       
           this.bufferInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            this.out = new PrintWriter(socket.getOutputStream(), true);
       
       }
       
       catch (IOException ex)
       
       {
           Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
       }
    }
   
   
   

    @Override
    public void run()
           
           
    {  
          String trama = null;
        try {
       
              while((trama = (String) bufferInput.readLine())!=null)
              {
             
           
                System.out.println("recibiendo cosas del cliente....");
               
                 System.out.println("Imprimiendo trama del cliente"+ trama);
               
                 out.println("SOY SERVER CABRON");
                 out.flush();
               
             
             
         
          }
        } catch (IOException ex) {
            Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
       
       
        }
           
     
       
       
       
       
    }
   
       
   
   
   
}

package servidorsocketjava;

import com.fanelsoft.app.service.ServidorService;

/**
 *
 * @author hackchan
 */

public class ServidorSocketJava {

    /**
     * @param args the command line arguments
     */

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

Esta server es funcional

despues de testear el server funciona muy bien con

this.bufferInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            this.out = new PrintWriter(socket.getOutputStream(), true);
<code>

los otros si me funcionava en el cliente el server me arrojaba un error, que le faltaria a esta clase del server para convertirla en un thread pool??????????????

EL CLIENTE

public class ClienteService {
   
   
    private Socket socket;
    private ObjectOutputStream output;
    private DataOutputStream bufoutput;
   
    private PrintWriter out;
   
     

       
   
    public Socket conect()
    {
        try {
           
            this.socket = new Socket("localhost",6669);
           
           
            this.output = new ObjectOutputStream(socket.getOutputStream());
            this.bufoutput = new DataOutputStream(socket.getOutputStream());
           
            this.out = new PrintWriter(socket.getOutputStream(), true);
           
        } 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 void send(String message)
    {
     
            out.println(message);
            out.flush();
           
       
       
   
    }
}

import java.util.logging.Logger;

/**
 *
 * @author hackchan
 */

public class ListenerSocket implements Runnable
{
   
   
   
     private ObjectInputStream inputObject;
     private ObjectOutputStream outputObject;
     
    // private InputStreamReader input;
     private BufferedReader bufferInput ;
     private String tramaRespuestaServer;

     
   
     public ListenerSocket(Socket socket){
         try {
                this.tramaRespuestaServer=null;
                this.inputObject = new ObjectInputStream(socket.getInputStream());
                this.outputObject = new ObjectOutputStream(socket.getOutputStream());
               
                this.bufferInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             
             
             
         } catch (IOException ex) {
             Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
         }
     
     }
    @Override
    public void run() {
       
       
         try {
             
             while((tramaRespuestaServer = (String) bufferInput.readLine())!=null)
             {
                 
                 System.out.println("TRAMA ENVIADA POR EL SERVER:"+tramaRespuestaServer);
                 
                 
                 
                 
                 
             
       
         
             
             }
         } catch (IOException ex) {
           
             Logger.getLogger(ListenerSocket.class.getName()).log(Level.SEVERE, null, ex);
         }
    }
   
 
    public String getMensaje(){
   
    return tramaRespuestaServer;
    }
   

}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.fanelsoft.controler;

import com.fanelsoft.app.service.ClienteService;
import com.fanelsoft.app.service.ListenerSocket;
import com.fanelsoft.app.ui.ClinteFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;

/**
 *
 * @author hackchan
 */

public class Controler implements ActionListener {
   
   
    private ClinteFrame clienteFrame;
   
   
   
    private Socket socket;
    private ClienteService service;
 
   

    public Controler(ClinteFrame clienteFrame)
    {
       
        this.clienteFrame = clienteFrame;
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
       
        if(e.getActionCommand().equals("Conectar"))
        {
       
         String nombre = clienteFrame.getNombre().getText();
       
          if(!nombre.isEmpty()){
           
             
              if(this.socket== null)
              {
                this.service = new ClienteService();
                this.socket = this.service.conect();
                ListenerSocket listenerSock = new  ListenerSocket(socket);
                Thread thread = new Thread(listenerSock);
                thread.start();
                     
                 //new Thread(new ListenerSocket(socket) ).start();
              }
   
                //construyo trama a enviar al servidor
                 String mensaje="HOLA VIEJO SERVER";
                 clienteFrame.getMensajesRecibidos().setText(nombre);  
                this.service.send(mensaje);
               
        }
          else{
          clienteFrame.Mensaje("Digte el nombre de usuario");}
    }
       
       
       
    }
   
   
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.fanelsoft.app.ui;

import com.fanelsoft.controler.Controler;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 *
 * @author hackchan
 */

public class ClinteFrame extends javax.swing.JFrame {

    /**
     * Creates new form ClinteFrame
     */

   
   
   
    public ClinteFrame() {
       
       
        initComponents();
       
       
       
    }
   
    public void setContoler(Controler c){
   
       
        btnConectar.addActionListener(c);
       
   
    }
   
    public JTextField getNombre(){
   
   
       return txtName;
   
    }
   
    public JTextArea getMensajesRecibidos(){
   
   
       return txtAreaReceive;
    }
   
     public JTextArea getMensajesEnviados(){
   
   
       return txtAreaSend;
    }
     
     public void Mensaje(String mensaje){
     
         JOptionPane.showMessageDialog(this, mensaje);
     }
   
    public void arranca(){
   
      pack();
      setVisible(true);
    }
   
   

   
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        btnConectar = new javax.swing.JButton();
        btnSalir = new javax.swing.JButton();
        txtName = new javax.swing.JTextField();
        jPanel3 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        listOnes = new javax.swing.JList();
        btnUpdates = new javax.swing.JButton();
        jPanel4 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        txtAreaReceive = new javax.swing.JTextArea();
        jPanel5 = new javax.swing.JPanel();
        jPanel6 = new javax.swing.JPanel();
        btnEnviar = new javax.swing.JButton();
        btnLimpiar = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        txtAreaSend = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Conectar"));

        btnConectar.setText("Conectar");

        btnSalir.setText("Salir");
        btnSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSalirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(txtName)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnConectar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnConectar)
                    .addComponent(btnSalir)
                    .addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(0, 30, Short.MAX_VALUE))
        );

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Onlines Users"));

        listOnes.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane1.setViewportView(listOnes);

        btnUpdates.setText("Updates");
        btnUpdates.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnUpdatesActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1)
            .addComponent(btnUpdates, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE)
                .addGap(19, 19, 19)
                .addComponent(btnUpdates)
                .addContainerGap())
        );

        jPanel4.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

        txtAreaReceive.setBackground(new java.awt.Color(79, 74, 74));
        txtAreaReceive.setColumns(20);
        txtAreaReceive.setForeground(new java.awt.Color(39, 161, 202));
        txtAreaReceive.setRows(5);
        jScrollPane2.setViewportView(txtAreaReceive);

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 374, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE)
                .addGap(0, 0, 0))
        );

        jPanel5.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        btnEnviar.setText("Enviar");
        btnEnviar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEnviarActionPerformed(evt);
            }
        });

        btnLimpiar.setText("Limpiar");
        btnLimpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimpiarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(btnLimpiar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnEnviar))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnLimpiar)
                    .addComponent(btnEnviar))
                .addGap(0, 24, Short.MAX_VALUE))
        );

        txtAreaSend.setColumns(20);
        txtAreaSend.setRows(5);
        jScrollPane4.setViewportView(txtAreaSend);

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane4)
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 51, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(22, 22, 22))
            .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
    }                                        

    private void btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
    }                                          

    private void btnEnviarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
    }                                        

    private void btnUpdatesActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
    }                                          

    /**
     * @param args the command line arguments
     */

   
    // Variables declaration - do not modify                    
    private javax.swing.JButton btnConectar;
    private javax.swing.JButton btnEnviar;
    private javax.swing.JButton btnLimpiar;
    private javax.swing.JButton btnSalir;
    private javax.swing.JButton btnUpdates;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JList listOnes;
    private javax.swing.JTextArea txtAreaReceive;
    private javax.swing.JTextArea txtAreaSend;
    private javax.swing.JTextField txtName;
    // End of variables declaration                  
}

 */
package clientesocketjava;

import com.fanelsoft.app.ui.ClinteFrame;
import com.fanelsoft.controler.Controler;

/**
 *
 * @author hackchan
 */

public class ClienteSocketJava {

    /**
     * @param args the command line arguments
     */

   
        // TODO code application logic here
       
        public static void main(String args[]) {
       
           
             ClinteFrame chat = new  ClinteFrame();
             
             Controler control = new Controler(chat);
             
             chat.setContoler(control);
             chat.arranca();
             
           
    }
    }

Alguien que me de concesos para mejorar este socket

Aqui por ahora hace su trabajo es un socket hilo por conexion, nose habra que añadir o quitar para tranaformarlo a un thread pool, el cliente tiene a ui como un chat , pero solo funciona el boton de conecta que es para probar envio de mensajes desde cleinte al serve y iceversa espero comentaris que me puedan ayudar mucho se cuidan bye...

REALMENTE NECESITO UN CONSEJO???

ya tengo mi socket listener en hilo x conexion hay que que me de ideas de como desarrollar uno con thread pool???

Imagen de ezamudio

Thread Pool

Es muy fácil, necesitas tener un hilo dedicado al ServerSocket para aceptar conexiones contínuamente (como seguramente ya lo debes tener ahorita), pero en vez de que después del accept arranques un hilo dedicado para manejar el Socket recién recibido, vas a crear un Runnable que metes al thread pool.

Por eso se recomienda NO extender la clase Thread, sino implementar la interfaz Runnable; imagínate que tu esquema de hilo x conexión lo hiciste con un Runnable:

class Conexion implements Runnable {

  private final Socket socket;

  public Conexion(Socket socket) {
    this.socket = socket;
  }
  public void run() {
    //manejar la conexión, sabiendo que esto correrá en un hilo dedicado
  }
}

Si implementas eso, entonces en tu esquema de hilo x conexión original estarías haciendo algo así:

//Esto corre en un hilo dedicado
Socket sock = serverSocket.accept();
new Thread(new Conexion(sock)).start();

Y ahora lo único que necesitas hacer es:

//en algun lugar declaras esto
ExecutorService tpool = Executors.newCachedThreadPool();
//Luego en tu hilo dedicado para aceptar conexiones
Socket sock = serverSocket.accept();
tpool.execute(new Conexion(sock));

Eso es todo.

IMPORTANTE: La cosa aquí es que configures bien tu thread pool, poniéndole un límite al número de hilos que puede crear, y tomando en cuenta que si llegan más conexiones que ese límite que fijaste, se van a encolar y se ejecutarán hasta que se terminen las que están ejecutándose.

Por ejemplo si creas tu thread pool con un límite de 4 hilos y te llegan de repente 8 conexiones, las 8 se encolan pero pues se ejecutarán máximo 4 de manera simultánea (o casi simultánea) y las otras 4 estarán esperando; cuando se libere uno de esos 4 hilos porque la conexión se termina de procesar (tu Runnable termina), la siguiente conexión encolada se procesará y así con cada una de las que queden. El truco aquí ya es de tuning porque hay que poner suficientes hilos como para que se puedan atender todas las conexiones de manera que no esperen demasiado, pero sin que se haga un hilo por cada una porque entonces no hay diferencia de manejar hilo por conexión (bueno más que el reuso de los hilos).

Para ponerle límite al cached thread pool: ((ThreadPoolExecutor)tpool).setMaximumPoolSize(limiteDeHilos)

Ok voy a revisar

ezamudio muchas gracias por comentar me has ayudados mucho voy a trabajar en ello y posteo como me fue

COMO TRATAR LAS ENTRDAS QUE LLEGAN DEL SERVER

Tengo una clase que se llama ListenerSocket y ellas es la encargada de esperar todo lo que llega del server dicha clase implementa Runnable:

la idea es que la trama que me llegue del servidor la trate y la envie tratata a donde la necesito que es una clase controladora, trate de crear una clase Singlenton pero cuando intento acceder supuetstamente la trama me da Null PointerException
asi tengo el codigo en el controler:

------------------------CODIGO DESDE EL CONTROLER--------------------------

public void actionPerformed(ActionEvent e)
    {
       
        if(e.getActionCommand().equals("Conectar"))
        {
       
         String nombre = clienteFrame.getNombre().getText();
       
          if(!nombre.isEmpty()){
           
             
              if(this.socket== null)
              {
                this.service = new ClienteService();
                this.socket = this.service.conect();
                listenerSock = new  ListenerSocket(socket);
                Thread thread = new Thread(listenerSock);
                thread.start();
                System.out.println( thread.getName());
                 
               
                 
              }
                this.service.send(nombre);  //evio mensaje al server
               
               -->aqui este linea necesito la respuesta del server      
             
                 //intente hacer esto pero error

                TramaGerica generica =TramaGerica.getSingleton();
                System.out.println(generica.getEncabezadoTrama().get(0));
               
        }
          else{
          clienteFrame.Mensaje("Digte el nombre de usuario");}
    }
       
       
       
    }

ESTE ES UN FRACMENTO DEL ESCUCHADOR EL QUE ESPERA Y RECIBE LOS DATOS DEL SERVER

 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);
               
                encabezadoTrama= descompilaraEncabezado(tramaRespuestaServer);
                 
                if(Long.parseLong(encabezadoTrama.get(0))==tramaRespuestaServer.length())
                {
                       
               
               
                      datosTrama=descompilaraDatos(tramaRespuestaServer);
                     //TRATE DE ME METER LA RESPUESTA EN UN SINGLENTO PARA USARLA EN OTRO LADO

                      generica =TramaGerica.getSingleton();
                      generica.setEncabezadoTrama(encabezadoTrama);
                      generica.setDatosTrama(datosTrama);
                                           
               
                }
                 
             
         
             
             }
         }

Imagen de echan

esta chamba se ve muy low

esta chamba se ve muy low level para hacerlo a patin, no has considerado usar algo netty? todas las broncas de conexion, condificar-decodifcar mensajes, que si el protocolo y el numero de clientes, etc.. es precisamente lo que hace este framework.

Alo mejor hay que invertirle tiempo a los conceptos pero para que reinventar la rueda? mira los ejemplos

https://github.com/netty/netty/tree/master/example/src/main/java/io/nett...

echan netty

quiero aprender a montarlo yo, creo que es mejor manejar este tema a mano ya que asi lo confiuras exactamente a como lo necesitas

CLASE OBSERVABLE

estoy leyendo sobre el patron observador parece que es por ahi la cosa no se que opinan ustedes???

PASE LA INSTANCIA DEL CONTROLER A LA CLASE ListenerSoCKET

espero que este bien hecho y fue la primera solucion que me resulto

  public ListenerSocket(Socket socket,Controler c){
         this.socket=socket;
         this.c=c;
         }

de este modo funciona

package com.ac75.app.service;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author hackchan
 */

public class ServidorService

{
    private ServerSocket serverSocket;
    private Socket socket;
   

    public ServidorService()
    {
      serverSocket=null;
      socket=null;
        try {        
           
            serverSocket = new ServerSocket(6666);
             ExecutorService tpool = Executors.newCachedThreadPool();
           
           
              while(true)
              {
       
                   socket = serverSocket.accept();
                   //new Thread (new ListenerSocket(socket) ).start();
                   tpool.execute(new ListenerSocket(socket));
                   ((ThreadPoolExecutor)tpool).setMaximumPoolSize(12);
              }
        } catch (IOException ex) {
            Logger.getLogger(ServidorService.class.getName()).log(Level.SEVERE, null, ex);
               
        }
       
       
       
    }
   
   

   

}

que diferencia???

ExecutorService newFixedThreadPool(int nThreads) y ExecutorService tpool = Executors.newCachedThreadPool();

Imagen de ezamudio

número de hilos

Lee la documentación de esos métodos.

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