MulticastSocket is a (UDP) DatagramSocket with the added functionality of joining "groups" of other multicast hosts on the 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!"); } } } }
Save the file as GroupChat.java and compile it using javac, then run the program using the two command line arguments specified. Multicast hosts are designated by Class D IP addresses and standard UDP port numbers. Class D IP addresses range from 224.0.0.0 to 239.255.255.255 (inclusive). The address 224.0.0.0 is reserved and should not be used.
The following is a sample output from the above program:
Additional Points:
Primitive techniques such as the Caesar cipher or advanced methods such as RSA can be used to perform encryption and decryption. You can try using Java's RMI (Remote Method Invocation) to perform the same task.
Here you can take maximum advantage of the abstractions provided by Java. However, if your main goal is efficiency, then Socket programming is the best choice. Since it does not require any runtime support, it is faster compared to RMI.
The above is the detailed content of Java programming to implement group chat application, using MulticastSocket. For more information, please follow other related articles on the PHP Chinese website!