网络编程(IP、端口、协议、UDP、TCP)【详解】

目录

1.什么是网络编程?

2.基本的通信架构

3.网络通信三要素

4.UDP通信-快速入门

5.UDP通信-多发多收

6.TCP通信-快速入门     

7.TCP通信-多发多收   

8.TCP通信-同时接收多个客户端

9.TCP通信-综合案例

1.什么是网络编程?

        网络编程是可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术

2.基本的通信架构

        CS架构:Client客户端/Server服务端

        BS架构:Browser浏览器/Server服务端

        无论是CS架构,还是BS架构的软件都必须依赖网络编程

3.网络通信三要素

        1.IP地址

                IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标识,可以用来定位网络上的设备。

                IP地址有两种形式:

                        IPv4:

                                32位,4个字节

                                点分十进制: 192.168.1.66

                        IPv6:

                                128位

                                冒分十六进制: 2001:0db8:0000:0023:0008:0800:200c:417a

                IP域名: 网址

                公网IP, 内网IP:

                        公网IP:是可以连接互联网的IP地址;内网IP:也叫局域网IP,只能组织机构内部使用。                

                        内网IP:192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。

                特殊IP地址:127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。

                IP常用命令:

                        ipconfig :查看本机IP地址

                        ping IP地址:检查网络是否连通

                Java中IP地址的表示:

                        InetAddress

  

package com.itheima.day13.teacher.demo02_ip;import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;/*** IP:用于在一个网络里,找到某个计算机设备。一般使用IPv4,比如:192.168.29.33* 域名:因为IP比较难记,所以有了域名系统,更方便记忆*      IP和域名的关系,类似于  手机通讯录里  手机号和姓名备注的关系*      百度的ip:110.242.68.4*      百度的域名:www.baidu.com* IP地址对象:InetAddress**/
public class DemoInetAddress {public static void main(String[] args) throws IOException {//获取本机ip信息InetAddress local = InetAddress.getLocalHost();String localIp = local.getHostAddress();System.out.println("本机ip = " + localIp);String localName = local.getHostName();System.out.println("本机名 = " + localName);//获取指定ip或指定域名的信息// InetAddress baidu = InetAddress.getByName("www.baidu.com");InetAddress baidu = InetAddress.getByName("110.242.68.4");String baiduName = baidu.getHostName();System.out.println("baiduName = " + baiduName);String baiduIp = baidu.getHostAddress();System.out.println("baiduIp = " + baiduIp);//测试指定域名的网络是否畅通:200ms之内能否ping通百度boolean reachable = baidu.isReachable(200);System.out.println("reachable = " + reachable);}
}

        2.端口号

                标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535

                分类:

                        周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)                 

                        注册端口:1024~49151,分配给用户进程或某些应用程序

                        动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配

                注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

        3.协议

                1.网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。

                2.开放式网络互联标准

                        OSI网络参考模型:全球网络互联标准

                        TCP/IP网络模型:事实上的国际标准

                

                3.传输层的2个通信协议       

                        UDP:用户数据报协议

                        特点:

                                无连接、不可靠通信,通信效率高

                                不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。

                                发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的 。

                        应用场景:语音通话、视频直播

                        TCP:传输控制协议 

                        特点:

                                面向连接、可靠通信

                                要保证在不可靠的信道上实现可靠的传输

                        TCP主要有三个步骤实现可靠传输:

                                三次握手建立可靠连接:目的确定通信双方,收发消息都是正常无问题的!(全双工)

                                传输数据进行确认:目的保证传输数据的可靠性

                                四次挥手断开连接:目的确保双方数据的收发都已经完成!

                        应用场景:网页、文件下载、支付

