En esta publicación, se analiza una aplicación de chat grupal que utiliza 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.
Implementación
import java.net.*; import java.io.*; import java.util.*; public class GroupChat { private static final String TERMINATE = "Exit"; static String name; static volatile boolean finished = false; public static void main(String[] args) { if (args.length != 2) System.out.println("Two arguments required: <multicast-host> <port-number>"); else { try { InetAddress group = InetAddress.getByName(args[0]); int port = Integer.parseInt(args[1]); Scanner sc = new Scanner(System.in); System.out.print("Enter your name: "); name = sc.nextLine(); MulticastSocket socket = new MulticastSocket(port); // Since we are deploying socket.setTimeToLive(0); //this on localhost only (For a subnet set it as 1) socket.joinGroup(group); Thread t = new Thread(new ReadThread(socket,group,port)); // Spawn a thread for reading messages t.start(); // sent to the current group System.out.println("Start typing messages...\n"); while(true) { String message; message = sc.nextLine(); if(message.equalsIgnoreCase(GroupChat.TERMINATE)) { finished = true; socket.leaveGroup(group); socket.close(); break; } message = name + ": " + message; byte[] buffer = message.getBytes(); DatagramPacket datagram = new DatagramPacket(buffer,buffer.length,group,port); socket.send(datagram); } } catch(SocketException se) { System.out.println("Error creating socket"); se.printStackTrace(); } catch(IOException ie) { System.out.println("Error reading/writing from/to socket"); ie.printStackTrace(); } } } } class ReadThread implements Runnable { private MulticastSocket socket; private InetAddress group; private int port; private static final int MAX_LEN = 1000; ReadThread(MulticastSocket socket,InetAddress group,int port) { this.socket = socket; this.group = group; this.port = port; } @Override public void run() { while(!GroupChat.finished) { byte[] buffer = new byte[ReadThread.MAX_LEN]; DatagramPacket datagram = new DatagramPacket(buffer,buffer.length,group,port); String message; try { socket.receive(datagram); message = new String(buffer,0,datagram.getLength(),"UTF-8"); if(!message.startsWith(GroupChat.name)) System.out.println(message); } catch(IOException e) { System.out.println("Socket closed!"); } } } }
Guarde el archivo como GroupChat.java y compílelo usando javac y luego ejecute el programa usando dos 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:
Hemos utilizado la dirección IP del host de multidifusión como 239.0.0.0 y el número de puerto como 1234 (dado que los números de puerto del 0 al 1023 están reservados). Hay 3 miembros en el grupo: Ironman, CaptainAmerica y Groot. Inicie los tres 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 incorporada para almacenar los mensajes). Necesitamos dos subprocesos 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 ReadThreadclass. 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 socket está destinada a la programación distribuida. El mismo fragmento de código cuando está presente en diferentes máquinas que tienen instalado Java puede satisfacer ese requisito. Esta es solo la lógica básica del servicio. 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. Dado que esto no sería parte de la programación de Socket, lo dejo intacto sin entrar en detalles.
Puntos adicionales:
- Puede incorporar la función de seguridad de la red realizando el cifrado antes de enviar el mensaje a través de la red.
- Se pueden utilizar técnicas primitivas como el cifrado César o métodos avanzados como RSA para realizar el cifrado y descifrado. Puede intentar usar RMI (invocación de método remoto) de Java para realizar la misma tarea.
- Aquí, puede aprovechar al máximo la abstracción que ofrece Java. Sin embargo, si su objetivo principal es la eficiencia, entonces la programación de Socket es la mejor opción. Dado que no requiere soporte de tiempo de ejecución, es un poco más rápido en comparación con RMI.
Este artículo es una contribución de Aditya ch . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA