MulticastSocket を使用してグループ チャット アプリケーションを実装するための Java プログラミング

PHPz
リリース: 2023-04-21 09:40:08
転載
1683 人が閲覧しました

MulticastSocket は、インターネット上の他のマルチキャスト ホストの「グループ」に参加する追加機能を備えた (UDP) DatagramSocket です。

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 を使用してコンパイルし、指定された 2 つのコマンド ライン引数を使用してプログラムを実行します。マルチキャスト ホストは、クラス D IP アドレスと標準の UDP ポート番号によって指定されます。クラス D IP アドレスの範囲は 224.0.0.0 ~ 239.255.255.255 (両端の値を含む) です。アドレス 224.0.0.0 は予約されているため、使用しないでください。
以下は、上記のプログラムからの出力例です:

MulticastSocket を使用してグループ チャット アプリケーションを実装するための Java プログラミング

MulticastSocket を使用してグループ チャット アプリケーションを実装するための Java プログラミング

MulticastSocket を使用してグループ チャット アプリケーションを実装するための Java プログラミング

##マルチキャスト ホストを使用します。 IP アドレスは 239.0.0.0、ポート番号は 1234 です (ポート番号 0 ~ 1023 は予約されているため)。グループのメンバーはアイアンマン、キャプテン・アメリカ、グルートの3名です。メッセージを送信する前に、最初に 3 つの端末をすべて起動してください。そうしないと、端末を起動する前に送信されたメッセージが失われます (メッセージを保存するマージされたバッファがないため)。このアプリケーションには 2 つのスレッドが必要です。 1 つはユーザー入力 (java.util.Scanner クラスを使用) を受け入れるために使用され、もう 1 つは他のクライアントから送信されたメッセージを読み取るために使用されます。したがって、読み取り作業を行うスレッドを ReadThreadclass に分離しました。グループから離れるには、どのユーザーも「exit」と入力してセッションを終了できます。

上記のプログラムは単一のマシン上で実行されます。ソケット プログラミングは分散プログラミングに適しています。この要件は、Java がインストールされている別のマシンに同じコード スニペットが表示される場合に満たされます。これは最も基本的なサービス ロジックです。このプロジェクトはフロントエンドが開発されればさらに魅力的になるでしょう。 Java の AWT (Abstract Window Toolkit) またはその高レベルの対応物である Java Swing を使用してフロントエンドを開発できます。これは Socket プログラミングの一部ではないため、詳細には触れずにそのままにしておきます。

追加ポイント:

ネットワーク上でメッセージを送信する前に暗号化を実行することで、ネットワーク セキュリティ機能を組み込むことができます。

Caesar 暗号などの原始的な手法や、RSA などの高度な手法を使用して、暗号化と復号化を実行できます。 Java の RMI (リモート メソッド呼び出し) を使用して同じタスクを実行してみることができます。
ここでは、Java が提供する抽象化を最大限に活用できます。ただし、主な目標が効率である場合は、ソケット プログラミングが最良の選択です。ランタイムサポートを必要としないため、RMI と比較して高速です。

以上がMulticastSocket を使用してグループ チャット アプリケーションを実装するための Java プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!