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.
|
|||||||
|
|||||||
|
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
Pero nosotros nos centraremos
en la definición: Sockets = puntos finales de enlaces de comunicaciones
entre procesos.
Desde el link http://www.wikilearning.com/sockets-wkccp-3938-157.htm
"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)
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
|
|||||||
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 );
}
}
}
}
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
// instances are intended to be executed by a thread. // The class must define a method of no arguments called
//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