JavaSocket编程

news2024/11/24 23:06:07

一、JavaSocket编程

1.1HTTP协议

  1. 后端原理
    在这里插入图片描述2. 特点
    在这里插入图片描述
    同步:就是两个任务执行的过程中,其中一个任务要等另一个任务完成某各阶段性工作才能继续执行,如厨师A炒番茄,将葱花放入锅中,然后需要放入番茄,但是厨师B还没有把番茄切好,厨师A就得等厨师A把番茄切好才能继续,期间处于等待状态。
    在这里插入图片描述

1.2HTTP请求/响应格式

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

1.3.1请求头

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

1.3.2响应头

注意:GET请求的请求体是空的 ,POST请求可以不为空
在这里插入图片描述

1.3.3响应体

在这里插入图片描述

1.3网络编程

1.3.1计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

1.3.2网络通信协议

通过计算机网络可以实现不同计算机之间的连接和通信,但是计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
国际标准化组织(ISO,即International Organization for Standardization)定义了网络通信协议的基本框架,被称为OSI(Open System Interconnect,即开放系统互联)模型。要制定通讯规则,内容很多,比如需要考虑A电脑如何找到B电脑,A电脑在发送信息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据格式又是怎样的?内容太多太杂,所以OSI模型将这些通讯标准进行层次划分,每一层次解决一个类别的问题,使得标准的制定没那么复杂。OSI模型制定的七层标准模型,分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。

网络协议的分层(互联网使用最多的网络通信协议是TCP/IP网络通信协议)
按照层次划分,共四层:应用层、传输层、网络层、网络接口层(物理+数据链路层)
OSI和TCP/IP模型的对应关系:
在这里插入图片描述

1.3.3IP地址

IP是Internet Protocol Address(互联网协议地址)
用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。比如互联网的每个服务器都要有自己的IP地址,每个局域网事物计算机通信也要配置IP地址。
路由器是连接两个或多个网络的网络设备。
类别 最大网络数 IP地址范围 单个网络最大主机数 私有IP地址范围
在这里插入图片描述

IP地址分类
A 126(2^7-2) 1.0.0.1-127.255.255.254 16777214 10.0.0.0-10.255.255.255
B 1638(2^14) 128.0.0.1-191.255.255.254 65534 172.16.0.0-172.31.255.255
C 2097152(2^21) 192.0.0.1-223.255.255.254 254 192.168.0.0-192.168.255.255
目前主流使用的IP地址是IPV4,但是随着网络规模的不断扩大,IPV4面临着枯竭的危险,推出了IPV6。

IPV4采用了32位地址长度,只有大约43亿个地址,它只有4段数字,每一段最大不超过255,。随着互联网的发展,IP地址不够用了,在2019年11月25日IPv4位地址分配完毕。IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示,目的是方便阅读

IPV6采用了128位地址长度,几乎可以部首限制地提供住址。按保守方法估算IPv6实际可分配地址,整个地球的每平方米面积上仍可分配1000多个地址。IPv6地址实际上是一个128位整数。它是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334
在这里插入图片描述

1.3.4端口号Port

  1. 概念:端口号用来识别计算机中进行通信的应用程序,也被称为程序地址。一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地进行数据传输。
  2. IP地址好比每个人的地址(门牌号),端口号好比是房间号。必须同时指定IP地址和端口号才能正确的发送数据。

1.3.5URL

URL(Uniform Resource Locator),是互联网的统一资源定位符。用于识别互联网中的信息资源。通过URL我们可以访问文件、数据库、图像、新闻等。
在互联网上,每一条信息资源都有统一且唯一的地址,该地址就叫URL。URL由4部分组成:协议、存放资源的主机域名、资源文件名和端口号。如果未指定该端口号,则使用该协议默认的端口。如http协议的默认端口为80.在浏览器中访问网页时,地址显示的地址就是URL。
在java.net包中提供了URL类,该类封装了大量复杂的涉及从远程站点获取信息的细节。
在这里插入图片描述

1.3.6Socket

应用层和传输层之间使用套接字Socket来进行分离。
套接字像传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;在这个小口以内,数据进入这个口之后,或者数据从这个口出来之前,是属于网络其他层次的工作。
在这里插入图片描述

Socket 实际就是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。

使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可以通过Internet在全球范围内通信。
在这里插入图片描述

1.3.7TCP(面向连接,可靠,传输效率低)

  1. TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟链接。然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。
  2. TCP在建立连接时分三步走(三次握手 Three-way-Handshake)


在这里插入图片描述
在这里插入图片描述
客户端:

package JavaWeb.TCP;

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

