模拟微信聊天-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

news2024/11/24 15:44:00

【案例9-1】  模拟微信聊天

【案例介绍】

1.案例描述

在如今,微信聊天已经人们生活中必不可少的重要组成部分,人们的交流很多都是通过微信来进行的。本案例要求:将多线程与UDP通信相关知识结合,模拟实现微信聊天小程序。通过监听指定的端口号、目标IP地址和目标端口号,实现消息的发送和接收功能,并显示聊天的内容。

2.运行结果

运行结果

 

【案例分析】

(1)第一要知道用什么技术实现,通过上述任务描述可知此任务是使用多线程与UDP通信相关知识实现的。要实现图中的聊天窗口界面。首先需要定义一个实现微信聊天功能的类,类中需要定义访问微信聊天的输出语句,从而获取输入的发送端端口号、接收端端口号以及实现发送和接收功能的方法。

(2)实现发送数据的功能。该功能通过一个实现了Runnable接口的类实现,类中需要定义获取发送数据的端口号,并在实现run()的方法中,编写发送数据的方法。

(3)实现接收数据的功能。该功能通过一个实现了Runnable接口的类实现,类中需要定义获取接收数据的端口号,并在实现run()的方法中,编写显示接收到的数据的方法。

(4)创建完所有的类与方法后,运行两次程序,同时开启两个窗口来实现聊天功能。

【案例实现】

(1)创建微信聊天程序,开启两个聊天窗口,需要创建两个聊天程序。两个聊天程序代码分别如下所示。

Room.java

  1. package chapter090;
  2. import java.util.Scanner;
  3. public class Room {
  4.     public static void main(String[] args) {
  5.         System.out.println("微信聊天欢迎您!");
  6.         Scanner sc = new Scanner(System.in);
  7.         System.out.print("请输入您的微信号登录:");
  8.         int sendPort = sc.nextInt();
  9.         System.out.print("请输入您要发送消息的微信号:");
  10.         int receivePort = sc.nextInt();
  11.         System.out.println("微信聊天系统启动!!");      
  12.          //发送操作
  13.         new Thread(new SendTask(sendPort), "发送端任务").start();
  14.          //接收操作
  15.         new Thread(new ReceiveTask(receivePort), "接收端任务").start();
  16.     }
  17. }

上述代码中,第12行代码用多线程实现发送端口号以及实现发送端功能的方法。第14行代码用多线程实现接收端口号以及实现接收端功能的方法。

Lucy.java

  1. package chapter090;
  2. import java.util.Scanner;
  3. public class Lucy {
  4. public static void main(String[] args) {
  5.     System.out.println("微信聊天欢迎您!");
  6.     Scanner sc = new Scanner(System.in);
  7.     System.out.print("请输入您的微信号登录:");
  8.     int sendPort = sc.nextInt();
  9.     System.out.print("请输入您要发送消息的微信号:");
  10.     int receivePort = sc.nextInt();
  11.     System.out.println("微信聊天系统启动!!");
  12.     //发送操作
  13.     new Thread(new SendTask(sendPort), "发送端任务").start();
  14.     //接收操作
  15.     new Thread(new ReceiveTask(receivePort), "接收端任务").start();
  16. }
  17. }

(2)创建发送数据的任务类,其代码如下所示。

SendTask.java

    1. package chapter0901;
    2. import java.net.DatagramPacket;
    3. import java.net.DatagramSocket;
    4. import java.net.InetAddress;
    5. import java.util.Scanner;
    6. public class SendTask implements Runnable {
    7.     private int sendPort; // 发数据的端口号
    8.     // 构造方法
    9.     public SendTask(int sendPort) {
    10.         this.sendPort = sendPort;
    11.     }
    12.     @Override
    13.     public void run() {
    14.         try {
    15.            // 1. 创建DatagramSocket对象
    16.            DatagramSocket ds = new DatagramSocket();
    17.            // 2.输入要发送的数据
    18.            Scanner sc = new Scanner(System.in);
    19.            while (true) {
    20.                String data = sc.nextLine();// 获取键盘输入的数据
    21.                // 3.封装数据到 DatagramPacket对象中
    22.            byte[] buf = data.getBytes();
    23.            DatagramPacket dp = new DatagramPacket(buf, buf.length,
    24.             InetAddress.getByName("127.0.0.255"),sendPort);
    25.                // 4.发送数据
    26.                ds.send(dp);
    27.            }
    28.         } catch (Exception e) {
    29.            e.printStackTrace();
    30.         }
    31.     }
    32. }

