[java] WeChatチャットをシミュレートする(ネットワークプログラミング)

WeChat チャットをシミュレートする (ネットワーク プログラミング)

現在、WeChat チャットは人々の生活に欠かせない重要な部分となっており、人々のコミュニケーションの多くは WeChat を通じて行われています。このケースでは、ローカル エリア ネットワーク内の 2 人の WeChat 友人間のチャット アプレットの実装をシミュレートするには、マルチスレッドと UDP 通信関連の知識を組み合わせる必要があります。

プログラムの全体的な要件は次のとおりです: プログラムが開始されると、ユーザーは自分と友人の WeChat ID を入力するように求められ、プログラムは 2 つのスレッド (メッセージ送信スレッドとメッセージ受信スレッド) を作成して、 LANチャットシステム。

特別な注意事項:
1. ローカル エリア ネットワーク内で通信を実現するために、ユーザーがメッセージを送信するときは、ブロードキャスト (グループ送信) 機能を使用します。メッセージを送信するときは、ターゲット IP アドレスを 127.0.0.255 に設定します。(もちろん、相手のIPアドレスを直接使用することも可能です。)

2. WeChat ID は実際にはデータの受信に使用されるポート番号です。たとえば、Zhang San の WeChat ID は 5001、Li Si の WeChat ID は 5008 です。次に、Zhang San はポート 5001 でメッセージを監視および受信し、Li Si はポート 5008 で監視およびメッセージを受信します。Zhang San が Li Si にメッセージを送信するとき、彼は実際にはブロードキャスト アドレスの 5008 ポート番号にデータ パケットを送信します。同様に、Li Si が Zhang San にメッセージを送信するとき、彼は実際にはブロードキャスト アドレスの 5001 ポート番号にデータ パケットを送信します。

3. プログラムのデバッグを容易にするために、同じマシン上で 2 つのプログラムを同時に起動したいと考えています。この場合、2 つのプログラムの実行インスタンスを開始するには、IDE で同じプログラムを 2 回実行する必要があります。

【ミッション目標】

 「WeChat チャットをシミュレートする」タスクの実装アイデアを分析する方法を学びます。
 アイデアに基づいて「WeChat チャットのシミュレート」タスクのソースコードの作成、コンパイル、操作を自主的に完了します。

 ネットワーク通信における UDP プロトコルのプログラミング原理を習得します。

 UDPネットワーク通信のDatagramPacketとDatagramSocketの使い方をマスターする。

【実現アイデア】

このプログラムにはマルチスレッドが含まれており、インターフェイスベースのマルチスレッド実装テクノロジを使用できます。

1. メッセージを送信するためのスレッド クラス SendTask を作成します。このクラスの主な機能は、run メソッドでソケット オブジェクトとパケット オブジェクトを作成し、キーボードで入力されたテキストを取得し、それをフレンド ポートに送信することです。 127.0.0.255 アドレス番号。

2. メッセージを受信するスレッド クラス ReceiveTask を作成します。このクラスの主な機能は、run メソッドでソケット オブジェクトとパケット オブジェクトを作成し、指定されたポート番号でメッセージをリッスン (受信) し、出力することです。

メインクラス Room を記述し、メインメソッドでユーザーの WeChat ID と友人の WeChat ID を取得し、それぞれ送信スレッドと受信スレッドを作成して開始します。

特記事項: ユーザーの WeChat ID (デモ プログラムではポート番号 5001) が main メソッドの送信スレッド オブジェクトに渡されるため。したがって、int メンバー属性 sendPort を SendTask クラスに追加し、パラメーターを持つコンストラクターを追加して、メイン メソッドでオブジェクトを作成するときにそれを初期化できます。同様に、int メンバー属性 acceptPort を ReceiveTask クラスに追加し、友人の WeChat ID (デモ プログラムではポート番号 5008) を受信スレッド オブジェクトに渡します。

【実装コード】
1.SendTaskクラス

package cn.edu.gpnu.bank.cn.edu.gpnu.exp13;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class SendTask implements Runnable {
    
    
    private int sendPort; // 发消息的微信号(端口号)

    public SendTask(int sendPort) {
    
    
        this.sendPort = sendPort;
    }
    @Override
    public void run() {
    
    
        try {
    
    
            // 1. 创建 DatagramSocket 对象 ds
            DatagramSocket ds=new DatagramSocket();
            InetAddress inetAddress = InetAddress.getByName("127.0.0.255");
            Scanner sc = new Scanner(System.in);
            while (true) {
    
    
                // 2. 获取键盘输入的信息
                String str=sc.nextLine();
                // 3. 将消息转换为字节数组,再将其封装到 DatagramPacket 对象 dp 中
                byte[] arr=str.getBytes();
                DatagramPacket dp=new DatagramPacket(arr,arr.length,inetAddress,sendPort);
                // 4.ds 发送数据 dp
                ds.send(dp);
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

}

2. ReceiveTaskクラス

package cn.edu.gpnu.bank.cn.edu.gpnu.exp13;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveTask implements Runnable{
    
    
    private int receivePort;// 接收数据的端口号

    public ReceiveTask(int receivePort) {
    
    
        this.receivePort = receivePort;
    }

    //补充构造方法
    @Override
    public void run() {
    
    
        try {
    
    
            // 1.DatagramSocket 对象 ds
            DatagramSocket ds=new DatagramSocket(receivePort);
            // 2.创建字节数组和 DatagramPacket 对象 dp
            byte [] buf=new byte[1024];
            DatagramPacket dp=new DatagramPacket(buf,buf.length);
            //补充代码
            while (true) {
    
    
                // 3.ds 接收数据 sp
                ds.receive(dp);
                // 4.接收到的数据转化为字符串,并打印显示
                String str = "【"+dp.getAddress().getHostAddress()+"】:"+new String(dp.getData(),0, dp.getLength());
                System.out.println(str);
            }

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

3. ルームクラス

package cn.edu.gpnu.bank.cn.edu.gpnu.exp13;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Room {
    
    
    public static void main(String[] args) {
    
    
        //显示欢迎信息,获取用户微信号和好友微信号。
        System.out.println("欢迎进入模拟微信系统!");
        //补充代码
        //创建发送消息线程对象(传递用户微信号)并启动。
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您的微信号(端口号):");
        int sendPort=sc.nextInt();
        SendTask s=new SendTask(sendPort);
        //补充代码
        //创建接收消息线程对象(传递好友微信号)并启动。
        System.out.println("请输入您的好友微信号(端口号):");

        int receivePort=sc.nextInt();
        ReceiveTask r=new ReceiveTask(receivePort);
        //补充代码
        System.out.println("微信聊天室已启动!");
        new Thread(s).start();
        new Thread(r).start();
    }

}

【運用結果】
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_52703008/article/details/126324839