Qu es un socket?
Los sockets son un sistema de comunicacin entre procesos de diferentes mquinas de
una red. Ms exactamente, un socket es un punto de comunicacin por el cual un
proceso puede emitir o recibir informacin.
Ejemplo 1
SALUDO DE BIENVENIDA
El siguiente programa establece una conexin bsica entre un servidor y un cliente
Donde una vez establecida la conexin el servidor solicita el nombre del cliente, el cliente
introduce su nombre, y el servidor le da una bienvenida mediante un mensaje.
Programa Servidor
//Declaramos libreras necesarias
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Servidor {
private ServerSocket sServidor; //Socket del servidor
private Socket sCliente; //Socket para el cliente
private Scanner entrada; //Flujo de Entrada para envio de datos
private PrintStream salida; //Flujo de Salida para recepcion de datos
private int puerto; // Puerto por el cual escuchara el servidor
public Servidor(int p){
puerto=p;
}
public void iniciar(){
try {
//Se Crea el socket del servidor
sServidor =new ServerSocket(puerto);
System.out.println(" - SERVIDOR INICIADO - ");
System.out.println(" - Esprando Cliente - ");
//El metodo accept(), espera hasta que un cliente realice una conexin
//Una vez que se ha establecido una conexin por el cliente, este
//mtodo devolver un objeto tipo Socket, a travs del cual se establecer
//la comunicacin con el cliente
sCliente=sServidor.accept();
//Obtengo una referencia a los flujos de datos de entrada y salida del socket cliente
entrada =new Scanner(sCliente.getInputStream());
salida =new PrintStream(sCliente.getOutputStream());
////Esta seccin puede ser modificada segn nuestros requerimientos//////////
System.out.println("Cliente Conectado:"+ sCliente.getInetAddress() +":"+
sCliente.getPort() );
salida.println("EJEMPLO1-Saludo");
salida.print("Ingrese Su Nombre ->");
String nombre= entrada.next();
salida.println("Bienvenido "+ nombre);
/////////////////////////////////////////////////////////////////////////////
//Cerramos la conexin
finalizar();
}
catch(Exception e){
finalizar ();
e.printStackTrace();
}
}
public void finalizar(){
try {
entrada.close();
salida.close();
sCliente.close();
sServidor.close();
System.out.print("Conexion Finalizada...");
}
catch (IOException e) {
e.printStackTrace();
}
}}
Capturas
Iniciando el servidor
Resultado, una vez introducido nuestro nombre el servidor nos manda un mensaje de
bienvenida
Ejemplo 2
Chat simple
El siguiente programa establece una conexin bsica entre un servidor y un cliente
Donde una vez establecida la conexin el servidor y el cliente, pueden chatear entre ellos,
hasta que los dos introduzcan la palabra bye.
Programa Servidor
//Importamos libreras necesarias
import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.awt.event.*;
public class Servidor {
private ServerSocket sServidor; //Socket del servidor
private Socket sCliente; //Socket para el cliente
private Scanner entrada; //Flujo de Entrada para envio de datos
private PrintStream salida; //Flujo de Salida para recepcion de datos
private int puerto; // Puerto por el cual escuchara el servidor
private String mensaje_enviar="";
private String mensaje_recibido="";
private javax.swing.Timer t; //Declaramos un Timer
public Servidor (int p){
puerto=p;
//El timer ser el encargado de ejecutar este bloque de cdigo cada 500 [ms]
//Es decir, que este leer y mostrara los mensajes recibidos cada 0.5 segundos
//siempre o cuando se haya creado una conexin y exista un mensaje.
t = new javax.swing.Timer(500,new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (sCliente.isConnected() && !mensaje_recibido.equals("bye")){
mensaje_recibido=entrada.next();
System.out.println("Cliente_dice:"+mensaje_recibido);
}
}
});
}
public void iniciar(){
try{
//Inicamos el servidor
sServidor =new ServerSocket(puerto);
System.out.println(" - SERVIDOR INICIADO- ");
System.out.println("- Esperando cliente ...");
//El metodo accept(), espera hasta que un cliente realice una conexin
//Una vez que se ha establecido una conexin por el cliente, este
//mtodo devolver un objeto tipo Socket, a travs del cual se establecer
//la comunicacin con el cliente.
sCliente=sServidor.accept();
//Obtengo una referencia a los flujos de datos de entrada y salida del socket cliente
salida=new PrintStream(sCliente.getOutputStream());
entrada =new Scanner(sCliente.getInputStream());
System.out.println("Cliente conectado "+ sCliente.getInetAddress()+":"+
sCliente.getPort()+"\n");
//iniciamos el timer
t.start();
Scanner lector=new Scanner(System.in);
//Escribimos los mensajes hacia el cliente
while(!mensaje_recibido.equals("bye"))
{
mensaje_enviar=lector.next();
salida.println("Servidor Dice : " +mensaje_enviar);
}
//Terminamos la conexin
finalizar();
}
catch(Exception e){
e.printStackTrace();
finalizar();
}
}
public void finalizar(){
try{
t.stop();
salida.close();
entrada.close();
sCliente.close();
sServidor.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
Capturas
Iniciando el servidor
Ejemplo 3
Eco
El siguiente programa establece una conexin bsica entre un servidor y un cliente
Donde una vez establecida la conexin el servidor solicita que introduzca un texto al
cliente y el servidor devuelve un eco, es decir el mismo mensaje que se envi. A
continuacin se implementa el programa del servidor conjuntamente el programa del
cliente.
Programa Servidor
import java.io.*;
import java.net.*;
import java.util.*;
public class Servidor {
private ServerSocket sServidor;
private Socket sCliente;
private Scanner entrada;
private PrintStream salida;
private int puerto;
private String mensaje="";
Programa Cliente
import
import
import
public
java.io.*;
java.net.*;
java.util.Scanner;
class Cliente {
private Socket sCliente;
private Scanner entrada;
prvate PrintStream salida;
prvate String host; //IP del servidor con el que me voy a conectar
private int puerto;
private String mensaje="";
public Cliente(String h, int p){
host=h;
puerto=p;
}
public void iniciar(){
try{
Capturas
Iniciando el servidor
Ejemplo 4
Enviar un correo mediante un socket cliente.
El siguiente programa cliente establece enva un correo mediante SMTP.
En este ejemplo se enviara un correo electrnico a un servidor SMTP (implementado en el
laboratorio anterior). Cabe notar que solo es necesario codificar el programa cliente,
debido a que el protocolo SMTP ya esta implementado y configurado con Postfix.
Programa Cliente
//Importando libreras necesarias
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Cliente {
private Socket sCliente;
private Scanner entrada;
private PrintStream salida;
private String host="";
private int puerto;
e.printStackTrace();
}
}
}
Capturas
Asumiendo que el servidor est bien configurado y se encuentra en marcha, procedemos a
mandar el correo.
NOTA
* Ambos programas (servidor y cliente) no necesitan estar programados en Java, es
posible programarlos en lenguajes de programacin diferentes, o inclusive programar un
servidor en java y utilizar un cliente ya existente o solo programar el cliente y acceder a un
servidor ya existente.
* Cuando se selecciona un nmero de puerto, se debe tener en cuenta que los puertos en
el rango 0-1023 estn reservados. Estos puertos son los que utilizan los servicios estndar del
sistema como email, ftp, http, dns, dhcp, etc. Por lo que, para aplicaciones de usuario, el
programador deber asegurarse de seleccionar un puerto por encima del 1023.
* El cliente debe de conocer tanto el puerto a utilizar como la IP o dominio del servidor,
mientras el servidor solo debe conocer el puerto de conexin.
* Si las pruebas son realizadas en Windows 7, es necesario habilitar el telnet en Panel de
control -> Desinstalar un programa -> Activar o desactivar las caractersticas de Windows > cliente telnet.