网络编程、通信

news2024/12/22 20:30:31

目录

网络通信三要素

三要素概述、要素一:IP地址

IP地址操作类-InetAddress

要素二:端口号

要素三:协议

UDP通信

UDP通信:快速入门

UDP通信:多发多收

UDP通信-广播、组播

TCP通信-快速入门

编写客户端代码

编写服务端代码、原理分析

TCP通信-多发多收消息

TCP通信-同时接受多个客户端消息【重点】

TCP通信-使用线程池优化

TCP通信实战案例-即时通信

TCP通信实战案例-模拟BS系统


什么是网络编程?
网络编程可以让程序与网络上的其他设备中的程序进行数据交互。
网络通信基本模式
常见的通信模式有如下2种形式:Client-Server(CS) 、 Browser/Server(BS)

 

 

网络通信三要素

三要素概述、要素一:IP地址

实现网络编程关键的三要素
IP地址:设备在网络中的地址,是唯一的标识。
端口:应用程序在设备中唯一的标识。
协议:   数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。
IP地址
IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
常见的IP分类为:IPv4和IPv6

IPv4 

 IPv6:128位(16个字节),号称可以为地球每一粒沙子编号。
 IPv6分成8个整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开。

IP地址形式:
公网地址、和私有地址(局域网使用)。
192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,
专门为组织机构内部使用。 

IP常用命令:
ipconfig:查看本机IP地址
ping IP地址:检查网络是否连通

特殊IP地址:
本机IP: 127.0.0.1或者localhost:称为回送地址也可称本地回环地址,只会寻找当前所在本机。
说说网络通信至少需要几个要素
IP、端口、协议。
IP地址是做什么的,具体有几种
定位网络上的设备的,有IPv4 , IPv6.
如何查看本机IP地址,如何看是否与对方互通
ipcofig
ping 192.168.10.23
本机IP是谁?
127.0.0.1或者是localhost

IP地址操作类-InetAddress

InetAddress  API如下

名称

说明

public static InetAddress getLocalHost()

返回本主机的地址对象

public static InetAddress getByName​(String host)

得到指定主机的IP地址对象,参数是域名或者IP地址

public String getHostName​()

获取此IP地址的主机名

public String getHostAddress​()

返回IP地址字符串

public boolean isReachable(int timeout)

在指定毫秒内连通该IP地址对应的主机,连通返回true

import java.net.InetAddress;
/**
    目标:InetAddress类概述(了解)
         一个该类的对象就代表一个IP地址对象。

    InetAddress类成员方法:
         static InetAddress getLocalHost()
            * 获得本地主机IP地址对象。
         static InetAddress getByName(String host)
            * 根据IP地址字符串或主机名获得对应的IP地址对象。
         String getHostName()
            * 获得主机名。
         String getHostAddress()
            * 获得IP地址字符串。
 */
public class InetAddressDemo01 {
    public static void main(String[] args) throws Exception {
        // 1.获取本机地址对象。
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

        // 2.获取域名ip对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        // 3.获取公网IP对象。
        InetAddress ip3 = InetAddress.getByName("112.80.248.76");
        System.out.println(ip3.getHostName());
        System.out.println(ip3.getHostAddress());

        // 4.判断是否能通: ping  5s之前测试是否可通
        System.out.println(ip3.isReachable(5000));
    }
}

要素二:端口号

端口号:标识正在计算机设备上运行的进程(程序),被规定为一个 16 位的二进制,范围是 0~65535。

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

注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。
总结
1、端口号的作用是什么?
    唯一标识正在计算机设备上运行的进程(程序)
2、一个设备中,能否出现2个应用程序的端口号一样,为什么?
    不可以,如果一样会出现端口冲突错误。

要素三:协议

网络通信协议有两套参考模型
OSI参考模型:世界互联协议标准,全球通信规范,由于此模型过于理想化,未能在因特网上进行广泛推广。 
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

OSI参考模型

TCP/IP参考模型

各层对应

面向操作

应用层

应用层

HTTPFTPDNSSMTP…

应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发

表示层

会话层

传输层

传输层

TCPUDP

选择使用的TCP , UDP协议

网络层

网络层

IPICMP…

封装源和目标IP,进行路径选择

数据链路层

数据链路层+物理

物理寻址、比特流

物理设备中传输

物理层

传输层的2个常见协议

传输层的2个常见协议
    TCP(Transmission Control Protocol) :传输控制协议
    UDP(User Datagram Protocol):用户数据报协议
