十七、网络编程

news2024/9/20 20:31:12

文章目录

  • 一、网络相关的概念
  • 二、InetAddresss类
  • 三、Socket
    • 3.1 基本介绍
  • 四、TCP网络通信编程
    • 4.1 应用案例1(使用字节流)
    • 4.2 应用案例2(使用字节流)
    • 4.3 应用案例3(使用字符流)
    • 4.4 应用案例4(TCPFileCopy)
    • 4.5 netstat 指令
    • 4.6 TCP网络通讯不为人知的秘密
  • 五、UDP网络通信编程(了解)

一、网络相关的概念

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、InetAddresss类

在这里插入图片描述

package com.gyh.api;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class API_ {
    public static void main(String[] args) throws UnknownHostException {
        // 1. 获取本机的 InetAddress 对象
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost); // DESKTOP-P3G09I0/192.168.246.1

        // 2. 根据指定主机名/域名获取ip地址对象 getByName
        InetAddress host1 = InetAddress.getByName("DESKTOP-P3G09I0");
        System.out.println(host1); // DESKTOP-P3G09I0/192.168.246.1

        // 3. 根据域名获取 InetAddress 对象
        InetAddress host2 = InetAddress.getByName("www.baidu.com");
        System.out.println(host2); // www.baidu.com/14.215.177.39

        // 4. 通过 InetAddress 对象,获取对应的地址
        String hostAddress = host2.getHostAddress();
        System.out.println("host2 对应的ip地址为:" + hostAddress); // host2 对应的ip地址为:14.215.177.39

        // 5. 通过 InetAddress 对象,获取对应的主机名/或者域名
        String hostName = host2.getHostName();
        System.out.println(hostName);// www.baidu.com
    }
}

三、Socket

3.1 基本介绍

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口
摘自:百度百科

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、TCP网络通信编程

4.1 应用案例1(使用字节流)

在这里插入图片描述

在这里插入图片描述

// 服务器端
package com.gyh.api;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {
        // 1.在本机 的9999 端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        // ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在9999端口监听,等待连接..");
        // 2. 当没有客户端连接9999端口时,程序会阻塞,等待连接
        // 如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();

        System.out.println("服务器端 socket= " + socket.getClass());


        // 3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        while ((readLen = bufferedInputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLen)); // 根据读取到的实际长度,显示内容
        }
        // 5. 关闭流对象和socket,serverSocket,必须关闭
        bufferedInputStream.close();
        socket.close();
        serverSocket.close();
    }
}

// 客户端
package com.gyh.api;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP01Client {
    public static void main(String[] args) throws IOException {
        // 思路:
        // 1. 连接服务器(ip,端口号)
        // 解读:连接服务器的 9999 端口
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket返回=" + socket.getClass());
        // 2. 连上后,生成Socket,通过socket.getOutputStream()
        // 得到和socket关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        // 3. 通过输出流,写入数据到 数据通道
        bufferedOutputStream.write("你好".getBytes());
        // 4. 关闭流对象和socket,必须关闭
        bufferedOutputStream.close();
        socket.close();
        System.out.println("客户端退出");


    }
}

4.2 应用案例2(使用字节流)

在这里插入图片描述

在这里插入图片描述

// 服务器端
package com.gyh.api;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP02Server {
    public static void main(String[] args) throws IOException {
        // 1.在本机 的9999 端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        // ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在9999端口监听,等待连接..");
        // 2. 当没有客户端连接9999端口时,程序会阻塞,等待连接
        // 如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();

        System.out.println("服务器端 socket= " + socket.getClass());


        // 3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        while ((readLen = bufferedInputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLen)); // 根据读取到的实际长度,显示内容
        }
        // 4. 回复
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("Hello,client".getBytes());
        // 设置结束标记
        socket.shutdownOutput();

        // 5. 关闭流对象和socket,serverSocket,必须关闭
        outputStream.close();
        bufferedInputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务器端退出");
    }
}
// 客户端
package com.gyh.api;