上述代码中,第6~10行代码声明了一个名称为sendPort的变量表示发送数据的端口号,并通过该类的构造方法获取所输入的端口号。第12~29行代码,实现run()方法,在run()方法中,首先创建了DatagramSocket对象,然后通过Scanner对象和循环方法获取键盘输入的数据,并将获取的数据封装到了DatagramPacket对象中,最后通过DatagramSocket对象的send()方法发送数据。在循环方法中,由于发送数据时可能多次连续发送,所以将循环条件设置为true,表示不断循环获取和发送数据。在创建DatagramPacket对象时,为了让当前局域网的所有人都接收到消息,所以将IP地址设置为127.0.0.255。

(3)创建接收数据的任务类,其代码如下所示。

ReceiveTask.java

  1. package chapter090;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. public class ReceiveTask implements Runnable{
  5.     private int receivePort;// 接收数据的端口号
  6.     public ReceiveTask(int receivePort) {
  7.         this.receivePort = receivePort;
  8.     }
  9.     @Override
  10.     public void run() {
  11.         try {
  12.            // 1.DatagramSocket对象
  13.            DatagramSocket ds = new DatagramSocket(receivePort);
  14.            // 2.创建DatagramPacket对象
  15.            byte[] buf = new byte[1024];
  16.            DatagramPacket dp = new DatagramPacket(buf, buf.length);
  17.            // 3.接收数据
  18.            while (true) {
  19.                ds.receive(dp);
  20.                // 4.显示接收到的数据
  21.                String str = new String(dp.getData(), 0,
  22.                                                dp.getLength());
  23.                System.out.println("收到" +
  24.                    dp.getAddress().getHostAddress()
  25.                 + "--发送的数据--" + str);
  26.            }
  27.         } catch (Exception e) {
  28.            e.printStackTrace();
  29.         }
  30.     }
  31. }

上述代码中,第4行代码声明了一个名称为receivePort的变量来表示接收数据的端口号,第5~7行代码定义一个该类的构造方法,并通过该类的构造方法获取所输入的端口号,第9~28行代码在run()方法中,首先创建了DatagramSocket对象,创建该对象时需要传入接收数据的端口号,然后创建用于接收数据的DatagramPacket对象,接下来通过循环的方法来接收数据,最后通过输出语句来显示接收到的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试题【翻转单词顺序】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单) 文章目录 最近更新的博客使用说明翻转单词顺序题目输入输出示例一输入输出示例二输入输出说明示例三输入输出说明示例四

解决跑pytorch代码报错AttributeError: module ‘distutils‘ has no attribute ‘version‘

跑pytorch代码报错AttributeError: module ‘distutils’ has no attribute ‘version’ Traceback (most recent call last): File “D:/pycharm_envir/gaozhiyuan/Segmentation/pytorch_segmentation/deeplabv3-plus-pytorch-main/train.py”, line 16, in from utils.callb…

【C++修炼之路】22.哈希

每一个不曾起舞的日子都是对生命的辜负 哈希一.哈希概念及性质1.1 哈希概念1.2 哈希冲突1.3 哈希函数二.哈希冲突解决2.1 闭散列/开放定址法2.2 开散列/哈希桶三.开放定址法代码3.1 插入Insert3.2 查找Find3.3 删除Erase3.4 映射的改良&完整代码四.开散列代码4.1 插入Inser…

Linux之init.d、rc.d文件夹说明

备注:Ubuntu没有rc.d文件夹,原因看问题四 Linux的几个重要文件 rc.d,init.d文件夹的说明 今天在研究mysql的安装的时候,最后一步要创建一个软连接,使得mysql服务可以自启动,代码如下: ln -s…

扒系统CR8记录

目录 终极改造目标 过程记录 参考 为了将一套在线安装的系统,在不了解其架构、各模块细节的基础上,进行扒弄清楚,作以下记录。 终极改造目标 最终的目标,就是只通过CreMedia8_20230207.tar.gz解压 install 就把业务包安装了&…

CorelDRAW2023新功能有哪些?最新版cdr下载安装教程

使用 CorelDRAW2023,随时随都能进行设计创作。在 Windows或Mac上使用专为此平台设计的直观界面,以自己的风格尽情自由创作。同全球数百万信赖CorelDRAW Graphics Suite 的艺术家、设计者及小型企业主一样,大胆展现真我,创作出众的…