TCP协议特点
    使用TCP协议,必须双方先建立连接,它是一种面向连接的可靠通信协议。
    传输前,采用“三次握手”方式建立连接,所以是可靠的 。
    在连接中可进行大数据量的传输 。
    连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。 
TCP协议通信场景
    对信息安全要求较高的场景,例如:文件下载、金融等数据通信。

TCP三次握手确立连接

 

UDP协议: 
    UDP是一种无连接、不可靠传输的协议。
    将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 
    每个数据包的大小限制在64KB内 
    发送不管对方是否准备好,接收方收到也不确认,故是不可靠的 
    可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快。
UDP协议通信场景
    语音通话,视频会话等。

UDP通信

UDP通信:快速入门

UDP是一种无连接、不可靠传输的协议。
将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。

DatagramPacket:数据包对象(韭菜盘子)

构造器

说明

public DatagramPacket(byte[] buf, int length, InetAddress address, int port)

创建发送端数据包对象

buf:要发送的内容,字节数组

length:要发送内容的字节长度

address:接收端的IP地址对象

port:接收端的端口号

public DatagramPacket(byte[] buf, int length)

创建接收端的数据包对象

buf:用来存储接收的内容

length:能够接收内容的长度

DatagramPacket常用方法

方法

说明

public int getLength()

获得实际接收到的字节个数

DatagramSocket发送端和接收端对象(人)

构造器

说明

public DatagramSocket()

创建发送端的Socket对象,系统会随机分配一个端口号。

public DatagramSocket(int port)

创建接收端的Socket对象并指定端口号

 DatagramSocket类成员方法

方法

说明

public void send(DatagramPacket dp)

发送数据包

public void receive(DatagramPacket p)

接收数据包

 

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
  发送端  一发 一收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(6666);

        // 2、创建一个数据包对象封装数据(韭菜盘子)
        /**
         public DatagramPacket(byte buf[], int length,
         InetAddress address, int port)
         参数一:封装要发送的数据(韭菜)
         参数二:发送数据的大小
         参数三:服务端的主机IP地址
         参数四:服务端的端口
         */
        byte[] buffer = "我是一颗快乐的韭菜,你愿意吃吗?".getBytes();
        DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                InetAddress.getLocalHost() , 8888);

        // 3、发送数据出去
        socket.send(packet);

        socket.close();
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
  接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        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);

        // 获取发送端的ip和端口
        String ip  =packet.getSocketAddress().toString();
        System.out.println("对方地址:" + ip);

        int port  = packet.getPort();
        System.out.println("对方端口:" + port);

        socket.close();
    }
}
总结
1、UDP发送端和接收端的对象是哪个?
    public DatagramSocket()​:创建发送端的Socket对象
    public DatagramSocket(int port):创建接收端的Socket对象
2、数据包对象是哪个?
    DatagramPacket
3、如何发送、接收数据包
    使用DatagramSocket的如下方法:
    public void send(DatagramPacket dp):发送数据包
    public void receive(DatagramPacket dp) :接收数据包

UDP通信:多发多收

需求
    使用UDP通信方式开发接收端和发送端。
分析
    发送端可以一直发送消息。
    接收端可以不断的接收多个发送端的消息展示。
    发送端输入了exit则结束发送端程序。

UDP通信-广播、组播

UDP的三种通信方式
单播:单台主机与单台主机之间的通信。
广播:当前主机与所在网络中的所有主机通信。
组播:当前主机与选定的一组主机的通信。

UDP如何实现广播
    使用广播地址:255.255.255.255
具体操作:
    发送端发送的数据包的目的地写的是广播地址、且指定端口。 (255.255.255.255  ,   9999)
    本机所在网段的其他主机的程序只要注册对应端口就可以收到消息了。(9999)
UDP如何实现组播
    使用组播地址:224.0.0.0 ~ 239.255.255.255
具体操作:
    发送端的数据包的目的地是组播IP  (例如:224.0.1.1,  端口:9999)
    接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息。
    DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。

TCP通信-快速入门

编写客户端代码

Socket

构造器

说明

public Socket(String host , int port)

创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。

Socket类成员方法

方法

说明

OutputStream getOutputStream()

获得字节输出流对象

InputStream getInputStream()

获得字节输入流对象

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

编写服务端代码、原理分析

ServerSocket(服务端)

构造器

说明

public ServerSocket(int port)

注册服务端端口

 ServerSocket类成员方法

方法

说明

public Socket accept()

等待接收客户端的Socket通信连接

