MulticastSocket est un DatagramSocket (UDP) avec la fonctionnalité supplémentaire de rejoindre des « groupes » d'autres hôtes de multidiffusion sur Internet.
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!"); } } } }
Enregistrez le fichier sous GroupChat.java et compilez-le à l'aide de javac, puis exécutez le programme en utilisant les deux arguments de ligne de commande spécifiés. Les hôtes de multidiffusion sont désignés par des adresses IP de classe D et des numéros de port UDP standard. Les adresses IP de classe D vont de 224.0.0.0 à 239.255.255.255 (inclus). L'adresse 224.0.0.0 est réservée et ne doit pas être utilisée.
Voici un exemple de sortie du programme ci-dessus :
Nous utilisons un hôte de multidiffusion avec l'adresse IP 239.0.0.0 et le numéro de port 1234 (car les numéros de port 0 à 1023 sont réservés). Le groupe compte 3 membres : Ironman, CaptainAmerica et Groot. Démarrez les trois terminaux avant d'envoyer des messages, sinon les messages envoyés avant de démarrer le terminal seront perdus (car il n'y a pas de tampons fusionnés pour stocker les messages.) Nous avons besoin de deux threads dans cette application. L’un est utilisé pour accepter les entrées de l’utilisateur (à l’aide de la classe java.util.Scanner) et l’autre est utilisé pour lire les messages envoyés par d’autres clients. Par conséquent, j’ai séparé le thread qui effectue le travail de lecture en une classe ReadThread. Pour quitter le groupe, n'importe quel utilisateur peut taper exit pour mettre fin à la session.
Le programme ci-dessus est exécuté sur une seule machine. La programmation socket convient à la programmation distribuée. Cette exigence est satisfaite lorsque le même extrait de code apparaît sur différentes machines sur lesquelles Java est installé. Il ne s'agit que de la logique de service la plus élémentaire. Ce projet sera plus attractif si le front-end est développé. Vous pouvez développer le front-end à l'aide de l'AWT (Abstract Window Toolkit) de Java ou de son homologue de haut niveau Java Swing. Puisque cela ne fait pas partie de la programmation Socket, je le laisserai inchangé sans entrer dans les détails.
Points supplémentaires :
Vous pouvez intégrer des fonctionnalités de sécurité réseau en effectuant un cryptage avant d'envoyer des messages sur le réseau.
Des techniques primitives telles que le chiffre César ou des méthodes avancées telles que RSA peuvent être utilisées pour effectuer le cryptage et le décryptage. Vous pouvez essayer d'utiliser le RMI (Remote Method Invocation) de Java pour effectuer la même tâche.
Ici, vous pouvez tirer le meilleur parti des abstractions fournies par Java. Cependant, si votre objectif principal est l’efficacité, la programmation Socket est le meilleur choix. Puisqu'il ne nécessite aucune prise en charge d'exécution, il est plus rapide que RMI.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!