首頁  >  文章  >  Java  >  Java程式實作群組聊天應用程序,使用MulticastSocket實現

Java程式實作群組聊天應用程序,使用MulticastSocket實現

PHPz
PHPz轉載
2023-04-21 09:40:081685瀏覽

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 是保留位址,不應使用。
以下是上述程式的範例輸出:

Java程式實作群組聊天應用程序,使用MulticastSocket實現

Java程式實作群組聊天應用程序,使用MulticastSocket實現

Java程式實作群組聊天應用程序,使用MulticastSocket實現

我們使用多重播送主機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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除