MulticastSocket ist ein (UDP) DatagramSocket mit der zusätzlichen Funktionalität, „Gruppen“ anderer Multicast-Hosts im Internet beizutreten.
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!"); } } } }
Speichern Sie die Datei als GroupChat.java und kompilieren Sie sie mit javac. Führen Sie dann das Programm mit den beiden angegebenen Befehlszeilenargumenten aus. Multicast-Hosts werden durch IP-Adressen der Klasse D und Standard-UDP-Portnummern gekennzeichnet. IP-Adressen der Klasse D reichen von 224.0.0.0 bis 239.255.255.255 (einschließlich). Die Adresse 224.0.0.0 ist reserviert und sollte nicht verwendet werden.
Das Folgende ist eine Beispielausgabe des oben genannten Programms:
#🎜🎜 ##🎜 🎜#Wir verwenden die Multicast-Host-IP-Adresse 239.0.0.0 und die Portnummer 1234 (da die Portnummern 0 bis 1023 reserviert sind). Die Gruppe besteht aus drei Mitgliedern: Ironman, CaptainAmerica und Groot. Starten Sie zuerst alle drei Terminals, bevor Sie Nachrichten senden. Andernfalls gehen Nachrichten verloren, die vor dem Starten des Terminals gesendet wurden (da keine zusammengeführten Puffer zum Speichern der Nachrichten vorhanden sind). Wir benötigen zwei Threads in dieser Anwendung. Einer dient zum Akzeptieren von Benutzereingaben (mithilfe der Klasse java.util.Scanner) und der andere zum Lesen von Nachrichten, die von anderen Clients gesendet werden. Deshalb habe ich den Thread, der die Lesearbeit erledigt, in eine ReadThread-Klasse aufgeteilt. Um die Gruppe zu verlassen, kann jeder Benutzer „exit“ eingeben, um die Sitzung zu beenden.
Das obige Programm wird auf einer einzelnen Maschine ausgeführt. Die Socket-Programmierung eignet sich für die verteilte Programmierung. Diese Anforderung ist erfüllt, wenn derselbe Codeausschnitt auf verschiedenen Computern mit installiertem Java angezeigt wird. Dies ist nur die grundlegendste Servicelogik. Dieses Projekt wird attraktiver, wenn das Frontend entwickelt wird. Sie können das Frontend mit Javas AWT (Abstract Window Toolkit) oder seinem High-Level-Gegenstück Java Swing entwickeln. Da dies nicht Teil der Socket-Programmierung ist, werde ich es unverändert lassen, ohne auf Details einzugehen.
Zusätzliche Punkte:
Sie können Netzwerksicherheitsfunktionen integrieren, indem Sie vor dem Senden von Nachrichten über das Netzwerk eine Verschlüsselung durchführen.
Hier können Sie die von Java bereitgestellten Abstraktionen optimal nutzen. Wenn Ihr Hauptziel jedoch die Effizienz ist, ist die Socket-Programmierung die beste Wahl. Da keine Laufzeitunterstützung erforderlich ist, ist es im Vergleich zu RMI schneller.
Das obige ist der detaillierte Inhalt vonJava-Programmierung zur Implementierung einer Gruppenchat-Anwendung mithilfe von MulticastSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!