连接成功返回Socket对象与客户端建立端到端通信

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

TCP通信-多发多收消息

案例:使用TCP通信实现:多发多收消息
需求:使用TCP通信方式实现:多发多收消息。
具体要求:
可以使用死循环控制服务端收完消息继续等待接收下一个消息。
客户端也可以使用死循环等待用户不断输入消息。
客户端一旦输入了exit,则关闭客户端程序,并释放资源。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;

/**
  发送端  多发 多收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(7777);
        

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            if("exit".equals(msg)){
                System.out.println("离线成功!");
                socket.close();
                break;
            }

            // 2、创建一个数据包对象封装数据(韭菜盘子)
            byte[] buffer = msg.getBytes();
            DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                    InetAddress.getLocalHost() , 8888);

            // 3、发送数据出去
            socket.send(packet);
        }

    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
  接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        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("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
        }
    }
}
本案例实现了多发多收,那么是否可以同时接收多个客户端的消息?
不可以的。
因为服务端现在只有一个线程,只能与一个客户端进行通信。

TCP通信-同时接受多个客户端消息【重点】

1、之前我们的通信是否可以同时与多个客户端通信,为什么?
    不可以的
    单线程每次只能处理一个客户端的Socket通信
2、如何才可以让服务端可以处理多个客户端的通信需求?
    引入多线程。

同时处理多个客户端消息

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
  发送端  多发 多收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket();
        

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            if("exit".equals(msg)){
                System.out.println("离线成功!");
                socket.close();
                break;
            }

            // 2、创建一个数据包对象封装数据(韭菜盘子)
            byte[] buffer = msg.getBytes();
            // 注意:只要目的地IP是 255.255.255.255 这个消息将以广播的形式对外发送
//            DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
//                    InetAddress.getByName("255.255.255.255") , 8888);

            DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                    InetAddress.getByName("224.0.1.1") , 9898);

                    // 3、发送数据出去
            socket.send(packet);
        }

    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
  接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        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("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
        }
    }
}
本次是如何实现服务端接收多个客户端的消息的。
    主线程定义了循环负责接收客户端Socket管道连接
    每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

TCP通信-使用线程池优化

1、目前的通信架构存在什么问题?
    客户端与服务端的线程模型是: N-N的关系。
    客户端并发越多,系统瘫痪的越快。

引入线程池处理多个客户端消息

import java.net.*;

/**
  接收端
 */
public class ServerDemo3 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        MulticastSocket socket = new MulticastSocket(9898);

        // 注意:绑定组播地址(加群)
        socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1") , 9898),
                NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        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("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
        }
    }
}
本次使用线程池的优势在哪里?
    服务端可以复用线程处理多个客户端,可以避免系统瘫痪。
    适合客户端通信时长较短的场景。

TCP通信实战案例-即时通信

1、即时通信是什么含义,要实现怎么样的设计?
    即时通信,是指一个客户端的消息发出去,其他客户端可以接收到。
    之前我们的消息都是发给服务端的。
    即时通信需要进行端口转发的设计思想。

即时通信-端口转发

TCP通信实战案例-模拟BS系统

1、之前的客户端都是什么样的
    其实就是CS架构,客户端实需要我们自己开发实现的。
2、BS结构是什么样的,需要开发客户端吗?
    浏览器访问服务端,不需要开发客户端。

实现BS开发

注意:服务器必须给浏览器响应HTTP协议格式的数据,否则浏览器不识别。

HTTP响应数据的协议格式:就是给浏览器显示的网页信息

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

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

相关文章

图文详解红黑树,还有谁不会?

前言在MySQL中,无论是Innodb还是MyIsam,都使用了B树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B树作为索引结构。目录一、二叉查…

深度学习 Day26——使用Pytorch实现猴痘病识别

深度学习 Day26——使用Pytorch实现猴痘病识别 文章目录深度学习 Day26——使用Pytorch实现猴痘病识别一、前言二、我的环境三、前期工作1、设置GPU导入依赖项2、导入猴痘病数据集3、划分数据集四、构建CNN网络五、训练模型1、设置超参数2、编写训练函数3、编写测试函数4、正式…

2023年江苏省职业院校技能大赛中职网络安全赛项试卷-教师组任务书

2023年江苏省职业院校技能大赛中职网络安全赛项试卷-教师组任务书 一、竞赛时间 9:00-12:00,12:00-15:00,15:00-17:00共计8小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 基础设施设置与安全加固、网络安全事件响应、数…

