【Java从入门到大牛】网络编程

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Java从入门到大牛
🌠 首发时间:2023年11月23日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾

目录

  • 网络编程
    • 基本的通信架构
  • 网络通信三要素
    • IP地址
    • 端口号
    • 协议
  • UDP通信-快速入门
  • UDP通信-多发多收
  • TCP通信-快速入门
  • TCP通信-多发多收
  • TCP通信-支持与多个客户端同时通信
  • TCP通信-综合案例
    • 即时通信-群聊
    • 实现一个简易版的BS架构
    • 改进

网络编程

什么是网络编程?

可以让设备中的程序与网络上的其他设备中的程序进行数据交互,也就是实现网络通信

Java的 java.net.* 包下提供了网络编程的解决方案

基本的通信架构

基本的通信架构有两种形式:CS架构(Client客户端/Server服务端)、BS架构(Brower浏览器/Server服务端)

在这里插入图片描述
在这里插入图片描述

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

网络通信三要素

在这里插入图片描述

IP地址

  • IP(Internet Protocol):全称 “互联网协议地址”, 是分配给上网设备的唯一标志
  • IP地址有两种形式:IPv4、IPv6

IPv4
在这里插入图片描述

IPv6

  • IPv6:共128位,号称可以为地球每一粒沙子编号
  • IPv6分成8段表示,每段每四位编码成一个十六进制位表示,数之间用冒号分开

在这里插入图片描述

IP域名

由于IP地址比较难记住,所以有了IP域名,例如 www.baidu.com 等等

公网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地址:检查网络是否连通

InetAddress

  • 代表IP地址

InetAddress的常用方法如下
在这里插入图片描述

应用

import java.net.InetAddress;/*** 目标:掌握InetAddress类的使用*/
public class InetAddressTest {public static void main(String[] args) throws Exception {// 1、获取本机IP地址对象的InetAddress ip1 = InetAddress.getLocalHost();System.out.println(ip1.getHostName());System.out.println(ip1.getHostAddress());// 2、获取指定IP或者域名的IP地址对象。InetAddress ip2 = InetAddress.getByName("www.baidu.com");System.out.println(ip2.getHostName());System.out.println(ip2.getHostAddress());// ping www.baidu.comSystem.out.println(ip2.isReachable(6000));}
}

端口号

端口

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

分类

  • 周知端口:0~1023,被预先定义的知名应用占用,如HTTP占用80,FTP占用21
  • 注册端口:1024~49151,分配给用户进程或某些应用程序
  • 动态端口:49152~65535,之所以被称为动态端口,是因为它一般不固定分配某种进程,而是动态分配

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

协议

通信协议

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

开放式网络互联标准:OSI网络参考模型

  • OSI网络参考模型:全球网络互联标准
  • TCP/IP网络模型:事实上的国际标准

在这里插入图片描述

传输层的两个通信协议

  • UDP (User Datagram Protocol):用户数据报协议; TCP (Transmission Control Protocol) :传输控制协议

UDP协议

  • 特点:无连接、不可靠通信,通信效率高,通常用于语音通话、视频直播等
  • 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等
  • 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的

TCP协议

  • 特点:面向连接、可靠通信,通信效率相对不高,通常用于网页、文件下载、支付等
  • TCP的最终目的:要保证在不可靠的信道上实现可靠的传输
  • TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接

TCP协议:三次握手建立可靠连接

  • 可靠连接:确定通信双方,收发消息都是正常无问题的!(全双工)

在这里插入图片描述

TCP协议:四次挥手断开连接

  • 目的:确保双方数据的收发都已经完成
    在这里插入图片描述

UDP通信-快速入门

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

DatagramSocket: 用于创建客户端、服务端

在这里插入图片描述

DatagramPacket:创建数据包
在这里插入图片描述

实战:使用UDP通信实现发送消息、接收消息

Client.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** 目标:完成UDP通信快速入门:实现1发1收。*/
public class Client {public static void main(String[] args) throws Exception {// 1、创建客户端对象DatagramSocket socket = new DatagramSocket();// 2、创建数据包对象封装要发出去的数据byte[] bytes = "我是快乐的客户端,我爱你abc".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),  6666);// 3、开始正式发送这个数据包的数据出去了socket.send(packet);System.out.println("客户端数据发送完毕~~~");socket.close(); // 释放资源!}
}

Server.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** 目标:完成UDP通信快速入门-服务端开发*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("----服务端启动----");// 1、创建一个服务端对象,注册端口DatagramSocket socket = new DatagramSocket(6666);// 2、创建一个数据包对象,用于接收数据的byte[] buffer = new byte[1024 * 64]; // 64KB.DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 3、开始正式使用数据包来接收客户端发来的数据socket.receive(packet);// 4、从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据int len = packet.getLength();String rs = new String(buffer, 0 , len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());socket.close(); // 释放资源}
}

先启动服务端,再启动客户端

在这里插入图片描述

UDP通信-多发多收

客户端可以反复发送数据

