MESSENGER UDP: CON 3
POSIBLES USUARIOS PC0,PC1 Y PC2
Clickar aquí
para visualizar la imagen ampliada
Descarga del
fichero ejecutable.
Descarga del entorno
de programación del programa (comprimido con winrar)
Este es un programa de comunicación basado en la comunicación por datagramas y ejecutado 3 veces y escogiendo 3 usuarios distintos se puede establecer una comunicación a tres bandas.
Si estamos dentro de una red deberíamos también cambiar las IPs de los ordenadores, en este caso se supone que se ejecutan los tres en el mismo PC.
Se monta un formulario con dos richEdits (el 1 para visualizar la información y el otro para enviarla) un label debajo, para visualizar los mensajes del programa, tres botones de opción para seleccionar el destinatario de la comunicación y dos botones, uno que establece la comunicación (inicia las conexiones datagrama) y el otro que sirve para enviar los paquetes.
En esta versión del programa antes de comenzar hay que seleccionar el usuario que se es desde el menú y pulsar conectar y luego hay que seleccionar el usuario con quien se va a establecer la comunicación.
En la imagen (ampliable) se puede ver que se establece correctamente la comunicación entre 3.
El código en java de Microsoft seria:
import com.ms.wfc.app.*;
import com.ms.wfc.core.*;
import com.ms.wfc.ui.*;
import com.ms.wfc.html.*;
//añadimos las librerias de red y entrada
y salida de datos
import java.net.*;
import java.io.*;
public class Form1 extends Form
{
//declaramos lo que vamos a necesitar
//Una clase del tipo hilo que todavia no hemos creado
HiloEspera
hilo,hilo1,hilo2;
//declaramos las conexiones y los paquetes
DatagramSocket
conEnviar, conRecibir;
DatagramPacket
paqEnviar, paqRecibir;
boolean
conectado=false;
//Declaramos las direcciones IP de los ordenadores
conectados
String
miIP,PC1IP,PC2IP;
//Declaramos los puertos de entrada y salida de cada uno
de los ordenadores
int miPE=0,miPS=0,PC1PE=0,PC1PS=0,PC2PE=0,PC2PS=0;
int usuario=0;
public Form1()
{
initForm();
//llamamos a una función
init para inicializar los valores
init();
}
public
void init()
{
//Inicializamos los puertos de entrada de los ordenadores y las IPs//Atención lo
puertos de salida no son necesarios
miPE=6000;
miPS=6001;
PC1PE=6002;
PC1PS=6003;
PC2PE=6004;
PC2PS=6005;
try{
//Recojo la IP de mi ordenador, podria ser 192.156.232.12
miIP= InetAddress.getLocalHost().toString();
PC1IP=miIP;
PC2IP=miIP;
}catch(IOException ioe)
{
}
}
//funcion para iniciar el programa con distintos usuarios
public void iniciarConexion(){
int
PS=6001,PE=6000;
//inicializo
las conexiones para disitintos usuarios
if(usuario==0){PS=miPS;PE=miPE;this.setText("PC0:
PE="+PE+" PS="+PS+" IP:"+miIP);}
if(usuario==1){PS=PC1PS;PE=PC1PE;this.setText("PC1:
PE="+PE+" PS="+PS+" IP:"+miIP);}
if(usuario==2){PS=PC2PS;PE=PC2PE;this.setText("PC2:
PE="+PE+" PS="+PS+" IP:"+miIP);}
//inicializamos las conexiones para enviar y para recibir
try
{
//dejo que la conexión para enviar la haga por cualquier
puerto
conEnviar=
new DatagramSocket();
//la conexión para recibir si la inicializo para el
puerto de entrada
conRecibir= new DatagramSocket(PE);
label1.setText("Se
inicia");
}
catch(SocketException
se)
{
label1.setText("No
se inicia");
}
conectado=false;
}
//Clase Hilo que ejecuta la funcion esperar paquetes
public class HiloEspera extends Thread
{
public HiloEspera()
{}
public void run()
{
esperarPaquetes();
}
}
//funcion esperar paquetes
public
void esperarPaquetes()
{ label1.setText("Inicia la
espera de paquetes");
while(true)
{
byte array[]= new
byte[50];
try
{
paqRecibir
= new DatagramPacket(array,array.length);
conRecibir.receive(paqRecibir);
/*CODIGO NO NECESARIO
//Escribimos
en el richedit la dirección ip del ordenador que envia el paquete
richEdit1.setText(richEdit1.getText()+"\n"+paqRecibir.getAddress().toString());
//Escribimos
en el richedit el puerto por donde lo envia
richEdit1.setText(richEdit1.getText()+"\n"+String.valueOf(paqRecibir.getPort()).toString());
//Escribimos
en el richedit los datos por donde lo envia
richEdit1.setText(richEdit1.getText()+"\n"+String.valueOf(paqRecibir.getData()).toString());
//Escribo
el contenido de los datos
*/
String
datos=new String(array);
richEdit1.setText(richEdit1.getText()+datos);
}
catch(IOException
ex)
{}
}
}
public
void dispose()
{
super.dispose();
components.dispose();
}
private void Form1_click(Object source, Event e)
{
}
//Zona protegida por el editor
private
void button2_click(Object source, Event e)
{
if(!conectado)
{
iniciarConexion();
if(usuario==0){hilo =
new HiloEspera();hilo.start();label1.setText("Creo hilo");}
if(usuario==1){hilo1 =
new HiloEspera();hilo1.start();label1.setText("Creo hilo1");}
if(usuario==2){hilo2 =
new HiloEspera();hilo2.start();label1.setText("Creo hilo2");}
button2.setText("Desconectar");
button1.setEnabled(true);
conectado=true;
label1.setText(label1.getText()+":
Conectado");
}else{
if(usuario==0){hilo.stop();
if(usuario==1){hilo1.stop();hilo1=null;label1.setText("Anulo
hilo1");}
if(usuario==2){hilo2.stop();hilo2=null;label1.setText("Anulo
hilo2");}
button2.setText("Conectar");
conectado=false;
button1.setEnabled(false);
label1.setText(label1.getText()+":
Desconectado");
}
}
private void button1_click(Object source, Event e)
{
String
soy="\n";
if(usuario==0)soy+="PC0";//Añado el cambio de linea al nombre
if(usuario==1)soy+="PC1";
if(usuario==2)soy+="PC2";
String texto= soy + " dice: \n" +
richEdit2.getText();
if(radioButton1.getChecked())
{
try
{
byte
array[]= texto.getBytes();
paqEnviar=
new DatagramPacket(array,array.length,InetAddress.getLocalHost(),PC1PE);
conEnviar.send(paqEnviar);
label1.setText("Datos
enviados al Puerto: "+PC1PE);
}catch(IOException
ioe)
{
label1.setText("No
se ha podido enviar");
}
}
else if(radioButton2.getChecked())
{
try
{
byte
array[]= texto.getBytes();
paqEnviar=
new DatagramPacket(array,array.length,InetAddress.getLocalHost(),PC2PE);
conEnviar.send(paqEnviar);
label1.setText("Datos
enviados al Puerto: "+PC2PE);
}catch(IOException
ioe)
{
label1.setText("No
se ha podido enviar");
}
}
else if(radioButton3.getChecked())
{
try
{
byte
array[]= texto.getBytes();
paqEnviar=
new DatagramPacket(array,array.length,InetAddress.getLocalHost(),miPE);
conEnviar.send(paqEnviar);
label1.setText("Datos
enviados al Puerto: "+miPE);
}catch(IOException
ioe)
{
label1.setText("No
se ha podido enviar");
}
}else
{
label1.setText("Seleccione
un destinatario");
}
}
private void menuItem4_click(Object source, Event e)
{
usuario=0;
iniciarConexion();
}
private void menuItem5_click(Object source, Event e)
{
usuario=1;
iniciarConexion();
}
private void menuItem6_click(Object source, Event e)
{
usuario=2;
iniciarConexion();
}
private void menuItem2_click(Object source, Event e)
{
Application.exit();
}
/**
* NOTE: The following code is required by the
Visual J++ form
* designer.
It can be modified using the form editor. Do not
* modify it using the code editor.
*/
Container
components = new Container();
RichEdit
richEdit1 = new RichEdit();
RichEdit
richEdit2 = new RichEdit();
Button
button1 = new Button();
Button
button2 = new Button();
RadioButton
radioButton1 = new RadioButton();
RadioButton
radioButton2 = new RadioButton();
RadioButton
radioButton3 = new RadioButton();
Label
label1 = new Label();
MainMenu
mainMenu1 = new MainMenu();
MenuItem
menuItem1 = new MenuItem();
MenuItem
menuItem2 = new MenuItem();
MenuItem
menuItem3 = new MenuItem();
MenuItem
menuItem4 = new MenuItem();
MenuItem
menuItem5 = new MenuItem();
MenuItem
menuItem6 = new MenuItem();
Label
label2 = new Label();
private
void initForm()
{
richEdit1.setEnabled(false);
richEdit1.setFont(Font.DEFAULT_GUI);
richEdit1.setForeColor(Color.WINDOWTEXT);
richEdit1.setLocation(new
Point(8, 8));
richEdit1.setSize(new
Point(240, 200));
richEdit1.setTabIndex(0);
richEdit1.setText("");
richEdit2.setFont(Font.DEFAULT_GUI);
richEdit2.setForeColor(Color.WINDOWTEXT);
richEdit2.setLocation(new
Point(8, 216));
richEdit2.setSize(new
Point(184, 32));
richEdit2.setTabIndex(1);
richEdit2.setText("");
button1.setEnabled(false);
button1.setLocation(new
Point(200, 216));
button1.setSize(new
Point(48, 32));
button1.setTabIndex(2);
button1.setText("Enviar");
button1.addOnClick(new
EventHandler(this.button1_click));
button2.setFont(new
Font("Microsoft Sans Serif", 8.0f, FontSize.POINTS,
FontWeight.NORMAL, true, false, false, CharacterSet.DEFAULT, 0));
button2.setLocation(new
Point(256, 176));
button2.setSize(new
Point(80, 32));
button2.setTabIndex(3);
button2.setText("Conectar");
button2.addOnClick(new
EventHandler(this.button2_click));
radioButton1.setBackColor(new
Color(255, 192, 128));
radioButton1.setLocation(new
Point(256, 48));
radioButton1.setSize(new
Point(80, 24));
radioButton1.setTabIndex(4);
radioButton1.setText("PC1");
radioButton2.setBackColor(new
Color(255, 192, 128));
radioButton2.setLocation(new
Point(256, 72));
radioButton2.setSize(new
Point(80, 32));
radioButton2.setTabIndex(5);
radioButton2.setText("PC2");
radioButton3.setBackColor(new
Color(255, 192, 128));
radioButton3.setLocation(new
Point(256, 104));
radioButton3.setSize(new
Point(80, 32));
radioButton3.setTabIndex(6);
radioButton3.setText("PC0");
label1.setLocation(new
Point(0, 256));
label1.setSize(new
Point(240, 24));
label1.setTabIndex(7);
label1.setTabStop(false);
label1.setText("");
menuItem2.setText("Salir");
menuItem2.addOnClick(new
EventHandler(this.menuItem2_click));
menuItem1.setMenuItems(new
MenuItem[] {
menuItem2});
menuItem1.setText("Archivo");
menuItem4.setText("PC0");
menuItem4.addOnClick(new
EventHandler(this.menuItem4_click));
menuItem5.setText("PC1");
menuItem5.addOnClick(new
EventHandler(this.menuItem5_click));
menuItem6.setText("PC2");
menuItem6.addOnClick(new
EventHandler(this.menuItem6_click));
menuItem3.setMenuItems(new
MenuItem[] {
menuItem4,
menuItem5,
menuItem6});
menuItem3.setText("Yo
soy:");
mainMenu1.setMenuItems(new
MenuItem[] {
menuItem1,
menuItem3});
/*
@designTimeOnly mainMenu1.setLocation(new Point(256, 232)); */
this.setBackColor(new
Color(255, 192, 128));
this.setText("PC0");
this.setAutoScaleBaseSize(new
Point(5, 13));
this.setClientSize(new
Point(341, 283));
this.setMenu(mainMenu1);
this.addOnClick(new
EventHandler(this.Form1_click));
label2.setBackColor(new
Color(255, 192, 128));
label2.setLocation(new
Point(256, 32));
label2.setSize(new
Point(80, 16));
label2.setTabIndex(9);
label2.setTabStop(false);
label2.setText("Comunicar
con:");
this.setNewControls(new
Control[] {
label2,
label1,
radioButton3,
radioButton2,
radioButton1,
button2,
button1,
richEdit2,
richEdit1});
}
//Función
Principal
public
static void main(String args[])
{
Application.run(new
Form1());
}
}