import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP02Client {
    public static void main(String[] args) throws IOException {
        // 思路:
        // 1. 连接服务器(ip,端口号)
        // 解读:连接服务器的 9999 端口
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket返回=" + socket.getClass());
        // 2. 连上后,生成Socket,通过socket.getOutputStream()
        // 得到和socket关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        // 3. 通过输出流,写入数据到 数据通道
        outputStream.write("Hello,server".getBytes());
        // 设置一个结束标记
        socket.shutdownOutput();


        // 4. 接收信息
        byte[] buf = new byte[1024];
        int readLen = 0;
        InputStream inputStream = socket.getInputStream();
        while ((readLen = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLen));
        }

        // 5. 关闭流对象和socket,必须关闭
        // 发送信息
        outputStream.close();
        inputStream.close();
        socket.close();
        System.out.println("客户端退出");
    }
}

4.3 应用案例3(使用字符流)

在这里插入图片描述

在这里插入图片描述

// 服务器端
package com.gyh.api;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP03Server {
    public static void main(String[] args) throws IOException {
        // 1.在本机 的9999 端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        // ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在9999端口监听,等待连接..");
        // 2. 当没有客户端连接9999端口时,程序会阻塞,等待连接
        // 如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();

        System.out.println("服务器端 socket= " + socket.getClass());


        // 3. IO读取,使用字符流,使用 InputStreamReader 将 inputStream 转成字符流
        String content;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((content = bufferedReader.readLine()) != null) {
            System.out.println(content);
        }
        // 4. IO读取,使用字符流,使用 OutputStreamWriter 将 outStream 转成字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("Hello,client");
        bufferedWriter.newLine();// 插入一个换行符,表示写入的内容结束  注意:要求对方使用readLine()的方式来读
        bufferedWriter.flush(); // 如果使用字符流,需要手动刷新,否则数据不会写入数据通道

        socket.shutdownOutput();

        // 5. 关闭流对象和socket,serverSocket,必须关闭
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务器端退出");
    }
}

// 客户端
package com.gyh.api;


import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP03Client {
    public static void main(String[] args) throws IOException {
        // 思路:
        // 1. 连接服务器(ip,端口号)
        // 解读:连接服务器的 9999 端口
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket返回=" + socket.getClass());
        // 2. 连上后,生成Socket,通过socket.getOutputStream()
        // 使用字符流,使用 OutputStreamWriter 将 outStream 转成字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        // 3. 通过输出流,写入数据到 数据通道
        bufferedWriter.write("Hello,server");
        bufferedWriter.newLine();// 插入一个换行符,表示写入的内容结束  注意:要求对方使用readLine()的方式来读
        bufferedWriter.flush(); // 如果使用字符流,需要手动刷新,否则数据不会写入数据通道

        socket.shutdownOutput(); // 要添加,否则对方不知道说完没有

        // 4. 接收信息
        String content;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((content = bufferedReader.readLine()) != null) {
            System.out.println(content);
        }

        // 5. 关闭流对象和socket,必须关闭
        // 发送信息
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出");


    }
}

4.4 应用案例4(TCPFileCopy)

在这里插入图片描述

// 服务器端
package com.gyh.api;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP04Server {
    public static void main(String[] args) throws IOException {
        // 启动一个端口号为9999的服务
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端等待连接....");
        // 接收一个socket信息,服务器未连接会在此阻塞
        Socket socket = serverSocket.accept();
        byte[] buf = new byte[1024];
        int readLen = 0;
        BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        // 保存至本地 src下的qie.png
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\ie.png"));
        while ((readLen = bufferedInputStream.read(buf)) != -1) {
            bufferedOutputStream.write(buf, 0, readLen);
        }
        bufferedOutputStream.close(); // 关闭文件输出流


        // 接收完毕回复
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("收到图片");
        bufferedWriter.flush();
        socket.shutdownOutput();

        // 关闭资源
        bufferedWriter.close();
        bufferedInputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端关闭");

    }
}
// 客户端
package com.gyh.api;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketTCP04Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        // 发送图片
        byte[] buf = new byte[1024];
        int readLen;
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("C:\\Users\\Gaoyonghao\\Desktop\\1.PNG"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
        while ((readLen = bufferedInputStream.read(buf)) != -1) {
            bufferedOutputStream.write(buf, 0, readLen);
        }
        // 发送完毕
        bufferedInputStream.close(); // 文件输入流关闭
        bufferedOutputStream.flush();
        socket.shutdownOutput(); // 设置写入数据的结束标记

        // 接收服务器端的消息
        String content;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((content = bufferedReader.readLine()) != null) {
            System.out.println(content);
        }

        //关闭资源
        bufferedReader.close();
        bufferedOutputStream.close();
        socket.close();
        System.out.println("客户端关闭");

    }
}

