Se pueden realizar muchos proyectos divertidos utilizando la API de programación de Socket proporcionada por Java .
He escrito una aplicación de chat grupal usando la clase MulticastSocket (Java Platform SE 7). Un MulticastSocket es un DatagramSocket (UDP), con capacidades adicionales para unirse a ” grupos ” de otros hosts de multidifusión en Internet.
Aquí está el código: (menos de 100 líneas en un solo archivo)
- ¿Por qué el reenvío de puertos solo se ejecuta en la máquina del servidor?
- Si tuviera una varita mágica y tuviera que explicar sin jerga, ¿cómo diseñaría la seguridad de la red desde cero para proteger los servidores de red de la empresa?
- En GSM, el ancho de banda del sistema es de 45 MHz. ¿Es este el ancho de banda para una sola celda o para un solo clúster?
- ¿MPLS (Cambio de etiqueta multiprotocolo) proporciona características de seguridad?
- ¿Qué son las redes de computadoras? ¿Cuáles son las ventajas y desventajas?
import java.net. *;
import java.io. *;
import java.util. *;
clase pública GroupChat
{
Private static final String TERMINATE = “Salir”;
nombre de cadena estática;
estático volátil booleano terminado = falso;
public static void main (String [] args)
{
if (args.length! = 2)
System.out.println (“Se requieren dos argumentos: “);
más
{
tratar
{
InetAddress group = InetAddress.getByName (args [0]);
int port = Integer.parseInt (args [1]);
Scanner sc = nuevo escáner (System.in);
System.out.print (“Ingrese su nombre:”);
nombre = sc.nextLine ();
MulticastSocket socket = nuevo MulticastSocket (puerto);
socket.setTimeToLive (0); // Dado que estamos implementando esto solo en localhost (para una subred configúrelo como 1)
socket.joinGroup (grupo);
Thread t = new Thread (nuevo ReadThread (socket, grupo, puerto));
t.start (); // Genera un hilo para leer los mensajes enviados al grupo actual
System.out.println (“Comience a escribir mensajes … \ n”);
mientras (cierto)
{
Mensaje de cadena;
mensaje = sc.nextLine ();
if (message.equalsIgnoreCase (GroupChat.TERMINATE))
{
terminado = verdadero;
socket.leaveGroup (grupo);
socket.close ();
descanso;
}
mensaje = nombre + “:” + mensaje;
byte [] buffer = mensaje.getBytes ();
DatagramPacket datagram = new DatagramPacket (buffer, buffer.length, group, port);
socket.send (datagrama);
}
}
catch (SocketException se)
{
System.out.println (“Error al crear el socket”);
se.printStackTrace ();
}
catch (IOException es decir)
{
System.out.println (“Error al leer / escribir desde / al socket”);
es decir, printStackTrace ();
}
}
}
}
La clase ReadThread implementa Runnable
{
zócalo privado MulticastSocket;
grupo privado de InetAddress;
puerto int privado;
privado estático final int MAX_LEN = 1000;
ReadThread (socket MulticastSocket, grupo InetAddress, puerto int)
{
this.socket = socket;
this.group = grupo;
this.port = puerto;
}
@Anular
vacío público run ()
{
while (! GroupChat.finished)
{
byte [] buffer = nuevo byte [ReadThread.MAX_LEN];
DatagramPacket datagram = new DatagramPacket (buffer, buffer.length, group, port);
Mensaje de cadena;
tratar
{
socket.receive (datagrama);
mensaje = nueva cadena (búfer, 0, datagram.getLength (), “UTF-8”);
if (! message.startsWith (GroupChat.name))
System.out.println (mensaje);
}
catch (IOException e)
{
System.out.println (“¡Enchufe cerrado!”);
}
}
}
}
Guarde el archivo como GroupChat.java y compílelo usando javac y luego ejecute el programa usando 2 argumentos de línea de comando como se especifica. Un host de multidifusión se especifica mediante una dirección IP de clase D y un número de puerto UDP estándar. Las direcciones IP de clase D están en el rango 224.0.0.0
a 239.255.255.255
, inclusive. La dirección 224.0.0.0 está reservada y no debe utilizarse.
Aquí hay una salida de muestra del programa anterior:
He utilizado la dirección IP del host de multidifusión como 239.0.0.0 y el número de puerto como 1234 (ya que los números de puerto 0 a 1023 están reservados).
Hay 3 miembros en el grupo: Ironman , CaptainAmerica y Groot . Inicie los 3 terminales primero antes de enviar el mensaje, de lo contrario, los mensajes que se envían antes de iniciar el terminal se pierden (ya que no hay una función de búfer incorporado para almacenar los mensajes). Necesitamos dos hilos en esta aplicación. Uno para aceptar la entrada del usuario (usando la clase java.util.Scanner ) y el otro para leer los mensajes enviados desde otros clientes. Por lo tanto, he separado el hilo que hace el trabajo de lectura en la clase ReadThread . Para abandonar el grupo, cualquiera de los usuarios puede escribir Salir para finalizar la sesión.
El programa anterior se ejecuta en una sola máquina. La programación de sockets está destinada a la programación distribuida. El mismo fragmento de código cuando está presente en diferentes máquinas que tienen Java instalado puede satisfacer ese requisito.
Esto es solo la lógica del servicio básico. El proyecto sería aún más fascinante si se desarrolla el front-end. Puede usar AWT (Abstract Window Toolkit) de Java o su contraparte avanzada, Java Swing para desarrollar el front-end. Como esto no formaría parte de la programación de Socket, lo dejaré intacto sin entrar en detalles.
Puntos adicionales:
Puede incorporar la función de seguridad de red al realizar el cifrado antes de enviar el mensaje a través de la red. Las técnicas primitivas como el cifrado César o los métodos avanzados como RSA se pueden utilizar para realizar el cifrado-descifrado. Puede intentar usar RMI (Invocación de método remoto) de Java para realizar la misma tarea. Aquí, puede aprovechar la abstracción ofrecida por Java al máximo. Sin embargo, si su objetivo principal es la eficiencia, la programación de Socket es la mejor opción. Como no requiere ningún soporte de tiempo de ejecución, es un poco más rápido en comparación con RMI.
Gracias por el A2A Sunil Hiray