Sockets
Bien, los denominados sockets son los que nos permiten enviar datos y recibir datos a travez de una conexión de red, es el denominado protocolo TCP/IP, generalmente cuando se trabaja con comunicaciones, se usan algoritmos dentro de un bucle infinito, por lo tanto necesitaríamos de los threads para poder implementar el algoritmo de comunicación.
Para programar en la comunicación Ethernet (TCP/IP) hay que entender el concepto de cliente y de servidor, el cliente es el que se conecta al servidor, es decir, para que halla comunicación el servidor se levanta primero y luego es capaz de aceptar 1 o más clientes a la vez según esté programado, a continuación les mostraré un simple ejemplo de un Messenger en Java usando la librería Sockets:
El cliente:
Creamos una clase Cliente de tipo JFrame, para poder hacer la ventana de Messenger:
Area de texto: area2
Caja de texto: area1
Ahora vamos a implementar la librería Sockets colocando:
import java.net.*;
También usaremos las siguientes librerías:
import java.io.*; // para poder usar los try catch
Seguido de esto vamos a hacer que la clase Cliente implemente el método run de Runnable para poder usar los threads:
Colocamos implements Runnable :
public class Cliente extends javax.swing.JFrame implements Runnable
Ahora declaramos los siguientes atributos que nos ayudarán en el funcionamiento del programa
public InputStream sIn; // para recibir datos
public DataInputStream flujo; // para convertir datos recibidos
public OutputStream salida; // para escribir datos ( enviar)
public DataOutputStream flujo2; // para convertir los datos a enviar ( escribir )
public Socket skCliente; // el objeto socket que nos permite conectarnos
public Thread j; // el thread que usaremos en la comunicacion
Ahora el método constructor:
public Cliente() {
initComponents();
j=new Thread(this);
try{
j.start();
}catch(Exception ds){
System.out.println(ds.getMessage());
}
initComponents();
j=new Thread(this);
try{
j.start();
}catch(Exception ds){
System.out.println(ds.getMessage());
}
}
implementamos el método run:
try{
skCliente=new Socket("192.168.6.36",5000); // ip y puerto del servidor
sIn=skCliente.getInputStream();
salida=skCliente.getOutputStream();
flujo2=new DataOutputStream(salida);
flujo = new DataInputStream(sIn );
area2.setText("Conectado a Servidor : "+skCliente.getInetAddress());
int aux6;
while( true ){
aux6=flujo.read(); // se lee un byte como entero
//el byte es convertido en caracter y luego se pone en la caja de texto "area2"
area2.setText(area2.getText()+"\n"+(char)aux6);
}else{
}
}
}catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
Ahora programaremos el boton de click, para ello usaremos los denominados eventos, es decir el comportamiento de los componentes si sucede un "evento" como click, presionar tecla, recibir dato, cerrar componente, etc. En este caso usaremos el mouse clicked ( clic de mouse ).
Luego implementamos el siguiente codigo dentro del evento, les debe quedar así:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
try {
for(int i=0;i<area1.getText().length();i++){
flujo2.write(area1.getText().charAt(i));
try {
for(int i=0;i<area1.getText().length();i++){
flujo2.write(area1.getText().charAt(i));
// enviamos caracter por caracter de la palabra escrita en area1
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
Hasta aquí ya tenemos el cliente listo para conectarse al servidor, ahora vamos a programar la otra parte, el servidor:
Creamos una clase Servidor, igual que la anterior que sea JFrame:
Area de texto: area1
Caja de texto: texto
Al igual que el cliente, el servidor usará las mismas librerías:
import java.io.* ;
import java.net.* ;
import java.net.* ;
Colocamos implements Runnable para usar los threads:
public class Servidor extends javax.swing.JFrame implements Runnable
Usaremos los siguiéntes atributos:
public ServerSocket skServidor; // el servidor
public InputStream sIn;
public Thread ss; // el thread
public Socket skCliente; // el cliente que acepta
public DataInputStream flujo2;
public InputStream instream;
public DataOutputStream flujo;
public InputStream sIn;
public Thread ss; // el thread
public Socket skCliente; // el cliente que acepta
public DataInputStream flujo2;
public InputStream instream;
public DataOutputStream flujo;
public String aux="";
public OutputStream outstream;
El método constructor:
public Servidor() {
initComponents();
try {
skServidor = new ServerSocket( 5000); // crea servidor con puerto 5000
ss=new Thread(this);
ss.start();
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
initComponents();
try {
skServidor = new ServerSocket( 5000); // crea servidor con puerto 5000
ss=new Thread(this);
ss.start();
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
El método run para la comunicación:
public void run(){
try {
skCliente=skServidor.accept();
area1.setText("Cliente Aceptado: "+skCliente.getInetAddress());
outstream = skCliente.getOutputStream();
instream = skCliente.getInputStream();
flujo2 = new DataInputStream(instream);
flujo= new DataOutputStream( outstream );
try {
skCliente=skServidor.accept();
area1.setText("Cliente Aceptado: "+skCliente.getInetAddress());
outstream = skCliente.getOutputStream();
instream = skCliente.getInputStream();
flujo2 = new DataInputStream(instream);
flujo= new DataOutputStream( outstream );
String aux="";
int a;
while( true ){
a=flujo2.read();
if(a==10){
area1.setText("\n"+aux); // si recibe salto de linea pone el texto
}
if(a<15){
}else{
aux= aux+ (char)a; // concatena los caracteres recibidos y al formar una palabra la pone
}
}
}catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
El evento del boton enviar:
private void botonActionPerformed(java.awt.event.ActionEvent evt) {
String p;
p=texto.getText()+"\n";
try {
for(int k=0;k<p.length();k++){
flujo.write(p.charAt(k));
}
} catch (IOException ex) {
ex.printStackTrace();
}
String p;
p=texto.getText()+"\n";
try {
for(int k=0;k<p.length();k++){
flujo.write(p.charAt(k));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
No hay comentarios:
Publicar un comentario