4.5 netstat 指令

在这里插入图片描述

4.6 TCP网络通讯不为人知的秘密

在这里插入图片描述

五、UDP网络通信编程(了解)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

// 接收方
package com.gyh.api;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketUDP01Receiver {
    public static void main(String[] args) throws IOException {
        // 1. 创建一个 DatagramSocket 对象,准备在 9999 端口接收数据
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        // 2. 构建一个 DatagramPacket ,准备接收数据
        //  在前面讲解 UDP 协议时,说过一个数据包最大为 64k
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        // 调用 接收方法
        // 提示:当有数据包发送到 本机的9999端口时,就会接收到数据
        // 如果没有数据包发送到 本机的9999端口,就会阻塞等待
        System.out.println("接收端A 等待接收数据");
        datagramSocket.receive(datagramPacket);

        // 4. 可以把packet 进行拆包,取出数据,并显示
        int length = datagramPacket.getLength(); // 实际接收到的数据字节长度
        byte[] data = datagramPacket.getData();

        String content = new String(data, 0, length);
        System.out.println(content);

        byte[] message = "好的,明天见".getBytes();
        datagramSocket.send(new DatagramPacket(message, message.length, InetAddress.getByName("127.0.0.1"), 8888));

        // 关闭资源
        datagramSocket.close();
        System.out.println("A端退出");

    }
}

// 发送方
package com.gyh.api;

import java.io.IOException;
import java.net.*;

/**
 * @author Gao YongHao
 * @version 1.0
 */
public class SocketUDP01Sender {
    public static void main(String[] args) throws IOException {
        // 1. 创建 DatagramSocket 对象,准备在 8888 端口发送、接收数据
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        // 2. 将需要发送的数据,封装到 DatagramPacket 对象
        byte[] content = "Hello,明天吃火锅".getBytes();
        // 说明:封装的 DatagramPacket对象 content内容字节数组,content.length,主机(IP),端口
        DatagramPacket datagramPacket = new DatagramPacket(content, content.length, InetAddress.getLocalHost(), 9999);
        datagramSocket.send(datagramPacket);

        // 3. 接收从receiver端回复的信息
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket1 = new DatagramPacket(bytes, bytes.length);
        datagramSocket.receive(datagramPacket1);

        int readLen = datagramPacket1.getLength();
        byte[] data = datagramPacket1.getData();
        System.out.println(new String(data, 0, readLen));

        datagramSocket.close();
        System.out.println("B端退出");


    }
}

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

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

相关文章

为啥一定要考HCIE安全?这4个理由你不得不看

大家都知道,网络安全越来越成为企业和个人关注的焦点。 随着网络攻击的日益复杂和频繁,对于具备高级网络安全技能的专业人才的需求也在不断增长。HCIE-Security认证,作为华为推出的顶级信息安全认证,正是满足这一需求的黄金标准。…

inflight 守恒化简

