MESSENGER EN JAVA2: PROGRAMAS SERVIDOR-CLIENTE_TCP
SERVIDOR_TPC: Estará formado por dos clases: ServidorTCP y NuevoCliente en sendos ficheros ServidorTCP.java y NuevoCliente.java
ServidorTCP
import java.awt.*;//Incorpora los objetos típicos del java en windows pero no los eventos
import
java.net.*;//Incorpora los objetos de red
import java.io.*;//Incorpora los objetos de entrada y salida de
datos
public class ServidorTCP extends Frame //creamos una clase
del tipo ventana
{
//Declaración de objetos
public
TextArea entrada; //Cuadro de TExto
public
ServerSocket conexion;
//Conexión del tipo servidor
int
clientes; //Contador de Clientes
//Función constructor donde inicializamos los objetos
y
//las variables
ServidorTCP()
{
setTitle("ServidorTCP"); //Ponemos un Título a la ventana del
servidor
setSize(350,400); //Le damos un tamaño
entrada = new TextArea(20,40); //creamos el
cuadro de texto y le damos un tamaño
entrada.setEditable(false); //Hacemos que no sea editable
add(entrada); //Lo añadimos a la ventana
setVisible(true);//Lo hacemos visible
clientes=0;
//Inicializamos la variable clientes
}
void
lanzarServidor() //función lanzar Servidor
{
try
{ //Establece
la conexión por el puerto 6520 y soportará 50 conexiones como máximo
conexion = new ServerSocket(6520,50);
while (true)
new NuevoCliente(conexion.accept(), this, clientes++).start();
//Bucle infinito que espera la conexión de nuevos
clientes
}
catch(IOException e)
{
}
}
public
void añadir(String texto)
//Función añadir texto al cuadro de texto
{
entrada.append(texto);
}
public
static void main(String args[]) //Función
principal ServidorTCP
{
ServidorTCP
Servidor = new ServidorTCP(); //Creamos un objeto de la clase
Servidor.lanzarServidor();//Llamamos
a la función que ejecuta el servidor
}
}
NuevoClienteTCP
import java.awt.*;
import java.net.*;
import java.io.*;
/**
*/
public class NuevoCliente extends Thread //Clase del tipo
Hilo
{
//Declaración de objetos y variables
Socket conexion;
//Declaramos la conexión
ServidorTCP servidor;//Declaramos un objeto del tipo ServidorTCP
int
cliente;//Un entero que contendrá el número de cliente
DataInputStream
entrada; //Flujo de entrada de datos
DataOutputStream
salida;//Flujo de salida de datos
//Función constructor con tres parámetros, una
conexión, un ServidorTCP y un entero
NuevoCliente(Socket c, ServidorTCP
s, int numero)
{
//Inicializamos las variables a los
parámetros del nuevo cliente
conexion
= c;
servidor = s;
cliente =
numero;
try
//Inicializamos los flujos de entrada y salida de la conexión
{
entrada =new DataInputStream(conexion.getInputStream());
salida =new DataOutputStream(conexion.getOutputStream());
}
catch(IOException e)
{
}
}
public
void run()//función run del hilo
{
boolean
salir = false;//variable que indica si un cliente
está o no conectado
servidor.añadir("Cliente " + cliente + " se ha conectado\n");
while(!salir)//mientras
se está conectado
{
try
{
String
cadena = entrada.readUTF();
if(cadena.equals("Salir"))
salir = true;
else
{
servidor.añadir("El
cliente " + cliente + " ha enviado:\n"
+ " " + cadena + '\n');
salida.writeUTF("cadena
\" "+cadena+"\" recibida");
}
}
catch(IOException e)
{
}
catch(NullPointerException e)
{
}
}
//En caso de desconexión
servidor.añadir("Se ha ido el cliente " + cliente +
"\n");
try
{
conexion.close();
}
catch(IOException e)
{
}
}
}
CLIENTE_TPC: Estará formado por
una clase: ClienteTCP en el fichero ClienteTCP.java
ClienteTCP
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;//Se incorporan los eventos asociados a
los objetos de awt.
public class ClienteTCP extends Frame implements
ActionListener
{
Panel
panel;//Declaramos un panel para agrupar objetos
Socket conexion; //Declaramos una conexión
DataOutputStream
salida; //Un flujo de salida de datos
DataInputStream
entrada; //Declaramos un flujo de entrada de datos
TextField
textosalida;//Declaramos los
cuadros de texto de entrada y salida
Label
textoentrada;
Button
enviar, conectar, desconectar;//Declaramos los
botones, conectar,desconectar y enviar
//Función constructor
ClienteTCP(String nombre)
{
super(nombre);//Ponemos
el nombre en la ventana también se podria hacer setTitle(nombre)
setSize(350,200);//Establecemos
el tamaño de la ventana
panel = new Panel();//Creamos
el panel
textosalida = new TextField(40);//Creamos
el cuadro de texto de salida
textoentrada = new Label();//Creamos el cuadro de texto de entrada
textoentrada.setText("Pulsa
el botón \" Conectar\" para
conectarte");//Escribimos en el cuadro de entrada
enviar= new Button("Enviar");//Creamos el botón enviar
//Al
comienzo el botón enviar está inhabilitado
enviar.setEnabled(false);
conectar
= new Button
("Conectar");//Creamos el botón conectar
desconectar
= new Button("Desconectar");//Creamos
el botón desconectar
desconectar.setEnabled(false);//El botón desconectar estará deshabilitado
//Añadimos
todos los objetos al panel, además añadimos dos etiquetas.
panel.add(new Label("Datos a
enviar"));
panel.add(textosalida);
panel.add(new Label("Datos
recibidos"));
panel.add(textoentrada);
panel.add(enviar);
panel.add(conectar);
panel.add(desconectar);
//Añadimos
los eventos de acción asociados a los tres botones
enviar.addActionListener(this);
conectar.addActionListener(this);
desconectar.addActionListener(this);
//Añadimos
el panel a la ventana del programa
add(panel);
//Establecemos
la propiedad visible en true
setVisible(true);
}
//Función asociada a
los eventos de los botones que es necesaria al implementar la clase ActionListener
public void
actionPerformed(ActionEvent e)
{
//Para
distinguir los eventos realizados por los botones recojemos
el texto que contiene el botón
String com = e.getActionCommand();
//Y
los comparamos con:
if(com.equals("Enviar"))
{
//El
botón enviar
try
{
textoentrada.setText("");
salida.writeUTF(textosalida.getText());
textoentrada.setText(entrada.readUTF());
textosalida.setText("");
}
catch(IOException excepcion)
{
}
}
else
if(com.equals("Conectar"))
{
//Botón
conectar
try
{
//Si
cambiamos InetAddress.getLocalHost() por la dirección de otro ordenador
//entonces
enviaremos el mensaje a aquel ordenador en concreto
//Enviamos
al ordenador local por el puerto 6520
conexion = new
Socket(InetAddress.getLocalHost(),6520);
salida
= new DataOutputStream(conexion.getOutputStream());
entrada
= new DataInputStream(conexion.getInputStream());
conectar.setEnabled(false);
desconectar.setEnabled(true);
enviar.setEnabled(true);
textoentrada.setText("Conectado");
}
catch(IOException ex)
{
}
}
else
{
try
{
//Botón
salir
salida.writeUTF("Salir");
conexion.close();
conectar.setEnabled(true);
desconectar.setEnabled(false);
enviar.setEnabled(false);
textoentrada.setText("Pulsa el boton \"
Conectar \" para conectarte");
}
catch(IOException
exc)
{
}
}
}
//Función
Principal
public static void
main(String args[])
{
new ClienteTCP("Cliente
Angel");
new ClienteTCP("Cliente
Pepe");
}
}