public class TCP_Client {
    public static void main(String[] args) throws IOException {
        InetAddress localHost = InetAddress.getLocalHost();
        int port=8091;
        //01创建Socket对象
        Socket socket = new Socket(localHost,port);
        //02获取输出流对象
        OutputStream outputStream=socket.getOutputStream();
        //03发送数据
        outputStream.write("hello TCP".getBytes());
        System.out.println("成功发送");
        //04释放资源
        outputStream.close();
        socket.close();

    }
}

服务器端:
在这里插入图片描述

package JavaWeb.TCP;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 1.创建接收端Socket对象;
 * 2.监听(阻塞:如果建立连接失败,程序会一直阻塞,不往下执行;
 * 3.获取输入流对象;
 * 4.获取数据;
 * 5.输出数据;
 * 6.释放资源;
 */
public class TCP_Service {
    public static void main(String[] args) throws IOException {
        //创建接收端Socket对象;
        ServerSocket serverSocket = new ServerSocket(8091);
        // 监听客户端发送数据给服务器 如果客户端一直没有发送数据给服务器 导致服务器端 会在该方法 一直阻塞
        System.out.println("服务器正在等待客户端数据...");
        Socket socket = serverSocket.accept();
        // 获取输入流对象;
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = inputStream.read(bytes);
        System.out.println("服务器端接受客户端发送的数据:" + new String(bytes, 0, len));
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

问题1:使用8090端口报错
在这里插入图片描述
查找谁占用了此端口

netstat -ano | findstr 8090

在这里插入图片描述
解决:换一个端口

//创建接收端Socket对象;
        ServerSocket serverSocket = new ServerSocket(8091);

问题2:
在这里插入图片描述
在这里插入图片描述
案例:
在这里插入图片描述

在这里插入图片描述

package JavaWeb.TCP案例;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.SQLOutput;
import java.util.Scanner;

public class TCP_Client {
    public static void main(String[] args) throws IOException {
        InetAddress localHost = InetAddress.getLocalHost();
        int port=8091;
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("请输入发送的数据:");
            String s = scanner.nextLine();
            //01创建Socket对象
            Socket socket = new Socket(localHost,port);
            //02获取getOutputStream对象
            OutputStream outputStream = socket.getOutputStream();
            //03发送数据
            outputStream.write(s.getBytes());
            
            /*接收服务器算的回应信息*/
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            System.out.println("接收的回应:"+new String(bytes,0,len));
            
            //04关闭资源
            outputStream.close();
            socket.close();

        }

    }
}

package JavaWeb.TCP案例;

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

public class TCP_Service {

    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        ServerSocket serverSocket = new ServerSocket(8091);
        System.out.println("服务器端启动成功");
        //实现服务器端可以一直接收数据
        while (true){
            //02监听客户端,如果一直没有发送数据会一直阻塞
            Socket socket = serverSocket.accept();
            //03接收客户端数据
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);

            System.out.println("接收到的数据"+new String(bytes,0,len));

            /*服务端接收到数据后回应客户端代码*/
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("已收到信息".getBytes());

            socket.close();
            inputStream.close();

        }
    }
}

在这里插入图片描述

客户端:
在这里插入图片描述
服务端:
在这里插入图片描述

1.3.8UDP(面向无连接,不可靠,传输效率高,但可能丢包)

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

  • 发送数据
    在这里插入图片描述
    (1)创建Socket对象:DatagramSocket()
    (2)封装数据:DatagramPacket(),参数如下:
  • ‌byte[] buf‌:保存传入数据报的缓冲区。
  • ‌int length‌:表示要接收或发送的数据长度,必须小于或等于buf.length。
  • 对于发送数据的情况,还需要知道发送目标的‌InetAddress addr‌(目标IP地址)
  • int port‌(目标端口号)。
    在这里插入图片描述
    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        DatagramSocket datagramSocket = new DatagramSocket();
        //02封装发送的数据到数据包中,设置成byte数组
        byte[] msg="Hello UDP".getBytes();
        /*
         - byte[] buf‌:保存传入数据报的缓冲区。
         - int length‌:表示要接收或发送的数据长度,必须小于或等于buf.length。
         - 对于发送数据的情况,还需要知道发送目标的‌InetAddress addr‌(目标IP地址)
         - int port‌(目标端口号)。*/
        InetAddress localHost = InetAddress.getLocalHost();
        int port=8080;//服务器端需要监测此端口
        DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length,localHost,port);
        //03发送数据
        datagramSocket.send(datagramPacket);
        System.out.println("发送成功");
        //04释放资源
        datagramSocket.close();

    }

在这里插入图片描述

