07/12/05

* JBuilder Foundation 2006: Tiene casi todo lo que tiene la edición Enterprise , pero te quedas sin las colecciones de clases : InternetBeans , XML, EJB y CORBA. :-( ... Pero bueno , siendo objetivos merece la pena , sigues teniendo los DataExpress , los dbSwing y More dbSwing,... Todos orientados a BBDD.

 

 
Estadisticas y contadores web gratis
Manuales Oposiciones
  Como diversión he implementado un navegador super cutre , se escribe la url en el jTexField y tras dar al botón de "Al abordaje" se visualiza la url sin soportar frames , ni javascript , ... sin nada , solo se verá la página , estática , ni siquiera hay hyperlinks  , ni nada de nada , pero es curioso como se implementa  en 5 minutos con el JBuilder 2006 Foundation. Más que un navegador es un toma instantáneas  de una URL, pero por algo se empieza.

Esto es lo más significativo del código , como construir un jEditorPane pasándole un objeto URL

    public void jButton1_actionPerformed(ActionEvent e) {
     Openurl();//al clikar el botón al abordaje llamo a este método
    }
    void Openurl(){
     
	try{
       
   	    URL laurl = new URL(jTextField1.getText());
        
            JEditorPane1.setPage(laurl);
      
 	    } catch(Exception e){}
     }//fin método openurl

Como obtener nuestra propia IP
Y ya que estamos hablando de URL, todos sabemos que una URL en formato de nombre de dominio
tiene asociada una dirección IPv4 ( dentro de nada ya tendremos las IPv6 , ¿ya funcionan en inet?)
 veamos como obtener nuestra propia IP: (en http://www.wikilearning.com/uso_de_sockets-wkccp-3938-159.htm
 lo he corregido y ampliado)
Usaremos la clase java.net.InetAddress , que a su vez tiene una subclase para IPv4 (Inet4Address) y 
otra para IPv6 (Inet6Address)
java.net.InetAddress direccion = java.net.InetAddress.getLocalHost();
    byte direccionIp[] = direccion.getAddress();

Si la dirección de la máquina en que estamos corriendo el test.class es 192.168.173.101 , entonces:

    direccionIp[0] = -64 // corresponde a 192
    direccionIp[1] = -88 // corresponde a 168
    direccionIp[2] = -93 // corresponde a 173
    direccionIp[3] = 101 // corresponde a 101
public class test {
	
 public static void main(String[] args) throws Exception{
    Integer IP[]={0,0,0,0};
    
	java.net.InetAddress direccion = java.net.InetAddress.getLocalHost();
	byte direccionIp[] = direccion.getAddress();
	
	for (int i=0;i<4;i++) {
		IP[i]=(int)direccionIp[i];
                //Si lo veo en formato byte , me sale -64.-88.-93.101 , luego hay que pasarlo a int
		if (IP[i]<0) IP[i]=IP[i]+256;
		System.out.print(IP[i]+".");
   	}//fin for
    }//fin main
}//fin test
 
 
   

Continuamos con los Sockets

En el link http://www.wikilearning.com/sockets-wkccp-3938-157.htm lo explica bastante bién. Resumiéndolo:

 

 

Esta seria la definición de cara a un desarrollador , desde el punto de vista del Networking un socket seria : ( definición de Cisco)

Estructura de software que opera como un punto de terminación de comunicaciones dentro de un dispositivo de red

 

El término da para rato: http://club.idecnet.com/~ccastano/cisco/ccna2_foros.htm

Como el término es Inglés (Socket <->
IP_address+Protocolo+Puerto):
Internet sockets
In RFC documents relating to TCP or UDP, a socket on a certain host is defined as the combination of an IP address, a protocol, and a port number.

--------------------------------

Sockets can also be used for IPC, without IP
addresses or any other staples of TCP/IP.
-------------------------------

Unix domain sockets, IPC sockets
Another type of socket is used by POSIX compliant systems, and are called Unix domain sockets (the correct standard POSIX term is POSIX Local IPC Sockets). Their primary function is as a means for inter-process communication and are therefore also called IPC sockets. These connections are from the
local computer to itself, not actually a connection
transmitted over a physical network."

Según el Glosario de Cisco:
"Socket
Estructura de software que opera como un punto de
terminación de comunicaciones dentro de un dispositivo de red."
---------------------------------------------------------
In the world of computers, there are two types of
sockets: Internet sockets and IPC sockets (IPC is
short for inter-process communication).

A socket can be used in computer networking to form
one end of a bi-directional communication link
between two programs, likely over a computer network,
though exceptions like the X Window System exist.
-------------------------------------------------------------

Un profesional como Carlos Mena Mesa , Doctor en Teleco e Informático nos lo resume y simplifica de esta manera :

un socket es la combinación de
IP+protocolo+puerto.

Una pareja de sockets, en el emisor y en el receptor,
identifica una conexión de red.

Abrir un socket es establecer esa conexión. Cerrarla
es darla por finalizada.
 

Y el termino dá para rato...

"A CPU socket is a physical and electrical

specification of how to connect a CPU to a
motherboard.

In electronics, a socket is also used as a synonym
for a jack.

An electrical socket is a synonym of electrical
outlet: an electrical device connected to a power
source onto which another device can be plugged or
screwed in. Typical examples are wall sockets and
light bulb sockets. See Domestic AC power plugs and
sockets.
---------------------------------------------------------

The BSD operating system introduced network sockets
in 1983: see the Berkeley sockets API. Each socket
gets bound to a given port, which lets the transport
layer protocol (typically UDP or TCP) identify which
application to send the data to.

--------------------------------------------------------

Todo esto lo tienes en www.wikipedia.org
---------------------------------------------

Pero nosotros nos centraremos en la definición: Sockets = puntos finales de enlaces de comunicaciones entre procesos.
Los procesos los tratan como descriptores de ficheros.
De forma que se pueden intercambiar datos con otros procesos transmitiendo y recibiendo a través de sockets.



Tipos de Sockets

Desde el link http://www.wikilearning.com/sockets-wkccp-3938-157.htm


Si quereis saber las diferencias_entre_sockets_stream_y_datagrama pues ya sabeis ,vais al link. Pero me quedo con esta idea:

"UDP es menos complejo y tiene una menor sobrecarga sobre la conexión; esto hace que sea el indicado en la implementación

de aplicaciones cliente/servidor en sistemas distribuidos montados sobre redes de área local."

"TCP parece más indicado para la implementación de servicios de red como un control remoto (rlogin, telnet)

 y transmisión de ficheros (ftp); que necesitan transmitir datos de longitud indefinida"


Modelo de comunicaciones con Java (http://www.wikilearning.com/modelo_de_comunicaciones_con_java-wkccp-3938-161.htm)

Modelo Cliente-Servidor


Apertura de un Socket desde un cliente a un servidor

java.net.Socket socketcliente;

socketcliente = new java.net.Socket("hostServidor",puerto);

//donde hostServidor es de la clase InetAddress (ip) o String (el nombre de dominio o netbios del servidor)

// y puerto es un int entre 0 y 2^16-1 = 65535, pero teniendo en cuenta que desde 0 a 1023 suelen estar reservados y según tu usuario

// deberás tener privilegios de administrador o root

Apertura de un Socket desde un servidor para dar un servicio.(http://www.wikilearning.com/apertura_de_sockets-wkccp-3938-162.htm)

.

Aconsejo terminar de leerse este excelente tutorial http://www.wikilearning.com/tutorial_de_java-wkc-3938.htm al

menos en lo referente a los sockets.

Y luego aconsejo irse al tutorial  http://www.programacion.com/tutorial/red/12/


 
He aquí un cliente de email ( smtp ) de http://www.wikilearning.com/mí_nimo_cliente_smtp-wkccp-3938-165.htm
import java.net.*;
import java.io.*;

class smtpCliente {
    public static void main( String args[] ) {
        Socket s = null;
        DataInputStream sIn = null;
        DataOutputStream sOut = null;

        // Abrimos una conexión con smtp.terra.es en el puerto 25
        // que es el correspondiente al protocolo smtp, e intentamos
        // abrir los streams de entrada y salida
        try {
            s = new Socket( "smtp.terra.es",25 );
            sIn = new DataInputStream( s.getInputStream() );
            sOut = new DataOutputStream( s.getOutputStream() );
        } catch( UnknownHostException e ) {
            System.out.println( "No conozco el host" );
        } catch( IOException e ) {
            System.out.println( e );
            }

        // Si todo está inicializado correctamente, vamos a escribir
        // algunos datos en el canal de salida que se ha establecido
        // con el puerto del protocolo smtp del servidor
        if( s != null && sIn != null && sOut != null )
            {
            try {
                // Tenemos que respetar la especificación SMTP dada en
                // RFC1822/3, de forma que lo que va en mayúsculas
                // antes de los dos puntos tiene un significado especial
                // en el protocolo
                sOut.writeBytes( "MAIL From: nobody@terra.es\n" );
                sOut.writeBytes( "RCPT To: billgates@microsoft.com\n" );
                sOut.writeBytes( "DATA\n" );
                sOut.writeBytes( "From: nobody@terra.es\n" );
                sOut.writeBytes( "Subject: Pruebas\n" );
                // Ahora el cuerpo del mensaje
                sOut.writeBytes( "Hola, desde el curso de intranet\n" );
                sOut.writeBytes( "\n.\n" );

                // Nos quedamos a la espera de recibir el "Ok" del
                // servidor para saber que ha recibido el mensaje
                // correctamente, momento en el cual cortamos
                String respuesta;
                while( ( respuesta = sIn.readLine() ) != null )
                    {
                    System.out.println( "Servidor: "+respuesta );
                    if( respuesta.indexOf( "Ok" ) != -1 )
                        break;
                    }

                // Cerramos todo lo que hemos abierto
                sOut.close();
                sIn.close();
                s.close();
              } catch( UnknownHostException e ) {
                System.out.println( "Intentando conectar: "+e );
            } catch( IOException e ) {
                System.out.println( e );
                }
            }
        }
    }

JavaMail
Pero y si deseamos hacer un servidor de correo smtp/pop3 . Habria que leerse las especificaciones
de RFC xyz... . Abrir un ServerSocket en el puerto 25/110 u otros , esperar conexión/es de un/os cliente/s ,
usar threads por si se va a conectar más de un cliente  ....
una vez establecida la conexión , procesar los flujos de información respecto a las 
reglas del protocolo smtp (esta parte es dura, algoritmos de procesamiento de strings , ...)
 y almacenar los mensajes (i/o ficheros,...), luego implementar un servidor tipo
pop3 para que el cliente/s que se conecte/n pueda/n descargar sus mensajes ...
tras autentificarse , lo que implica una mini bbdd de usuarios
 ,... Pero ¿ Hay un camino más corto ? Si , la API JavaMail y sus Especificaciones
Si la instalas , asegurate de incluir en tu classpath el fichero mail.jar
Si sigues documentándote verás que todas las versiones de JavaMail usan
 Activation Framework( ¿ a que es económico el inglés ?). Las Especificaciones .
 Ya sabes, incluye en el classpath el fichero activation.jar.O metes todos los jar 
citados el ext del lib del JRE y del JDK , para poder compilar y poder ejecutar
 C:\Archivos de programa\Java\jdk1.5.0_05\jre\lib\ext
 C:\Archivos de programa\Java\j2re1.4.2_07\lib\ext
 
Otro ejemplo con Sockets : el servidor parlante o echo server
// : cl5:ServidorParlante.java
// Servidor muy simple que simplemente
// reproduce lo que envía el cliente.
import java.io.*;
import java.net.*;
public class Quiensoyyo {
	// Elegir un Puerto fuera del rango 1-1024:
public static final int PUERTO = 8080;
public static void main (String [ ] args)
throws IOException {
ServerSocket s = new ServerSocket (PUERTO) ;
System.out .println ("Empezado: " + s) ;
try {

	// Se bloquea hasta que se dé alguna conexión:
	Socket socket = s.accept();
		try {
			System.out.println("Conexion aceptada: "+ socket) ;
			BufferedReader entrada =new BufferedReader (new InputStreamReader(socket.getInputStream()));
			// La salida suele hacerse vaciando a ráfagas
			// por parte de PrintWriter:
			PrintWriter salida =new PrintWriter (new BufferedWriter (new OutputStreamWriter(socket.getOutputStream())),true);
			while (true) {
				String str = entrada.readLine();
				if (str. equals ("FIN") ) break;
				System. out .println ("Reproduciendo:" + str) ;
				salida.println (str) ;
				}
			// Elegir siempre los dos sockets.. .
			} 
		finally {
				System. out .println ("cerrando. . . ") ;
				socket. close ( ) ;
			}
	}
 finally {s. close ( ) ;}
 }
}
En el link aparece un clienteParlante.java , pero para hacer la prueba probar con > telnet localhost 8080
la conexión se cierra al escribir FIN + intro en el cliente de telnet .
 

Servidor de chat por consola y cliente con interfaz gráfico

 De la página www.monografias.com vamos a ver un servidor de chat en modo consola y un cliente de chat con interfaz gráfico.

Le he añadido comentarios que no tenia y resaltado lo esencial

El servidor : Se lanzaria el servidor con el único parámetro del puerto donde va a escuchar. Por ejemplo en el puerto 4321:

 > java ChatServer 4321

------------- ChatServer.java ----------------
import java.net.*;
import java.io.*;
import java.util.*;

public class  ChatServer  {
  public ChatServer (int port) throws IOException {
    ServerSocket server = new ServerSocket (port);
    //mientras el servidor este en ejecución estará escuchando en el socket client
    while (true) {
      //escuchando en el socket client, si no se conecta nadie se queda en estado block o de espera
      Socket client = server.accept ();
      //Si se conecta un cliente al port , se saca un mensaje por consola de aceptado y la IP del cliente
      System.out.println ("Aceptado desde: " + client.getInetAddress ());
      //ChatHandler , esta clase se define más abajo , seria el manejador y se construye su objeto c
      //tomando como argumento el Socket client, cada vez que se conecte un cliente ,
      // se lanzará un Nuevo ChatHandler...
      ChatHandler c = new ChatHandler (client);
      //lanzamos el objeto c de la clase ChatHandler = manejador del servidor , 1 por cada cliente conectado
      c.start ();
    }
  }
  public static void main (String args[]) throws IOException {
    if (args.length != 1) throw new RuntimeException ("Syntax: ChatServer ");
    //lanzamos el programa pasando el argumento , que es el puerto pasado de string a Integer
    new ChatServer (Integer.parseInt (args[0]));
  }
} 

------------------ ChatHandler.java -----------------------------------

import java.net.*;
import java.io.*;
import java.util.*;
public class  ChatHandler  extends Thread { //hereda de Thread --> va a ver procesos hijo o hilos o instancias
  protected Socket s;                       //en este caso la misma clase ChatHandler va a ser instanciada
  protected DataInputStream i;              //cada vez que se establezca una conexion con el servidor
  protected DataOutputStream o;
  public ChatHandler (Socket s) throws IOException {
    //el socket s pasado como parametro se asigna al s de la clase
    this.s = s;
    //DataInputStream i <--> in= entrada de datos , captura el flujo de datos de entrada de el socket s
    i = new DataInputStream (new BufferedInputStream (s.getInputStream ()));
    //DataOutputStream o <--> out = salida de datos , captura el flujo de datos de salida de el socket s
    o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ()));
  }
  // El manejador como un Vector y static ( compartido )
  protected static Vector handlers = new Vector ();
  // método run
  public void run () {
    String name = s.getInetAddress ().toString ();
    try {
      broadcast (name + " Se ha conectado.");
      handlers.addElement (this);
      while (true) {
        String msg = i.readUTF ();
        broadcast (name + " - " + msg);
      }
    } catch (IOException ex) {
      ex.printStackTrace ();
    } finally {
      handlers.removeElement (this);
      broadcast (name + " has left.");
      try {
        s.close ();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
  //método broadcast ( nota: broadcast significa multidifusión, en una red de clase c como 192.168.173.0/24
  // la dirección de broadcast seria 192.168.173.255 , cualquier paquete ethernet dirigido
  // a esa dirección de broadcast , está obligado a escucharlo todo dispositivo de red
  // en este caso, simplemente , cuando se envia un mensaje por un cliente se envía a todas las conexiones
  // o clientes que tenga el servidor de chat
  protected static void broadcast (String message) {
    //sincroniza los Vector handlers
    synchronized (handlers) {
      // Interface Enumeration , es un interface contenido en java.util
      Enumeration e = handlers.elements ();
      //Mientras haya elementos en el interface e , que contiene los elementos del vector handlers
      while (e.hasMoreElements ()) {
        //c se le asigna el siguiente elemento de el interface e (que contiene los elementos de el vector handlers)
        // con el casting de rigor --> (ChatHandler)
        //es decir que mientras e tenga elementos se va a crear una instancia de ChatHandler
        ChatHandler c = (ChatHandler) e.nextElement ();
        try {
          // sincroniza el objeto o de c, que es un DataOutputstream ... del socket s establecido con el cliente
          synchronized (c.o) {
            //escribe message en el DataOutputStream o flujo de salida de la instancia c de ChatHandler
            // método writeUTF = Writes a string to the underlying output stream using
            // modified UTF-8 encoding in a machine-independent manner. 
            c.o.writeUTF (message);
          }
          
          //hace que fluya el rio de datos, liberando el buffer ... down to the river ... :) "Bruce Springteen"
          c.o.flush ();
        } catch (IOException ex) {
          //en caso de excepción ALTO! a ese proceso hijo de ChatHandler
          c.stop ();
        }
      }
    }
  }
}

-------------------------ChatClient.java-------------------------------

/**
* ChatClient.java  1.00 98/10/05 Humberto MartÌnez Barber·
*
* Basado en ChatApplet de Merlin Hughes
*/
import java.net.*;
import java.io.*;
import java.awt.*;
//Hereda de la clase Frame e implementa el interface Runnable
//The Runnable interface should be implemented by any class whose
// instances are intended to be executed by a thread.
// The class must define a method of no arguments called run. 
public class   ChatClient  extends Frame implements Runnable {
  protected DataInputStream i;
  protected DataOutputStream o;
  protected TextArea output;
  protected TextField input;
  protected Thread listener;
//El constructor se implementa con un titulo, un canal de entrada y otro de salida
//ojo no confundir i y o con this.i y this.o
  public ChatClient (String title, InputStream i, OutputStream o) {
    super (title);//la llamada a la superclase es lo 1º que se debe hacer en un constructor
    this.i = new DataInputStream (new BufferedInputStream (i));
    this.o = new DataOutputStream (new BufferedOutputStream (o));
    setLayout (new BorderLayout ());
    add ("Center", output = new TextArea ());
    output.setEditable (false);
    add ("South", input = new TextField ());
    pack ();
    show ();// está deprecated , habria que usar setVisible(true)
    input.requestFocus ();//Obtiene el foco
    listener = new Thread (this);//Crea una instancia o hijo o hilo de la propia clase
    listener.start ();//la lanza
  }
  public void run () {
    try {
      while (true) {
        String line = i.readUTF ();
        output.appendText (line + "\n");
      }
    } catch (IOException ex) {
      ex.printStackTrace ();
    } finally {
      listener = null;
      input.hide ();
      validate ();
      try {
        o.close ();
      } catch (IOException ex) {
        ex.printStackTrace ();
      }
    }
  }
  public boolean handleEvent (Event e) {
    if ((e.target == input) && (e.id == Event.ACTION_EVENT)) {
      try {
        o.writeUTF ((String) e.arg);
            o.flush (); 
      } catch (IOException ex) {
        ex.printStackTrace();
        listener.stop ();
      }
      input.setText ("");
      return true;
    } else if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)) {
      if (listener != null)
        listener.stop ();
      hide ();
      return true;
    }
    return super.handleEvent (e);
  }//el cliente se define con 2 argumentos desde consola el que define un socket el host servidor y el puerto
   // > java ChatClient pc101 4321
  public static void main (String args[]) throws IOException {
    if (args.length != 2)
      throw new RuntimeException ("Syntax: ChatClient ");
    Socket s = new Socket (args[0], Integer.parseInt (args[1]));
    new ChatClient ("Chat " + args[0] + ":" + args[1],
                    s.getInputStream (), s.getOutputStream ());
  }
}

 

¡Qu