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();
}
}
【運用結果】