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 相比要快一些。
以上是Java程式實作群組聊天應用程序,使用MulticastSocket實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!