设 x 为 E bw / delay 效能,y 为 flow 在瓶颈处的实际分配带宽,r 为时延,inflt 守恒模型的方程组如下: I ( t ) ∑ i 0 n w i ( t ) I(t)\displaystyle\sum_{i0}^n w_i(t) I(t)i0∑n​wi​(t) d x d t y r − x \dfrac{dx}{dt…

论文速读|自然语言的最优控制合成:机遇与挑战

项目地址:Optimal Control Synthesis from Natural Language: Opportunities and Challenges 介绍了一种从自然语言自动生成最优控制器的框架,该框架主要包括以下几个步骤:首先,通过人类用户提供的初始文本和系统描述,…

苹果系统中如何安装Python和PyCharm

1、Python官网下载安装包 Python官网下载苹果版本的安装包。 2、PyCharm官网下载安装包 3、下载完毕后安装Python 我采用的是在Windows下下载安装包,然后移动硬盘挂接到MacOS的方式进行安装。 双击开始安装Python Python安装完毕 4、Python安装完毕后的测定 注意直…

【开源免费】基于SpringBoot+Vue.JS高校校园招聘服务系统(JAVA毕业设计)

本文项目编号 T 010 ,文末自助获取源码 \color{red}{T010,文末自助获取源码} T010,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Qt QPushButton 按钮添加数字气泡

使用场景 项目中,在某个按钮的右上角添加数字气泡是一个很常见的功能,可以用新建一个组合类来实现。不过这样比较麻烦,如果加气泡是后面的需求,可能改动的地方较多。 下面介绍2种比较简单,不需要改动按钮响应的方式。…

Web3社交新经济,与 SOEX 实现无缝交易的高级安全性

出于充分的理由,安全性是交易中至关重要的考虑因素。每个人都应该确保自己的资金在交易时是安全的。由于 SOEX 充当您与交易所的最佳连接,因此必须强调的是,该系统不会引发任何安全问题。 &a…

央视曝光“硫超标”枸杞,记者直击加工现场:被熏到泪流不止

枸杞,这一自古以来便被誉为“药食同源”的珍贵食材,不仅承载着中华民族深厚的养生智慧,也广泛融入现代人的日常饮食与保健之中。 从食品、饮料到保健品,枸杞的身影无处不在,其独特的营养价值与药用价值深受消费者青睐。…

心电调试笔记

原理图设计 注意事项 引脚连接检查:确保每个元器件与芯片引脚连接正确是基础,错误的连接可能导致系统无法正常工作。未连接引脚标识:对于未使用的引脚,虽然不连接但应标识为非使用状态,以免混淆或引起误操作。测试点设…

【 html+css 绚丽Loading 】 000034 三元聚散盘

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f495…

解锁MySQL数据库基础命令:从入门到精通的实战指南

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 前言:…

PLUTO: 推动基于模仿学习的自动驾驶规划的极限

PLUTO: Pushing the Limit of Imitation Learning-based Planning for Autonomous Driving PLUTO: 推动基于模仿学习的自动驾驶规划的极限 https://arxiv.org/abs/2404.14327 Abstract We present PLUTO, a powerful framework that Pushes the Limit of imitation learn…

【扇贝编程】python爬虫——爬取动态网页笔记

在示例网站上登陆后点开第一条请求(wp-login.php)。右边的 Headers 里可以看到请求地址(Request URL)为 https://wpblog.x0y1.com/wp-login.php,请求方式(Request Method)是 POST,状…

戴尔科技领涨市场,AI服务器需求成关键驱动力

戴尔科技强劲上涨,AI服务器需求激增 戴尔科技公司日内股价飙升4.2%,达到115.42美元,接近一个月高点。这一强劲表现主要得益于该公司上调了年度盈利预期,原因是对Nvidia驱动的人工智能优化服务器的需求显著增加。戴尔将2025财年的年…

RTC(实时时钟)/BKP(备份寄存器

1 unix时间戳 2 时间戳转换函数 3 BKP(备份寄存器) 1 TAMPER引脚侵入事件 2 RTC校准时间 3 RST闹钟脉冲和秒脉冲 可以输出出来为其他信号提供 4 校准时钟,寄存器加输出RTC校准时钟 5 总结:3个功能只能同时使用一个 4 BKP基本…

windows屏幕录制:探索四款顶级录屏工具!

在数字化时代,我们经常需要记录屏幕上的操作,无论是为了教学、演示还是娱乐。Windows操作系统提供了多种录屏工具,这些工具各有特色,能够满足不同用户的需求。本文将为您介绍几款备受好评的录屏软件! 福昕录屏大师 直…

【RabbitMQ】核心概念

界⾯上的导航栏共分6部分, 这6部分分别是什么意思呢, 我们先看看RabbitMQ的工作流程 1. Producer和Consumer Producer:生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息 Consumer: 消费者,也是RabbitMQ Server的客户端,从RabbitMQ接收消息 Broker:其实就是RabbitMQSer…

ABAP Dialog Radio Button

额.妈了个巴子,整了一天,才发现,原来Dialog 的Radio Button 是要右键去设置组的 我就说为什么不行咧 误区:我以为是属性那里的组去设置的

shell脚本编写之四则运算

shell程序默认支持整数加、减、乘、除、求余的运算。 1、使用$(())方式进行运算 例如计算23,使用$((23))。 我在脚本中加入这几种运算进行测试: 执行脚本后结果如下: 2、使用$[]方式进行运算 例如计算23,使用$[23]&#xff0c…

我在高职教STM32——ADC电压采集与光敏电阻(5)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课…