public static void main(String[] args) throws IOException {
        //01创建Socket对象
        int port=8080;//监听端口
        DatagramSocket datagramSocket = new DatagramSocket(port);
        //02接收数据
        byte[] reserve=new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(reserve, reserve.length);
        //以数据包的形式进行接收,开始监听客户端发送的数据,如果没有监听到会一直阻塞
        System.out.println("开始监测释放客户端发送数据数据");
        datagramSocket.receive(datagramPacket);
        System.out.println("接收数据完成");
        //03解析数据
        byte[]data=datagramPacket.getData();
        String s = new String(data);
        //04输出数据
        System.out.println(s);
        //05释放资源
        datagramSocket.close();


    }

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
客户端

package JavaWeb.UDP案例;

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

//实现客户端与服务器可以一直发送与接收信息,当客户端发送666结束会话
public class UDP_Client {
    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        DatagramSocket datagramSocket = new DatagramSocket();//不用每次循环都创建,浪费资源

        while (true){
        //02打包数据
        int port=8080;//定义端口
        InetAddress localHost = InetAddress.getLocalHost();//获取IP

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入发送信息的");
        String msg=scanner.nextLine();
        if ("666".equals(msg)){
            System.out.println("退出客户端!");
            break;//退出循环
        }
        byte[] bytes=msg.getBytes();

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,localHost,port);
        //03发送数据
        datagramSocket.send(datagramPacket);
        System.out.println("发送完成");
        }
        //04退出之后才关闭
        datagramSocket.close();
    }
}

服务端

package JavaWeb.UDP案例;

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

public class UDP_Server {
    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        int port=8080;//监听的端口对象
        DatagramSocket datagramSocket = new DatagramSocket(port);
        int count=0;

        while (true){
        if (count>1000){
                break;
        }
        //02接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);

        System.out.println("开始监测释放客户端发送数据数据");
        datagramSocket.receive(datagramPacket);
        System.out.println("接收数据完成");

        //03解析
        byte[] data = datagramPacket.getData();
        String s = new String(data);//将byte数组转换未string
        System.out.println("接收到的数据:"+s);
        count++;
        }
        //04释放资源,由于前面的While是死循环导致后面的代码无法执行会报错
        /*优化上面代码,执行1000此自动退出*/
        datagramSocket.close();

    }
}

1.3.9Java中InetAddress获取本机信息(无法new对象)

在这里插入图片描述
这个类没有构造方法,如果要得到对象,只能通过静态方法:getLocalHost()、getByName()、getAllByName()、getAddress()、getHostName()
在这里插入图片描述
在这里插入图片描述

    //使用Java程序获取电脑IP
    public static void main(String[] args) throws UnknownHostException {
        //实例化InetAddress对象
        InetAddress localHost = InetAddress.getLocalHost();//需要抛出异常
        //返回当前计算机的IP地址
        String hostName = localHost.getHostName();
        //返回当前计算机名
        String hostAddress = localHost.getHostAddress();
        System.out.println("本机名:"+hostName);
        System.out.println("本机IP:"+hostAddress);
    }

2.通过域名获取IP
在这里插入图片描述

 public static void main(String[] args) throws UnknownHostException {
        /*
        * InetAddress根据域名获取计算机的信息,需要使用getByName(“域名”)方法创建InetAddress对象*/
        InetAddress byName = InetAddress.getByName("www.baidu.com");
        System.out.println(byName.getHostAddress());
        System.out.println(byName.getHostName());

    }

1.3.10优化TCP服务器端,实现多线程

  1. 分析当前问题:服务器同时只能接收一个客户端发送的数据
    在这里插入图片描述
  2. 将服务器端通过多线程实现可以同时接收多个客户端请求
    在这里插入图片描述
    服务器端
package JavaWeb.TCP案例优化;

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

public class TCP_Service {

    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        ServerSocket serverSocket = new ServerSocket(8091);
        System.out.println("服务器端启动成功");
        //实现服务器端可以一直接收数据
        while (true){
            //02监听客户端,如果一直没有发送数据会一直阻塞
            Socket socket = serverSocket.accept();
            //开启子线程,一般不允许单独创建子线程,都是通过线程池维护
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        //03接收客户端数据
                        InputStream inputStream = socket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len = inputStream.read(bytes);

                        System.out.println("接收到的数据"+new String(bytes,0,len));

                        /*服务端接收到数据后回应客户端代码*/
                        OutputStream outputStream = socket.getOutputStream();
                        outputStream.write("已收到信息".getBytes());

                        socket.close();
                        inputStream.close();

                    }catch (Exception e){
                        System.out.println(e);
                    }
                }
            }).start();

        }
    }
}