  • 创建DatagramSocket对象(发送端对象)
  • 使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
  • 如果用户输入的不是exit, 把数据封装成DatagramPacket
  • 使用DatagramSocket对象的send方法将数据包对象进行发送
  • 释放资源

接收端可以反复接收数据

  • 创建DatagramSocket对象并指定端口(接收端对象)
  • 创建DatagramPacket对象接收数据(数据包对象)
  • 使用DatagramSocket对象的receive方法传入DatagramPacket对象
  • 使用while死循环不断的进行第3步

Client.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;/*** 目标:完成UDP通信快速入门:实现客户端反复的发*/
public class Client {public static void main(String[] args) throws Exception {// 1、创建客户端对象DatagramSocket socket = new DatagramSocket();// 2、创建数据包对象封装要发出去的数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();// 一旦发现用户输入的exit命令,就退出客户端if("exit".equals(msg)){System.out.println("欢迎下次光临!退出成功!");socket.close(); // 释放资源break; // 跳出死循环}byte[] bytes = msg.getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),  6666);// 3、开始正式发送这个数据包的数据出去了socket.send(packet);}}
}

Server.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** 目标:完成UDP通信快速入门-服务端反复的收*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("----服务端启动----");// 1、创建一个服务端对象DatagramSocket socket = new DatagramSocket(6666);// 2、创建一个数据包对象,用于接收数据的byte[] buffer = new byte[1024 * 64]; // 64KB.DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3、开始正式使用数据包来接收客户端发来的数据socket.receive(packet);// 4、从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据int len = packet.getLength();String rs = new String(buffer, 0 , len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());System.out.println("--------------------------------------");}}
}

在这里插入图片描述

在这里插入图片描述

在这个基础上,我们还可以实现多个客户端同时向服务端发送消息

首先,我们需要在IDEA里面修改一下客户端这个程序的配置,让它可以同时运行多个客户端,具体步骤如下

1、在IDEA右上角找到这个,点击进入

在这里插入图片描述

2、如图操作,注意是客户端

在这里插入图片描述

3、多次执行 Client.java 这个程序,我们就可以得到多个客户端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TCP通信-快速入门

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

在这里插入图片描述

TCP通信之客户端开发

  • 客户端程序就是通过java.net包下的Socket类来实现的
    在这里插入图片描述

客户端发送消息

  • 创建客户端的Socket对象,请求与服务端的连接
  • 使用socket对象调用getOutputStream()方法得到字节输出流
  • 使用字节输出流完成数据的发送
  • 释放资源:关闭socket管道

Client.java

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;/***  目标:完成TCP通信快速入门-客户端开发:实现1发1收*/
public class Client {public static void main(String[] args) throws Exception {// 1、创建Socket对象,并同时请求与服务端程序的连接Socket socket = new Socket("127.0.0.1", 8888);// 2、从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();// 3、把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);// 4、开始写数据出去了dos.writeUTF("在一起,好吗?");dos.close();socket.close(); // 释放连接资源}
}

TCP通信之服务端程序的开发

  • 服务端是通过java.net包下的ServerSocket类来实现的

在这里插入图片描述

服务端接收消息

