本文實例為大家分享了Java使用MulticastSocket實現群聊應用程序的具體代碼,供大家參考,具體內容如下
在這篇文章中,討論了一個使用 MulticastSocket (Java Platform SE 7) 類的群聊應用程序。MulticastSocket 是一個 (UDP) DatagramSocket,具有加入 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!");
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
將文件另存為 GroupChat.java 并使用 javac 編譯它,然后使用指定的兩個命令行參數運行程序。多播主機由 D 類 IP 地址和標準 UDP 端口號指定。D 類 IP 地址的范圍為 224.0.0.0 到 239.255.255.255(含)。地址 224.0.0.0 是保留地址,不應使用。
以下是上述程序的示例輸出:
我們使用多播主機 IP 地址為 239.0.0.0,端口號為 1234(因為端口號 0 到 1023 被保留)。該組有 3 名成員:Ironman、CaptainAmerica 和 Groot。在發送消息之前首先啟動所有三個終端,否則在啟動終端之前發送的消息將丟失(因為沒有合并緩沖區來存儲消息。)我們在這個應用程序中需要兩個線程。一個用于接受用戶輸入(使用 java.util.Scanner 類),另一個用于讀取從其他客戶端發送的消息。因此,我將執行讀取工作的線程分離到 ReadThreadclass 中。要離開組,任何用戶都可以鍵入退出以終止會話。
上述程序在單機上執行。套接字編程適用于分布式編程。相同的代碼片段出現在安裝了 Java 的不同機器上時可以滿足該要求。這只是最基本的服務邏輯。如果前端開發出來,這個項目會更加吸引人。您可以使用 Java 的 AWT(抽象窗口工具包)或其高級對應物 Java Swing 來開發前端。由于這不是 Socket 編程的一部分,因此我將在不深入了解細節的情況下保持不變。
附加點:
您可以通過在通過網絡發送消息之前執行加密來合并網絡安全功能。
凱撒密碼等原始技術或 RSA 等高級方法可用于執行加解密。您可以嘗試使用 Java 的 RMI(遠程方法調用)來執行相同的任務。
在這里,您可以最大限度地利用 Java 提供的抽象。但是,如果您的主要目標是效率,那么 Socket 編程是最佳選擇。由于它不需要任何運行時支持,因此與 RMI 相比要快一些。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。