4.UDP通信-快速入门

        Java提供了一个java.net.DatagramSocket类来实现UDP通信。

        构造器、方法:

        

        客户端实现步骤:

                创建DatagramSocket对象(客户端对象)​​​​​

                创建DatagramPacket对象封装需要发送的数据(数据包对象)

                使用DatagramSocket对象的send方法,传入DatagramPacket对象

                释放资源

        服务端实现步骤​​ 

                创建DatagramSocket对象并指定端口(服务端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法,传入DatagramPacket对象

                释放资源

package com.itheima.day13.teacher.demo01_udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/***/
public class Sender {public static void main(String[] args) throws Exception {//1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法DatagramSocket ds = new DatagramSocket();//2. 准备数据包byte[] data = "hello".getBytes();DatagramPacket packet =new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);//3. 把数据包里的数据发送出去ds.send(packet);//4. 释放资源ds.close();}
}----------------
package com.itheima.day13.teacher.demo01_udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;/***/
public class Receiver {public static void main(String[] args) throws Exception {//1. 创建DatagramSocket对象,并监听7788端口DatagramSocket ds = new DatagramSocket(7788);//2. 准备数据包。用于存储 接收到的数据。UDP的数据包64Kbyte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);//3. 接收数据。接收到的数据会被放到packet对象里ds.receive(packet);//4. 把接收到的数据打印出来String str =new String(packet.getData(), packet.getOffset(), packet.getLength());System.out.println("str = " + str);//5. 释放资源ds.close();}
}

        

5.UDP通信-多发多收

        客户端实现步骤:

                创建DatagramSocket对象(发送端对象)

                使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序

                如果用户输入的不是exit, 把数据封装成DatagramPacket

                使用DatagramSocket对象的send方法将数据包对象进行发送

                释放资源

        服务端实现步骤:

                创建DatagramSocket对象并指定端口(接收端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法传入DatagramPacket对象

                使用while死循环不断的进行第3步

        

package com.itheima.day13.teacher.demo03_udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;/*** 1. 发送的消息内容,由用户进行输入:用Scanner*      Scanner scanner = new Scanner(System.in);*      String line = scanner.nextLine();* 2. 可以多次发送消息,进行持续通信*      发送者持续多次发送*      如果用户输入的是“byebye”,就结束循环*/
public class Sender {public static void main(String[] args) throws Exception {//1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法DatagramSocket ds = new DatagramSocket();//2. 准备一个扫描器,用于读取用户的输入Scanner scanner = new Scanner(System.in);//3. 持续通信:不断读取用户的输入,把内容发送出去while (true) {//读取用户输入的内容String line = scanner.nextLine();//封装到数据包里byte[] data = line.getBytes();DatagramPacket packet =new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);//把数据包里的数据发送出去ds.send(packet);//如果用户输入的是byebye,就结束循环if ("byebye".equals(line)) {break;}}//4. 释放资源ds.close();}
}---------------------
package com.itheima.day13.teacher.demo03_udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** @author liuyp* @since 2024/02/28*/
public class Receiver {public static void main(String[] args) throws Exception {//1. 创建DatagramSocket对象,并监听7788端口DatagramSocket ds = new DatagramSocket(7788);//2. 准备数据包。用于存储 接收到的数据。UDP的数据包64Kbyte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);//3. 持续通信:不断的接收数据并打印出来while (true) {//4. 接收数据。接收到的数据会被放到packet对象里ds.receive(packet);//5. 把接收到的数据打印出来String str =new String(packet.getData(), packet.getOffset(), packet.getLength());System.out.println(packet.getSocketAddress() +"发送了: " + str);}//5. 释放资源// ds.close();}
}

6.TCP通信-快速入门     

        1.Java提供了一个java.net.Socket类来实现TCP通信。

                2.客户端实现步骤

                创建客户端的Socket对象,请求与服务端的连接。           

                使用socket对象调用getOutputStream()方法得到字节输出流。

                使用字节输出流完成数据的发送。

                释放资源:关闭socket管道。

        3.服务端实现步骤

                创建ServerSocket对象,注册服务端端口。

                调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。

                通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。

                释放资源:关闭socket管道

package com.itheima.day13.teacher.demo04_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;/***/
public class Client{public static void main(String[] args) throws IOException {//1. 使用TCP连接 本机的8888端口:创建Socket对象Socket socket = new Socket("127.0.0.1", 8888);//2. 通过Socket,把数据发出去到服务端DataOutputStream dos = new DataOutputStream(socket.getOutputStream());dos.writeUTF("hello");//3. 通过Socket,接收服务端返回的数据DataInputStream dis = new DataInputStream(socket.getInputStream());String answer = dis.readUTF();System.out.println("收到服务端返回结果:" + answer);//4. 释放资源dis.close();dos.close();socket.close();}
}----------------------
package com.itheima.day13.teacher.demo04_tcp;import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/*** @author liuyp* @since 2024/02/28*/
public class Server {public static void main(String[] args) throws IOException {//1. 监听8888端口:创建ServerSocketServerSocket serverSocket = new ServerSocket(8888);//2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待Socket socket = serverSocket.accept();//3. 通过Socket,接收客户端发过来的数据DataInputStream dis = new DataInputStream(socket.getInputStream());String data = dis.readUTF();System.out.println("接收到客户端发来的数据:" + data);//4. 通过Socket,给客户端返回数据DataOutputStream dos = new DataOutputStream(socket.getOutputStream());dos.writeUTF("hi");//5. 释放资源dos.close();dis.close();socket.close();serverSocket.close();}
}

7.TCP通信-多发多收   

        客户端使用死循环,让用户不断输入消息。

        服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息。

package com.itheima.day13.teacher.demo05_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;/*** 1. 客户端给服务端发送的内容:由用户输入* 2. 实现客户端和服务端的持续通信*/
public class Client{public static void main(String[] args) throws IOException {//1. 使用TCP连接 本机的8888端口:创建Socket对象Socket socket = new Socket("127.0.0.1", 8888);Scanner scanner = new Scanner(System.in);DataOutputStream dos = new DataOutputStream(socket.getOutputStream());DataInputStream dis = new DataInputStream(socket.getInputStream());while (true) {//2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去String line = scanner.nextLine();dos.writeUTF(line);//3. 通过Socket,接收服务端返回的数据String answer = dis.readUTF();System.out.println("收到服务端返回结果:" + answer);//如果用户输入的内容是byebye,就结束if ("byebye".equals(line)) {break;}}//4. 释放资源dis.close();dos.close();socket.close();}
}-----------------
package com.itheima.day13.teacher.demo05_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/*** @author liuyp* @since 2024/02/28*/
public class Server {public static void main(String[] args) throws IOException {//1. 监听8888端口:创建ServerSocketServerSocket serverSocket = new ServerSocket(8888);//2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待Socket socket = serverSocket.accept();DataInputStream dis = new DataInputStream(socket.getInputStream());DataOutputStream dos = new DataOutputStream(socket.getOutputStream());while (true) {//3. 通过Socket,接收客户端发过来的数据String data = dis.readUTF();System.out.println("接收到客户端发来的数据:" + data);//4. 通过Socket,给客户端返回数据dos.writeUTF("hi");if ("byebye".equals(data)) {break;}}//5. 释放资源dos.close();dis.close();socket.close();serverSocket.close();}
}

8.TCP通信-同时接收多个客户端

        主线程定义了循环负责接收客户端Socket管道连接 

        每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

package com.itheima.day13.teacher.demo06_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;/***/
public class ServerWorkerRunnable implements Runnable{private Socket socket;public ServerWorkerRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {DataInputStream dis = new DataInputStream(socket.getInputStream());DataOutputStream dos = new DataOutputStream(socket.getOutputStream());while (true) {//通过Socket,接收客户端发过来的数据。也是阻塞方法,即:如果当前socket里没有数据可读取,就阻塞String data = dis.readUTF();System.out.println("接收到客户端发来的数据:" + data);//通过Socket,给客户端返回数据dos.writeUTF("hi");if ("byebye".equals(data)) {break;}}//释放资源dos.close();dis.close();socket.close();} catch (IOException e) {System.out.println("连接已断开");}}
}--------------------
package com.itheima.day13.teacher.demo06_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/***/
public class Server {public static void main(String[] args) throws IOException {//1. 监听8888端口:创建ServerSocketServerSocket serverSocket = new ServerSocket(8888);//2. 死循环:不断尝试接受客户端的连接。有几个客户端连接进来,就接受几个连接while (true) {//3. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待Socket socket = serverSocket.accept();//4. 创建一个线程,由这个新线程专门负责它的通信。线程本身是异步的new Thread(new ServerWorkerRunnable(socket)).start();}// serverSocket.close();}
}----------------
package com.itheima.day13.teacher.demo06_tcp;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;/*** 1. 客户端给服务端发送的内容:由用户输入* 2. 实现客户端和服务端的持续通信*/
public class Client{public static void main(String[] args) throws IOException {//1. 使用TCP连接 本机的8888端口:创建Socket对象Socket socket = new Socket("127.0.0.1", 8888);Scanner scanner = new Scanner(System.in);DataOutputStream dos = new DataOutputStream(socket.getOutputStream());DataInputStream dis = new DataInputStream(socket.getInputStream());while (true) {//2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去String line = scanner.nextLine();dos.writeUTF(line);//3. 通过Socket,接收服务端返回的数据String answer = dis.readUTF();System.out.println("收到服务端返回结果:" + answer);//如果用户输入的内容是byebye,就结束if ("byebye".equals(line)) {break;}}//4. 释放资源dis.close();dos.close();socket.close();}
}

9.TCP通信-综合案例

        1.即时通信-群聊

                是指一个客户端把消息发出去,其他在线的全部客户端都可以收到消息。

                需要用到端口转发的设计思想。

                        服务端需要把在线的Socket管道存储起来,一旦收到一个消息要推送给其他管道。

        2.实现一个简易版的BS架构 

                BS架构的基本原理

        

package com.itheima.day13.teacher.demo07_tcp_tomcat;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/***/
public class TomcatWorkerRunnable implements Runnable {private Socket socket;public TomcatWorkerRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {// while (true) {try {//如果想要接收客户端提交过来的数据// InputStream is = socket.getInputStream();// is.read();//直接给客户端返回结果OutputStream os = socket.getOutputStream();os.write("HTTP/1.1 200\r\n".getBytes());os.write("Content-Type: text/html;charset=UTF-8\r\n".getBytes());os.write("\r\n".getBytes());os.write("<h1>Hello World!!!</h1>".getBytes());os.write("<a href='http://www.baidu.com'>百度</a>".getBytes());//必须给浏览器返回一个结束标志,否则浏览器会一直转圈socket.shutdownOutput();} catch (IOException e) {System.out.println("断开连接");}// }}
}----------------------
package com.itheima.day13.teacher.demo07_tcp_tomcat;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/***/
public class TomcatServer {public static void main(String[] args) throws IOException {//1. 监听8080端口。浏览器访问地址的格式 http://ip地址:8080ServerSocket serverSocket = new ServerSocket(8080);//2. 死循环while (true) {//3. 不断尝试接受客户端的连接,得到SocketSocket socket = serverSocket.accept();//4. 把socket交给一个新线程进行处理new Thread(new TomcatWorkerRunnable(socket)).start();}}
}

        

        

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

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

相关文章

Redis的事务

在 Redis 中&#xff0c;事务&#xff08;Transaction&#xff09;是一组命令的集合&#xff0c;可以作为一个单独的操作来执行&#xff0c;保证这组命令要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;具有原子性。在 Redis 中&#xff0c;事务是通过 MULTI、EXEC、…

repo介绍和安装

介绍 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安装&#xff1a; https://blog.csdn.net/ysy950803/article/details/104188793

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

初学者如何学习python

Python 作为当今最受欢迎的编程语言之一&#xff0c;已经被包括谷歌、优步、Instagram 等知名公司广泛采用于他们的应用程序开发。由于其易学易用的特性&#xff0c;Python 成为了编程初学者的首选语言。特别是在机器学习和数据科学领域&#xff0c;Python 的应用更是让它成为了…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

【电机仿真】空间矢量脉宽调制(SVPWM)算法与实现

前言 文章【电机仿真】永磁同步电机模型中所提及了PMSM数学模型&#xff0c;模型算法是电机控制的理论基础&#xff0c;但在实际控制中&#xff0c;需要将这两部分具象化。实际电机所需要的总是三相电流或者电压&#xff0c;控制对象为逆变器中的开关器件&#xff0c;我们需要将…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分&#xff0c;跟pmon的关系不大&#xff01;&#xff01; 参考手册&#xff1a;《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册&#xff0c;让我是有点惊讶&#xff0c;但是也让我迷惑。&#xff08;一个串口复用为4个是啥意思&#xff1f;&#xff09;…

Java项目:32 基于springboot的课程作业管理系统(含源码数据库+文档免费送)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1a;首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

[蓝桥杯 2020 省 AB3] 日期识别

每日一道算法题之日期识别 一、题目描述二、思路三、C代码 一、题目描述 题目来源&#xff1a;洛谷 【蓝桥杯 2020 第三轮省赛 AB 组 F 题】小蓝要处理非常多的数据, 其中有一些数据是日期。 在小蓝处理的日期中有两种常用的形式&#xff1a;英文形式和数字形式。英文形式采用…

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

程序项目打包发布方法,采用InstallShield软件

重点&#xff1a; 1.程序项目做出来了&#xff0c;需要打包发布给用户。如何打包是关键。 2.采用InstallShield软件进行发布。 步骤一&#xff1a;创建一个依赖三方库配置环境的bat文件的项目。 &#xff08;主要测试三方库打包 和如果有bat文件&#xff0c;需要先创建环境&…

读书笔记-三国演义-曹操

魏武帝曹操&#xff08;155年&#xff0d;220年&#xff09;&#xff0c;是中国东汉末年至三国时期的重要政治家、军事家和文学家&#xff0c;同时也是三国时期魏国的建立者。他以其雄才大略、果断机敏的领导才能以及卓越的军事才华而闻名于世。 生平 曹操出生于豫州谯县&…

C++STL排序原理简介

../chromedriver 一份简化的代码(可读性较强)一份简化的代码(可读性较强) 一份简化的代码(可读性较强) c 的sort用了很多年&#xff0c;一直不知道具体是怎么写的 决定看看代码&#xff0c;以下文章结构可能有点混乱&#xff0c;建议读者同时打开vs同步跳转 https://www.geeksf…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…

Thread.start() run()

Thread.start() & run() public static void main(String[] args) { new Thread(new Runnable() {Overridepublic void run() {System.out.println("2432");}}).start(); }public class Thread implements Runnable {//通过构造方法调用init方法&#xff0c;在…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的商业辅助决策系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现&#xff0c;采…

Leetcode210. 课程表 II

Every day a Leetcode 题目来源&#xff1a;210. 课程表 II 解法1&#xff1a; 什么是拓扑排序&#xff1f; 我们考虑拓扑排序中最前面的节点&#xff0c;该节点一定不会有任何入边&#xff0c;也就是它没有任何的先修课程要求。当我们将一个节点加入答案中后&#xff0c;我…

html5新增标签+css3新增标签

新增标签 一.html5新增标签1.语义化标签2.多媒体标签&#xff08;1&#xff09;视频video&#xff08;2&#xff09;音频audio&#xff08;3&#xff09;.总结 3.input属性4.表单属性 二.css3新增选择器1.新增选择器&#xff08;1&#xff09;属性选择器&#xff08;2&#xff…