  • 创建ServerSocket对象,注册服务端端口
  • 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象
  • 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收
  • 释放资源:关闭socket管道

Server.java

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/***  目标:完成TCP通信快速入门-服务端开发:实现1发1收*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket = new ServerSocket(8888);// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();// 3、从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();// 4、把原始的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);// 5、使用数据输入流读取客户端发送过来的消息String rs = dis.readUTF();System.out.println(rs);// 其实我们也可以获取客户端的IP地址System.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();}
}

在这里插入图片描述

TCP通信-多发多收

使用TCP通信实现:多发多收消息

  • 客户端使用死循环,让用户不断输入消息
  • 服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息

Client.java

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;/***  目标:完成TCP通信快速入门-客户端开发:实现客户端可以反复的发消息出去*/
public class Client {public static void main(String[] args) throws Exception {// 1、创建Socket对象,并同时请求与服务端程序的连接。Socket socket = new Socket("127.0.0.1", 8888);// 2、从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();// 3、把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();// 一旦用户输入了exit,就退出客户端程序if("exit".equals(msg)){System.out.println("欢迎您下次光临!退出成功!");dos.close();socket.close();break;}// 4、开始写数据出去了dos.writeUTF(msg);dos.flush();}}
}

Server.java

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/***  目标:完成TCP通信快速入门-服务端开发:实现服务端反复发消息*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket = new ServerSocket(8888);// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();// 3、从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();// 4、把原始的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);while (true) {try {// 5、使用数据输入流读取客户端发送过来的消息String rs = dis.readUTF();System.out.println(rs);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() + "离线了!");dis.close();socket.close();break;}}}
}

在这里插入图片描述

在这里插入图片描述

TCP通信-支持与多个客户端同时通信

如果我们像刚才UDP通信那样,同时启动多个客户端,你会发现服务端只能接收到一个客户端发送的消息,那么我们该如何实现服务端与多个客户端同时通信呢

目前我们开发的服务端程序,是不可以与多个客户端同时通信的,因为服务端只有一个主线程,只能处理一个客户端的消息

Client.java 不变

添加一个 ServerReaderThread 线程类,每个线程处理一个客户端

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){try {String msg = dis.readUTF();System.out.println(msg);} catch (Exception e) {System.out.println("有人下线了:" + socket.getRemoteSocketAddress());dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}
}

Server.java

import java.net.ServerSocket;
import java.net.Socket;/***  目标:完成TCP通信快速入门-服务端开发:要求实现与多个客户端同时通信*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket = new ServerSocket(8888);while (true) {// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了:" + socket.getRemoteSocketAddress());// 3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理new ServerReaderThread(socket).start();}}
}

在这里插入图片描述

TCP通信-综合案例

即时通信-群聊

什么是群聊?怎么实现?

  • 是指一个客户端把消息发出去,其他在线的全部客户端都可以收到消息
  • 需要用到端口转发的设计思想
  • 服务端需要把在线的Socket管道存起来,一旦收到一个消息要推送给其他管道

TCP通信-端口转发

在这里插入图片描述

代码实现

改进 Client.java

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;/***  目标:完成TCP通信快速入门-客户端开发:实现客户端可以反复的发消息出去*/
public class Client {public static void main(String[] args) throws Exception {// 1、创建Socket对象,并同时请求与服务端程序的连接。Socket socket = new Socket("127.0.0.1", 8888);// 改进:创建一个独立的线程,负责随机从socket中接收服务端发送过来的消息new ClentReaderThread(socket).start();// 2、从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();// 3、把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();// 一旦用户输入了exit,就退出客户端程序if("exit".equals(msg)){System.out.println("欢迎您下次光临!退出成功!");dos.close();socket.close();break;}// 4、开始写数据出去了dos.writeUTF(msg);dos.flush();}}
}

添加 ClientReaderThread.java

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;// 该线程不停接收服务端转发过来的消息并打印,相当于收到群聊里别人的信息
// 思路和服务端接收消息差不多
public class ClentReaderThread extends Thread{private Socket socket;public ClentReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){try {String msg = dis.readUTF();System.out.println(msg);} catch (Exception e) {System.out.println("自己下线了:" + socket.getRemoteSocketAddress());dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}
}

改进 Server.java

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;/***  目标:完成TCP通信快速入门-服务端开发:要求实现与多个客户端同时通信*/
public class Server {// 改进:添加一个集合保存在线的所有客户端,便于转发消息public static List<Socket> onLineSockets = new ArrayList<>();public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket = new ServerSocket(8888);while (true) {// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();onLineSockets.add(socket);      // 有客户端上线就添加System.out.println("有人上线了:" + socket.getRemoteSocketAddress());// 3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理。new ServerReaderThread(socket).start();}}
}

改进 ServerReaderThread.java

import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){try {String msg = dis.readUTF();System.out.println(msg);// 把这个消息分发给全部客户端进行接收。sendMsgToAll(msg);} catch (Exception e) {System.out.println("有人下线了:" + socket.getRemoteSocketAddress());Server.onLineSockets.remove(socket);    // 客户端下线就删除dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}// 添加消息转发方法private void sendMsgToAll(String msg) throws IOException {// 发送给全部在线的socket管道接收。for (Socket onLineSocket : Server.onLineSockets) {OutputStream os = onLineSocket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}

实现一个简易版的BS架构

需求描述

要求从浏览器中访问服务器,并立即让服务器响应一个很简单的网页给浏览器展示

BS架构的基本原理

BS架构的客户端就是浏览器,客户从浏览器访问服务器的方法就是通过网址来访问,一般的格式是 http://服务器IP:服务器端口

在这里插入图片描述

注意:服务器必须给浏览器响应HTTP协议规定的数据格式,否则浏览器不会识别返回的数据,也就是说,服务端返回数据不能还是用以前那种打印语句直接打印

HTTP协议规定:响应给浏览器的数据格式必须满足如下格式

在这里插入图片描述

需求实现

Server.java,和前面的一样

import java.net.ServerSocket;
import java.net.Socket;/***  目标:完成TCP通信快速入门-服务端开发:要求实现与多个客户端同时通信。*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket = new ServerSocket(8080);while (true) {// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了:" + socket.getRemoteSocketAddress());// 3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理。new ServerReaderThread(socket).start();}}
}

改进 ServerReaderThread.java

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {//  立即响应一个网页内容给浏览器展示。try {OutputStream os = socket.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type:text/html;charset=UTF-8");ps.println(); // 必须换行ps.println("<div style='color:blue;font-size:120px;text-align:center'>66666666666<div>");// 访问完就要关闭ps.close();socket.close();} catch (Exception e) {e.printStackTrace();}}
}

效果

随便打开一个浏览器,输入网址 127.0.0.1:8080 回车即可,其中 127.0.0.1 代表本机IP,8080 是我们在服务端指定的端口

在这里插入图片描述

改进

在上面的程序中,客户端的每次请求都会开一个新的线程,这样做好不好呢?

其实是不好的,当访问人数特别多时,也就是高并发时,就会很容易宕机

很明显,我们都知道要使用线程池来进行优化

在这里插入图片描述

优化后的代码

Server.java

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/***  目标:完成TCP通信快速入门-服务端开发:要求实现与多个客户端同时通信。*/
public class Server {public static void main(String[] args) throws Exception {System.out.println("-----服务端启动成功-------");// 1、创建ServerSocket的对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8080);// 创建出一个线程池,负责处理通信管道的任务ThreadPoolExecutor pool = new ThreadPoolExecutor(16 * 2, 16 * 2, 0, TimeUnit.SECONDS,new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());while (true) {// 2、使用serverSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();// 3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理pool.execute(new ServerReaderRunnable(socket));}}
}

ServerReaderRunnable.java

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class ServerReaderRunnable implements Runnable{private Socket socket;public ServerReaderRunnable(Socket socket){this.socket = socket;}@Overridepublic void run() {//  立即响应一个网页内容给浏览器展示try {OutputStream os = socket.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type:text/html;charset=UTF-8");ps.println(); // 必须换行ps.println("<div style='color:red;font-size:120px;text-align:center'>88888<div>");ps.close();socket.close();} catch (Exception e) {e.printStackTrace();}}
}

在这里插入图片描述

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

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

相关文章

大数据 DataX-Web 详细安装教程

目录 一、DataX-Web 介绍 1.1 DataX-Web 是什么 1.2 DataX-Web 架构 二、DataX-Web 安装部署 2.1 环境要求 2.2 安装 2.3 部署 2.4 数据库初始化 2.5 配置 2.6 启动服务 2.6.1 一键启动所有服务 2.6.2 一键取消所有服务 2.7 查看服务&#xff08;注意&#xff01…

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 32x32x3 3072 维列向量

监控大屏 | 拐角OLED柔性屏:实现拐角处连惯拼接显示

监控大屏 | 拐角OLED柔性屏 产品&#xff1a;20块55寸OLED柔性屏 项目时间&#xff1a;2023年10月 项目地点&#xff1a;贵州 应用场景&#xff1a;在监控大厅三面墙都要装显示屏&#xff0c;利用OLED柔性屏可弯曲的特性&#xff0c;在两个捌角处进行拼接安装。 在2023年10…

如何一分钟内画好可视化图形?

一、定类数据 饼图 描述&#xff1a;用形状类似“饼”的形态描述数据的占比&#xff0c;并且参与绘制的数值没有负值&#xff0c;比如想要直观的查看“月生活费各个板块的占比”。 操作&#xff1a;以SPSSAU为例&#xff0c;使用“频数分析”即可。 示例&#xff1a; 圆环图…

钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播

环境: 防火墙 AF8.0.17 Win10 专业版 问题描述: 钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播 钉钉直播不了 不能直播电脑电脑可以ping通直播域名 防火墙查了3个域名都没有拦截,AF测试应用直通都放行的 解…

vue3(二)-基础入门之列表循环、数组变动检测、filter模糊查询、事件修饰符

一、列表循环 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

PyQt6 QPlainTextEdit纯文本控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

2023年c语言程序设计大赛

7-1 这是一道送分题 为了让更多的同学参与程序设计中来&#xff0c;这里给同学们一个送分题&#xff0c;让各位感受一下程序设计的魅力&#xff0c;并祝贺各位同学在本次比赛中取得好成绩。 注&#xff1a;各位同学只需将输入样例里的代码复制到右侧编译器&#xff0c;然后直…

智能优化算法应用:基于蝴蝶算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝴蝶算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝴蝶算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝴蝶算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Stable Diffusion绘画系列【2】:二次元风美女

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

2004-2022年上市公司托宾Q值数据

2004-2022年上市公司托宾Q值数据 1、时间&#xff1a;2004-2022年 2、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、托宾Q值 3、范围&#xff1a;上市公司 4、来源&#…

Python小知识

个人学习笔记&#xff0c;用于记录使用过程中好用的技巧、好用的库。 1 小知识 1.1 相对路径 1.2 打包Exe文件 命令&#xff1a; pyinstaller -F main.py其中-F&#xff1a;覆盖之前打包的文件 mian.py&#xff1a;需要打包的Python文件 PS&#xff1a;使用pyinstaller 5.1…

如何优化索引?

前缀索引 这个操作是为了减少索引长度&#xff0c;即占用空间的。这样一个页可以多存一些索引&#xff0c;查找时候就会更快了。但是前缀索引有俩缺点&#xff0c;一个是ORDER BY或GROUP BY时候没法用&#xff0c;另一个是没法用做覆盖索引&#xff08;因为索引本来自己都不全…

计算机网络408

一&#xff1a;计算机网络体系结构 1.计网的概念&#xff0c;组成&#xff0c;功能和分类 一&#xff1a;计算机网络的发展 (3)从功能组成视觉看&#xff1a;分为资源子网和通信子网 2.计网性能指标

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

RabbitMQ工作模式2 整合springboot 和MQ高级特性

RabbitMQ工作模式 1.路由模式 创建交换机 , 连接队列 (生产者) public class MyTestExDirect {Testpublic void bbb() throws IOException, TimeoutException {ConnectionFactory connectionFactory new ConnectionFactory();//连接mqconnectionFactory.setUsername("…

可信区块链运行监测服务平台(TBM)发展研讨会在北京召开

2023年11月23日&#xff0c;由中国信息通信研究院、中国移动通信集团设计院有限公司、区块链服务网络&#xff08;BSN&#xff09;发展联盟共同主办的“可信区块链运行监测服务平台&#xff08;TBM&#xff09;发展研讨会”在北京成功举行。会议围绕区块链的监测与治理&#xf…

vatee万腾的科技征途:Vatee数字化力量的新视野

在科技的浪潮中&#xff0c;Vatee万腾正展开一场引人注目的科技征途&#xff0c;以其独特的数字化力量描绘出一片新的视野。这不仅是一次技术的升级&#xff0c;更是一场对未来的全新探索&#xff0c;为我们带来了前所未有的数字化时代。 Vatee万腾以其卓越的技术实力和前瞻性的…

springboot实现数据脱敏

springboot实现数据脱敏 怎么说呢&#xff0c;写着写着发觉 ”这写的什么玩意“ 。 总的来说就是&#xff0c;这篇文章并不能解决数据脱敏问题&#xff0c;但以下链接可以。 SpringBoot中利用自定义注解优雅地实现隐私数据脱敏 然后回到本文&#xff0c;本来是想基于AOP代理&am…

PHP众筹系统源码+支持报名众筹+商品众筹+无偿众筹+市面上所有的众筹模式 附带完整的搭建教程

大家好啊&#xff0c;罗峰今天来给大家分好用的源码系统了。今天要给大家分享的是一款PHP众筹系统源码。众筹作为一种新型的融资方式&#xff0c;逐渐在市场上占据了重要的地位。从公益众筹到商品众筹&#xff0c;再到股权众筹&#xff0c;各种众筹模式层出不穷。然而&#xff…