客户端

package JavaWeb.TCP案例优化;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class TCP_Client {
    public static void main(String[] args) throws IOException {
        InetAddress localHost = InetAddress.getLocalHost();
        int port=8091;
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("请输入发送的数据:");
            String s = scanner.nextLine();
            //01创建Socket对象
            Socket socket = new Socket(localHost,port);
            //02获取getOutputStream对象
            OutputStream outputStream = socket.getOutputStream();
            //03发送数据
            outputStream.write(s.getBytes());

            /*接收服务器算的回应信息*/
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            System.out.println("接收的回应:"+new String(bytes,0,len));

            //04关闭资源
            outputStream.close();
            socket.close();

        }

    }
}

1.3.11练习题:通过TCP实现登录验证

需求如下:
在这里插入图片描述

package JavaWeb.TCP登录验证案例;

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

public class TCP_Service {

    public static void main(String[] args) throws IOException {
        //01创建Socket对象
        ServerSocket serverSocket = new ServerSocket(8091);
        System.out.println("服务器端启动成功");
        //实现服务器端可以一直接收数据
        while (true){
            //02监听客户端,如果一直没有发送数据会一直阻塞
            Socket socket = serverSocket.accept();
            //开启子线程,一般不允许单独创建子线程,都是通过线程池维护
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        //03接收客户端数据
                        InputStream inputStream = socket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len = inputStream.read(bytes);
                        // 服务器端接受客户端数据包样式:userName=mayikt&userPwd=meite、
                        String UserPwd = new String(bytes, 0, len);
                        String User = UserPwd.split("&")[0].split("=")[1];
                        String Pwd = UserPwd.split("&")[1].split("=")[1];
                        // 回应数据给客户端  如果验证账户和密码正确 则响应 ok 否则 响应fail
                        OutputStream outputStream = socket.getOutputStream();
                        if ("mayikt".equals(User) && "123456".equals(Pwd)) {
                            outputStream.write("ok".getBytes());
                        } else {
                            outputStream.write("fail".getBytes());
                        }
                        //关闭资源
                        socket.close();
                        inputStream.close();
                        outputStream.close();
                    }catch (Exception e){
                        System.out.println(e);
                    }
                }
            }).start();

        }
    }
}

package JavaWeb.TCP登录验证案例;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class TCP_Client {
    public static void main(String[] args) throws IOException {
        InetAddress localHost = InetAddress.getLocalHost();
        int port=8091;
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("请输入用户名:");
            String User = scanner.nextLine();
            System.out.println("请输入密码:");
            String Pwd = scanner.nextLine();

            //拼接内容样式:userName=mayikt&userPwd=meite
            String reqText = "userName=" + User + "&userPwd=" + Pwd;

            //01创建Socket对象
            Socket socket = new Socket(localHost,port);
            //02获取getOutputStream对象
            OutputStream outputStream = socket.getOutputStream();
            //03发送数据
            outputStream.write(reqText.getBytes());


            /*接收服务器算的回应信息*/
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            //判断服务器那边是否登录成功
            String Loginresult= new String(bytes, 0, len);
            if ("ok".equals(Loginresult)) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }

            //04关闭资源
            outputStream.close();
            socket.close();

        }

    }
}

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

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

相关文章

【计算机系统基础读书笔记】1.1.3 程序和指令的执行过程

冯诺依曼结构计算机的功能通过执行程序实现,程序的执行过程就算所包含的指令的执行过程。 指令(instruction)是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作。 指令(instruction)在计算机科…

Redis 键值型数据库

一、Redis是什么 Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据 库,基于内存…

悟空大爆,OZON有哪些悟空产品推荐

Top1 减压玩具 Электронный поп ит пикачу Pop It антистресс 商品id:1592564066 月销量:811 OZON有哪些悟空产品,详情看工具:D。DDqbt。COm/74rD 此款减压玩具以其独特的设计,为…

保姆级教程!奶奶都能学会的Mac本地部署Stable Diffusion教程

一、为什么选择Stable-diffusion 举一个简单的例子,Midjourney和Stable diffusion在照片处理领域就好比是“美图秀秀”和“PS”;在短视频制作领域,就好比是“剪映”和“PR”。 这样说是不是更容易理解了,如果你是新手只想单纯的…

最高身高(c语言)

1.//描述 //KiKi想从n行m列的方阵队列中找到身高最高的人的位置,请你帮助他完成这个任务。 // //输入描述: //第一行包含两个整数n和m,表示这个方阵队列包含n行m列。从2到n 1行, // 每行输入m个整数(范围 - 231~231 -…