REDIS16_LRU算法概述、查看默认内存、默认是如何删除数据、缓存淘汰策略

文章目录①. LRU算法概述②. 查看默认内存③. 如何删除数据④. 缓存淘汰策略①. LRU算法概述 ①. LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据给予淘汰 (leetcode-cn.com/problems/lru-cache) ②. LRU算法题来源 ③.…

8大主流编程语言的适用领域,你可能选错了语言

很多人学编程经常是脑子一热然后就去网上一搜资源就开始学习了,但学到了后面发现目前所学的东西并不是自己最喜欢的,好像自己更喜欢另一个技术,感觉自己学错了,于是乎又去学习别的东西。 结果竹篮打水一场空,前面所付…

RxJava操作符变换过程

要使用Rxjava首先要导入两个包,其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0我们在使用rxjava的操作符时都觉得很方便,但是rxjava是怎么实现操作符的转换呢&#xff0…

不会编程也能搭建聊天机器人?ChatGPT + Notion AI助你一臂之力!

体验链接:Aitrend ChatBot (无需环境,无需账号,打开即用,完全免费,回答能力同ChatGPT) 背景介绍 本文主要谈关于如何使用ChatGPT(实际使用主力工具为Notion AI),应用官方API接口&…

Seay代码审计工具

一、简介Seay是基于C#语言开发的一款针对PHP代码安全性审计的系统,主要运行于Windows系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞,基本上覆盖常见PHP漏洞…

0109二分图-无向图-数据结构和算法(Java)

文章目录1 概念2 API3 分析和实现4 测试5 总结后记1 概念 二分图是一种能将所有结点分为两部分的图,其中图的每条边所连接的两个顶点都分别属于不同的部分。 2 API public classBipartiteBipartite(Graph G)预处理函数public booleanisBipartitle()是否是二分图pub…

【opensea】opensea-js 升级 Seaport v1.4 导致的问题及解决笔记

一、opensea 协议升级导致旧包不能使用了 我使用的是 “opensea-js”: "^4.0.12” 版本当SDK。于2023年3月9日之后,不能使用了,需要升级到 Seaport v1.4 协议的包。 报错如下: Error: API Error 400: Please provide an OPEN order type when us…

可逆神经网络的研究及其在图像中应用

一、摘要 可逆神经网络(INN)自被提出以来,就受到了广泛关注。由于其双射构造和高效可逆性,INN被用于各种推理任务,如图像隐藏、图像重缩放、图像着色、图像压缩和视频超分辨率等等。本文针对最新关于INN在图像方面应用的文献进行介绍&#x…

day30_JS

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、BOM 三、定时器 四、正则表达式 零、 复习昨日 事件 事件绑定方式鼠标事件 onmouseoveronmouseoutonmousemove 键盘事件 onkeydownonkeyupon…

一文带你深入理解【Java基础】· Java反射机制(下)

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

总结一下 dynamodb通常和java等后端sdk结合使用使用的形式可以是api或partiql语法调用dynamodb的用法不难,更重要的是维护成本,所需的服务集成,技术选型等和大数据结合场景下有独特优势 之后可能再看看java sdk中DynamoDBMapper的写法&…

登入vCenter显示503,证书过期解决办法

登入vCenter显示503 原因:当安全令牌服务 (STS) 证书已过期时,会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌,从而导致无法按预期运行(证书两年后就会过期)。 解决办法&…

Yocto系列讲解[技巧篇]90 - toolchain交叉编译器SDK中安装的软件

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 问题背景toolchain生成回顾toolchain sdk安装方法1:安装libmyapi到SDK方法2:安装libmyapi到SDK演示过程返回总目录:Yocto开发讲解系…

Linux 学习笔记——二、主机规划与磁盘分区

一、Linux 与硬件的搭配 Linux 中所有设备均被视为文件,其命名规则如下: 设备文件名SCSI/SATA/USB 硬盘机/dev/sd[a-p]USB 闪存盘/dev/sd[a-p](与 SATA 相同)Virtl/O 界面/dev/vd[a-p](用于虚拟机内)软盘…

RabbitMQ高级特性

RabbitMQ高级特性 消息可靠性投递 Consumer ACK 消费端限流 TTL 死信队列 延迟队列 日志与监控 消息可靠性分析与追踪 管理 消息可靠性投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制…

docker基本命令-容器

容器 基本概念 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 容…

.NET Framework .NET Core与 .NET 的区别

我们在创建C#程序时,经常会看到目标框架以下的选项,那么究竟有什么区别? 首先 .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体…