How to write a Ejemplo Socket Server Java Program ?
package redessocket;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Lopez, Mariano
 */
public class SocketServer {
     ServerSocket server = null;
     //array de clientes
     ArrayList<SocketInfo> clientes;
     public SocketServer(int port) throws IOException{
         this.server = new ServerSocket(port);
         this. clientes = new ArrayList<>();
     }
     public void listen() throws IOException{
         //escuchar comandos por teclado
         escucharComandosServer();
         //si se logro instanciar.. mientras que no este cerrado el socket
        while(server != null && !server.isClosed()){
            Socket clientSocket = null;
            try {
               //escucha de peticiones 
               clientSocket = server.accept();
               if(clientSocket != null){
                   lanzarHilo(clientSocket);
               }
            }catch (IOException e){System.out.println(e.toString());}
        }
     }
     public static void main(String[] args) {
        System.out.println("Socket Server - Redes de datos 2015 - Lopez, Mariano");
        BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
         System.out.print("Ingrese el puerto para inicializar el servidor: ");
         try {
             int port = Integer.parseInt(entrada.readLine());
             SocketServer server = new SocketServer(port);
             System.out.println("Inicialización correcta! puerto: "+port+"\nLISTENING");
             server.listen();
         } catch (IOException ex) {
             System.out.println(ex.toString());
         }catch(NumberFormatException fe){
             System.out.println(fe.toString());
         }
    }
    //comandos que se pueden ejecutar solo en el servidor 
    private void escucharComandosServer() throws IOException{
        BufferedReader entradaDesdeUsuario = new BufferedReader(new InputStreamReader(System.in));
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                boolean flag_fin = true;
                while(flag_fin){
                    try {
                        if(entradaDesdeUsuario.ready()){
                            String in =entradaDesdeUsuario.readLine();
                            switch(in){
                                case "exit":
                                    System.out.println("Shooting down...");
                                    KillEmAll();
                                    server.close();
                                    flag_fin=false;
                                    break;
                                case "who":
                                    System.out.println(clientesInfo());
                                    break;
                                default:
                                    System.out.println("Comandos:\nwho\t\tInformación sobre clientes   conectados\nexit\t\tFinalizar todas las conexiones y cerrar el socket\n");
                                    break;
                            }
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });
       t.start();
    }
    //hilo para atender a cada socket cliente
    private void lanzarHilo(Socket clientSocket){
        SocketInfo socket_info = new SocketInfo(clientSocket);
        clientes.add(socket_info);
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //string para almacenar mensajes del cliente
                    String line;
                    //ip del cliente
                    String ip = clientSocket.getInetAddress().toString();
                    //puerto del cliente
                    int puerto = clientSocket.getPort();
                    System.out.println("Nuevo cliente: "+ip+":"+puerto);
                    //output stream para escritura con el cliente
                    DataOutputStream salidaACliente = new DataOutputStream(clientSocket.getOutputStream());
                    //stream para lectura del cliente
                    DataInputStream in = new DataInputStream(clientSocket.getInputStream());
                    //mientras este conectado
                    while (!clientSocket.isClosed()) {
                        //leer desde el stream del cliente
                        line = readStringUTF(in);
                        System.out.println("\nCliente: "+ip+":"+puerto+"\n"+line);
                        //en la linea 0 esta el comando a ejecutar
                        line = (line.split("\n"))[0];
                        //si el mensaje es exit -> cerrar conexión
                        if(line.equals("exit")){
                            System.out.println("El cliente: "+ip+":"+puerto +" ha solicitado cierre");
                            clientes.remove(socket_info);
                            clientSocket.close();
                            break;
                        }else{
                            //todas las acciones que puede realizar el servidor
                            acciones(line, salidaACliente,socket_info);
                        }
                    }//fin while 
                    //cerrar stream
                    in.close();
                } catch (IOException ex) {
                    System.out.println(ex.toString());
                } 
            }//end run
        });
        t.start();
    }
    //comandos que pueden realizar los clientes
    private void acciones(String in,DataOutputStream salidaACliente,SocketInfo socket_info) throws IOException{
        //historial de solicitudes
        socket_info.addToHistory(in);
        switch(in){
            case "cores":
                respuesta(salidaACliente, 200, "Procesadores disponibles para JVM (cores): " +Runtime.getRuntime().availableProcessors());
                break;
            case "ram -free":
                respuesta(salidaACliente, 200, "Memoria libre para JVM: " + Runtime.getRuntime().freeMemory()+"Bytes");
                break;
            case "ram -total":
                respuesta(salidaACliente, 200, "JVM total de memoria: " +Runtime.getRuntime().totalMemory()+"Bytes");
                break;   
            case "ram -max":
                respuesta(salidaACliente, 200, "Maxima cantidad de RAM que puede llegar a usar la JVM: " +Runtime.getRuntime().maxMemory()+"Bytes");
                break;
             case "so -name":
                respuesta(salidaACliente, 200, "Sistema Operativo: "+System.getProperty("os.name"));
                break;  
            case "history":
                respuesta(salidaACliente, 200, socket_info.getHistory());
                break; 
             case "help":
                 String aux = "Lista de comandos\n"
                         + "cores\t\tProcesadores disponibles para JVM\n"
                         + "ram -free\t\tMemoria libre para JVM\n"
                         + "ram -total\t\tJVM total de memoria\n"
                         + "ram -max\t\tMaxima cantidad de RAM que puede llegar a usar la JVM\n"
                         + "so -name\t\tSistema Operativo\n"
                         + "history\t\tHistorial de comandos\n"
                         + "exit\t\tterminar conexión\n";
                respuesta(salidaACliente, 200, aux);
                break; 
            default:
                respuesta(salidaACliente, 400, "Comando no reconocido");
                break;
        }
    }
    //finaliza todas las conexiones existentes ... tambien es el primer disco de Metallica.
    private void KillEmAll() throws IOException{
        for(SocketInfo s:clientes){
            s.getSocket().close();
        }
    }
    //String con información de los clientes online
    private String clientesInfo(){
        String retorno = "Cantidad de clientes online: "+clientes.size()+"\n";
        retorno+="Socket información(IP, puerto remoto y puerto local) \t Fecha de la conexión\n";
        for(SocketInfo s:clientes){retorno+=s.showInfo();}
        return retorno;
    }
    //escribir cabecera + respuesta en el DataOutputStram para el cliente
    private void respuesta(DataOutputStream salidaACliente,int code, String mensaje) throws IOException{
        String estado = "";
        switch(code){
            case 200:
                estado="OK";
                break;
            case 400:
                estado="Bad request";
                break;
            case 500:
                estado="Internal Error";
                break;
                default:
                    estado="OK";
                    break;
        }
        Date fecha = new Date();
        String aux = code+" "+estado+"\nDate: "+fecha+"\nContent-Type: text charset=UTF-8\nContent-Length: "+mensaje.length()+"\n\n"+mensaje+"\n";
        byte[] data=aux.getBytes("UTF-8");
        salidaACliente.writeInt(data.length);
        salidaACliente.write(data);
    }
    private static String readStringUTF(DataInputStream in) throws IOException{
        int length=in.readInt();
        byte[] data=new byte[length];
        in.readFully(data);
        return new String(data,"UTF-8");
    }
    //clase auxiliar para guardar atributos
    private class SocketInfo{
        private Socket socket;
        private Date fecha;
        private String history;
        private DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        public SocketInfo(Socket s){
            this.socket = s;
            this.fecha = new Date();
            this.history="Historial de comandos:\n";
        }
        public void addToHistory(String s){
            this.history+=s+"\t"+dateFormat.format(new Date())+"\n";
        }
        public String getHistory(){
            return this.history+"\n******************************************************************";
        }
        public Socket getSocket(){
            return this.socket;
        }
        public Date getFechaConexion(){
            return this.fecha;
        }
        public String showInfo(){
            return this.getSocket().toString()+"\t"+dateFormat.format(this.getFechaConexion())+"\n"+this.getHistory()+"\n\n";
        }
    }
}
If the answers is incorrect or not given, you can answer the above question in the comment box. If the answers is incorrect or not given, you can answer the above question in the comment box.