当黑神话遇上AI:悟空背后的策划逆袭战

声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2192.html 哈喽,亲爱的游戏迷,随着《黑神话:悟空》的上线,大家都在忙着“直面天命”了吧?今天我想和大家分享最…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容,微博用户主页内容以及导出爬取到的微博数据等操作,那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

linux笔记1

命令格式 命令行界面的提示符解析: [rootlocalhost ~]# root位置: 登录用户名 : 连接符号 localhost位置: 本机的主机名 ~位置: 当前的所在位置 #位置: 表示是超级管理员还是普通用户 超级管…

Cesium 自定义MaterialProperty原理解析

MaterialProperty是一个抽象接口类,它定义了Entity图元的材质要实现的属性和函数。这些属性和函数主要是cesium 内部调用,用于减少cesium 内部对材质的重复创建和缓存,减少内存开销。 1. Property 类 Property类是所有属性的抽象接口类&…

B2B⼤宗电商交易系统功能案例分析

B2B大宗电商交易系统是构建高效、安全、可扩展电子商务平台的重要基石。以下是对该系统后端架构与关键功能的详细解析: 后端架构 B2B大宗电商交易系统的后端架构通常涉及多个关键组件和技术,以确保系统的稳定运行和高效处理。主要组成部分包括&#xff…

UE4编安卓时Core模块为何只include Android文件夹?

Core模块 Core模块是整个引擎中最核心的模块。几乎UE4中的每个其他模块都导入Core。Engine\Source\Runtime\Core\Private下有很多文件夹&#xff0c;下面罗列一部分&#xff1a; G:\St\EngineSource\Engine\Source\Runtime\Core\Private 的目录 2024/07/18 12:02 <DIR…

AOC U27U2P创作设计旗舰——传递情感,用色彩说话!

摘要&#xff1a;每一次设计都是一种表达&#xff0c;每一次创作都是一次成长 并不是所有的路在一开始走的时候&#xff0c;都能找到正确的方向。对于设计师而言&#xff0c;在创作与设计的道路上&#xff0c;亦是如此。灵感的枯竭、无休止的改稿、色彩的偏差等等&#xff0c;…

基于springboot的校园失物招领系统--论文pf

TOC springboot483基于springboot的校园失物招领系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人…

Linux yum提示Error downloading packages

很明显的错误&#xff0c;没有考虑过磁盘空间&#xff0c;记录一下。 Error downloading packages:gcc-4.8.5-44.el7.x86_64: Insufficient space in download directory /var/cache/yum/x86_64/7/base/packages* free 0 * needed 16 M使用du查看当前目录下所有文件大小 du …

mac安装ipa包【金铲铲为例】

mac安装ipa包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

Python办公自动化 python-pptx模块的安装与使用【1】

学好办公自动化&#xff0c;走遍天下都不怕&#xff01;&#xff01; 前面已经学习了python自动处理Excel数据和自动生成word试卷的案例&#xff0c; 今天学习一下python中的python-pptx模块&#xff0c;主要用于自动化生成和更新PPT文件。主要是python-pptx的用法&#xff0c;…

react 的学习随记

npx create-react-app my-app 创建一个名叫my-app的react的项目 npm run eject 运行 显示config 文件夹 react jsx &#xff08;使用时将babel 将jsx转为js&#xff09; 单页面时需要引用 1&#xff0c;样式&#xff08;在虚拟dom时&#xff09; 1. 引用样式时 用classNa…

(第三十三天)

1. 设置主从从 mysql57 服务器 &#xff08; 1 &#xff09;配置主数据库 [rootmsater_5 ~] # systemctl stop filewalld [rootmsater_5 ~] # setenforce 0 [rootmsater_5 ~] # systemctl disable filewalld [rootmsater_5 ~] # ls anaconda-ks.cfg mysql-5.7.44-linux-g…

解决STM32使用J-Link可以擦除和读取但是无法烧录问题

现象 使用J-Link烧录模组固件&#xff0c;出现可以读取和擦除&#xff0c;但是无法烧录问题&#xff0c;提示错误如下&#xff1a; ERROR: Programming failed address 0x08000080 (program error)End of flash programmingERROR: Program failed 读出来的时候这个地址数据…

AWS EC2:助力中国企业扬帆出海

在全球化的今天&#xff0c;中国的企业家们正积极寻找机会走向世界舞台。在这个过程中&#xff0c;云计算成为了不可或缺的技术支撑。亚马逊AWS作为全球领先的云服务提供商&#xff0c;其EC2&#xff08;Elastic Compute Cloud&#xff09;弹性云服务器以其卓越的性能和广泛的基…