IAP初探

IAP(In-Application Programming)在应用编程,浅显易懂,按照字面意思即是在程序不关闭情况下,对应用进行再次写入程序,对程序的写入需要传输数据,而传输数据的前提是通信, IAP对代码进行更新可以简要分为以…

【ElasticSearch系列-01】初识以及安装elasticSearch

elasticSearch入门和安装一,elasticSearch入门1,什么是elasticSearch2,elasticSearch的底层优点2.1,全文检索2.2,倒排索引2.2.1,正排索引2.2.2,倒排索引2.2.3,倒排索引解决的问题2.2…

Linux | 2. 用户管理

如有错误,恳请指出。 1. 设置文件权限 权限设置如下: root表示文件所有者,stud1表示文件所属组。其他用户无法访问。更改指令是chown。 更改目录文件所属组:chown .lab lossfound/更改目录文件所有者:chown lab loss…

mac安装 Termius

1.下载安装包 链接: https://pan.baidu.com/s/1f5xmvYnVehCkMUD291SbsA?pwdy43k 提取码: y43k 2.打开系统偏好设置 -> 安全性与隐私 -> 通用,勾选“任何来源” 显示文件损坏的情况下执行下面操作 3.打开terminal终端 3.1 输入:sudo spctl --m…

windows10使用wsl2安装docker

配环境很麻烦,想利用docker的镜像环境跑一下代码整个安装过程的原理是:windows使用docker,必须先安装一个linux虚拟机,才可运行docker,而采用wsl2安装虚拟机是目前最好的方法第一步 windows安装wsl2控制面板->程序-…

数据结构-考研难点代码突破(C++实现树型查找 - B树插入与遍历,B+树基本概念)

数据结构(C)[B树(B-树)插入与中序遍历,效率分析]、B树、B*树、B树系列应用 文章目录1. B树B树的插入与删除流程2. B树(MySQL)3. B树与B树对比4. C实现B树插入,中序遍历1. B树 B树类…

面试题(基础篇)

1、你是怎样理解OOP面向对象的面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:(1)继承:继承是从已有类得到继承信息创建新类的过程(2)封装:通常认为封装是把数据和操作数据的方法…

vue中的$forceUpdate()、$set()

$forceUpdate() 迫使vue实例重新(rander)渲染虚拟dom,注意并不是重新加载组件。 结合vue的生命周期,调用 $forceupdate 后只会触发beforeupdate和updated这两个钩子函数,不会触发其他的钩子函数。它仅仅影响实例本身和…

作为一名Android车载工程师,需要具备哪些能力?

安卓开发在近几年的就业环境大家肯定都听说过,许多Android开发程序员都找不到自己满意的工作,于是纷纷另谋出路… 如今,随着Android汽车开发的兴起,很多Android开发者想转行做Android车载开发。然而,Android车载开发不…

深入理解border以及应用

深入border属性以及应用&#x1f44f;&#x1f44f; border这个属性在开发过程中很常用&#xff0c;常常用它来作为边界的。但是大家真的了解border吗&#xff1f;以及它的形状是什么样子的。 我们先来看这样一段代码&#xff1a;&#x1f44f; <!--* Author: syk 185901…

如何为三星active2手表安装自己DIY的表盘

一、步骤介绍 Step 1. 下载Galaxy watch studio&#xff1b; Step 2. 按照up主“隔壁张师傅2022”的文章进行安装。 二、安装流程简单说明&#xff1a; ① 电脑端官网下载并安装Galaxy Watch Designer或者Galaxy Watch Studio程序。 ② 关闭手表蓝牙连接&#xff0c;并打开调…

Spring中最常用的11个扩展点

前言我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。除此之外…

【源码解析】SpringBoot的源码深入分析

SpringBoot源码分析 主流程 SpringBoot项目的组成是需要引入SpringBoot需要的依赖&#xff0c;另外启动类上添加SpringBootApplication&#xff0c;主要是标明该类是启动类和实现自动装配&#xff0c;自动装配的原理详细可见&#xff0c;SpringBoot自动装配的实现原理。那么m…

Docker基本介绍

最近需要将项目做成一个web应用并部署到多台服务器上&#xff0c;于是就简单学习了一下docker&#xff0c;做一下小小的记录。 1、简单介绍一下docker 我们经常遇到这样一个问题&#xff0c;自己写的代码在自己的电脑上运行的很流畅&#xff0c;在其他人电脑上就各种bug&…