网络通信快速入门

news2024/11/16 13:40:48

🏡个人主页 :@ 守夜人st
🚀系列专栏:Java
…持续更新中敬请关注…
🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点

目录

  • 网络编程
    • 实现网络编程的三要素:
      • IP地址
        • IP地址的分类:
        • IP地址形式:
        • IP常用命令
        • 特殊IP地址:
      • IP地址操作类-InetAddress
      • 端口
      • 协议
    • UDP快速入门
    • TCP快速入门
    • TCP通信引入多线程
    • TCP通信——线程池优化
    • TCP通信实战案例——即时通信
    • TCP通信实战案例——模拟B/S系统

网络编程

什么是网络编程?

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

实现网络编程的三要素:

IP地址:设备在网络中的地址,是唯一的标识

端口:应用程序在设备中的唯一标识

协议:数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。

IP地址

IP地址的分类:

IPv4:32位(4字节),采用点分十进制表示法(192.168.1.1)

IPv6:128位(16字节),采用冒分十六进制表示法(ABCD:EF01:2345:6789:ABCD:EF01:2345:6789)

IP地址形式:

公网地址和私有地址(局域网使用)。

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

IP常用命令

  • Ipconfig:查看本机IP地址
  • ping IP地址:检查网络是否连通

特殊IP地址:

  • 本机IP:127.0.0.1或者localhost:称为回送地址也可称为本地回环地址,只会寻找当前所在本机

IP地址操作类-InetAddress

InetAddress表示Internet协议(IP)地址

名称说明
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地址对应的主机,连通后返回ture
package com.shouyeren.net_app;

import java.net.InetAddress;

public class InetAddressDemo01 {
    public static void main(String[] args) throws Exception {
        //获取本机IP地址对象
        InetAddress ip = InetAddress.getLocalHost();
        //得到指定主机的IP地址对象,参数是域名或者IP地址
        System.out.println(ip.getHostName());
        //获取此IP地址的主机名
        System.out.println(ip.getHostAddress());

        //获取域名的IP对象
        InetAddress ip1 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

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

        //判断是否连通
        System.out.println(ip1.isReachable(5000));
    }
}

端口

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

端口类型

  • 周知端口:0——1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)
  • 注册端口:1024——49151,分配给用户进程或某些应用程序(如Tomcat占用8080,MySQL占用3306)
  • 动态端口:49152——65535,之所以称为动态端口,是因为他一般不固定分配某种进程而是动态分配
  • 注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则会出错。

协议

  • 连接和通信数据的规则被称为网络通信协议

网络通信协议有两套参考模型

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

传输的两个常见协议

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

TCP协议的特点

  • 使用TCP协议,必须双方先建立连接,它是一种面向连接的可靠通信协议
  • 传输前,采用”三次握手“方式建立连接,所以是可靠的。
  • 在连接中可进行大量数据量的传输。
  • 连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低

TCP协议通信场景

  • 对信息安全要求较高的场景,例如:文件下载、金融等数据通信

UDP协议:

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

UDP快速入门

DatagramPacket:数据包对象

构造器说明
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)创建发送端数据包对象 buf :要发送的内容,字节数组 ;length :发送内容的字节长度;address:接收端的IP地址对象;port:接收端的端口号
public DatagramPacket(byte[] buf,int length)创建接受端的数据包对象
public class ClientDemo {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        System.out.println("===============客户端启动===============");
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String s = sc.nextLine();

            if ("exit".equals(s)){
                System.out.println("下线成功");
                socket.close();
                break;
            }
            byte[] buf = s.getBytes();
            DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),8888);
            socket.send(packet);
        }

    }
}
public class ServerDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("==============服务端启动===============");
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buf = new byte[1024*64];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        while (true) {
            socket.receive(packet);
            int len = packet.getLength();
            String rs = new String(buf,0,len);
            System.out.println("收到了来自" + packet.getAddress() +" " + packet.getPort() + "的信息:" + rs);
        }
    }
}

TCP快速入门

TCP是一种面向连接,安全可靠的传输协议

传输前采用三次握手方式,点对点通信,是可靠的

在连接中可以进行大数据量的传输

package com.shouyeren.net_app.tcp;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 开发socket网络编程入门案例的服务端
 */
public class ServerDemo {
    public static void main(String[] args) {

        try {
            System.out.println("===========服务端启动=============");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);

            //必须使用accept方法,等待接收客户端的socket连接请求
            Socket socket = serverSocket.accept();

            //从socket通信管道获得一个字节输入流
            InputStream in = socket.getInputStream();
            //把自己输入流包装成缓冲字符输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(in));
            //按照行读取消息
            String msg;
            while ((msg = buf.readLine()) != null){
                System.out.println(socket.getRemoteSocketAddress() + ":" + msg);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

package com.shouyeren.net_app.tcp;

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 完成socket网络编程入门案例的客户端的开发
 */
public class ClientDemo {
    public static void main(String[] args) {

        try {
            //1. 创建客户端的Socket对象,请求与服务端连接
            Socket socket = new Socket("127.0.0.1",7777);

            //2. 使用socket对象调用getOutputStream()方法得到字节输出流
            OutputStream os = socket.getOutputStream();

            //3. 把低级的字节输出流包装成打印流
            PrintStream printStream = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while (true) {
                //4. 发送消息
                System.out.println("请说:");
                String msg = sc.nextLine();
                printStream.println(msg);
                printStream.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TCP通信引入多线程

需求一个服务端能够同时接收多个客户端发送的消息

package com.shouyeren.net_app.tcp;

import java.net.ServerSocket;
import java.net.Socket;

/**
 * 开发socket网络编程入门案例的服务端
 */
public class ServerDemo {
    public static void main(String[] args) {

        try {
            System.out.println("===========服务端启动=============");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            while (true) {
                //必须使用accept方法,等待接收客户端的socket连接请求
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "连接成功!!!");
                //把新连接的Socket交给有个独立的线程处理并启动线程
                new ServerReaderThread(socket).start();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

package com.shouyeren.net_app.tcp;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //从socket通信管道获得一个字节输入流
            InputStream in = socket.getInputStream();
            //把自己输入流包装成缓冲字符输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(in));
            //按照行读取消息
            String msg;
            while ((msg = buf.readLine()) != null){
                System.out.println(socket.getRemoteSocketAddress() + ":" + msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }

    }
}

TCP通信——线程池优化

完成socket通信,使用线程池完成优化

package com.shouyeren.net_app.socket_threadpool;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 * 开发socket网络编程入门案例的服务端
 */
public class ServerDemo {
    //使用静态变量记住一个线程池对象
    private static ExecutorService pool = new ThreadPoolExecutor(3,5,
            6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(2),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    public static void main(String[] args) {

        try {
            System.out.println("===========服务端启动=============");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            while (true) {
                //必须使用accept方法,等待接收客户端的socket连接请求
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "连接成功!!!");
                pool.execute(new ServerReaderRunnable(socket));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.shouyeren.net_app.socket_threadpool;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerReaderRunnable implements Runnable{
    private Socket socket;
    public ServerReaderRunnable(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //从socket通信管道获得一个字节输入流
            InputStream in = socket.getInputStream();
            //把自己输入流包装成缓冲字符输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(in));
            //按照行读取消息
            String msg;
            while ((msg = buf.readLine()) != null){
                System.out.println(socket.getRemoteSocketAddress() + ":" + msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }
    }
}

线程池优化的优势在哪里

  • 服务端可以复用线程处理多个客户端,可以避免系统瘫痪
  • 适合客户端通信时长较短的场景

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

package com.shouyeren.net_app.tcp_sms;

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

/**
 * 完成socket网络编程入门案例的客户端的开发
 */
public class ClientDemo {
    public static void main(String[] args) {

        try {
            //1. 创建客户端的Socket对象,请求与服务端连接
            Socket socket = new Socket("127.0.0.1",8888);

            new ClientReaderThread(socket).start();
            //2. 使用socket对象调用getOutputStream()方法得到字节输出流
            OutputStream os = socket.getOutputStream();

            //3. 把低级的字节输出流包装成打印流
            PrintStream printStream = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while (true) {
                //4. 发送消息
                System.out.println("请说:");
                String msg = sc.nextLine();
                printStream.println(msg);
                printStream.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ClientReaderThread extends Thread{
    private Socket socket;
    public ClientReaderThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //从socket通信管道获得一个字节输入流
            InputStream in = socket.getInputStream();
            //把自己输入流包装成缓冲字符输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(in));
            //按照行读取消息
            String msg;
            while ((msg = buf.readLine()) != null) {
                System.out.println("收到消息 : " + msg);
            }
        } catch (Exception e) {
            System.out.println("服务端把你踢出去了!!!");
        }
    }

}
package com.shouyeren.net_app.tcp_sms;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 开发socket网络编程入门案例的服务端
 */
public class ServerDemo {
    //定义一个静态的List集合处在当前在线的Socket
    public static List<Socket> allOnlineSocket = new ArrayList<>();
    public static void main(String[] args) {

        try {
            System.out.println("===========服务端启动=============");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(8888);
            while (true) {
                //必须使用accept方法,等待接收客户端的socket连接请求
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "连接成功!!!");
                allOnlineSocket.add(socket);
                //把新连接的Socket交给有个独立的线程处理并启动线程
                new ServerReaderThread(socket).start();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //从socket通信管道获得一个字节输入流
            InputStream in = socket.getInputStream();
            //把自己输入流包装成缓冲字符输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(in));
            //按照行读取消息
            String msg;
            while ((msg = buf.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress()+" : " + msg);
                //把收到的消息转发给所有在线的客户端
                sendMsgToAll(msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "已下线!!!");
            ServerDemo.allOnlineSocket.remove(socket);
        }
    }

    private void sendMsgToAll(String msg) throws Exception {
        for (Socket socket : ServerDemo.allOnlineSocket) {
            PrintStream printStream = new PrintStream(socket.getOutputStream());
            printStream.println(msg);
            printStream.flush();
        }
    }

}

TCP通信实战案例——模拟B/S系统

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

package com.shouyeren.net_app.BS;

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

public class ServerDemo {
    public static void main(String[] args) {

        try {
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(8888);
            while (true) {

                //必须使用accept方法,等待接收客户端的socket连接请求
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "连接成功!!!");

                //把新连接的Socket交给有个独立的线程处理并启动线程
                new ServerReaderThread(socket).start();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            PrintStream printStream = new PrintStream(socket.getOutputStream());

            //协议类型和版本 响应成功消息
            printStream.println("HTTP/1.1 200 OK");
            //响应的数据类型 文本/网页
            printStream.println("Content-Type:text/html;charset=UTF-8");
            //这里需要一个空行
            printStream.println();
            //响应数据正文
            printStream.println("<span style='color:red;font-size:90px'> 响应数据!!! </span>");

            printStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

感觉不错的话,动手点个赞吧!

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

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

相关文章

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析(选择题)2022年12月

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析2022年12月 选择题(共25题,每题2分,共50分) 1、小明想在开始表演之前向大家问好并做自我介绍,应运行下列哪个程序 A、 B、 C、 D、 答案:D

【MySQL】第17章_触发器

第17章_触发器 在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如商品信息和库存信息分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时…

Linux - 内存性能评估

文章目录概述free 命令指定的时间段内不间断地监控内存的使用情况通过watch与free相结合动态监控内存状况vmstat命令监控内存“sar –r”命令组合小结概述 内存的管理和优化是系统性能优化的一个重要部分&#xff0c;内存资源的充足与否直接影响应用系统的使用性能。在进行内存…

C语言-基础了解-07-C运算符

c运算符 一、算术运算符 假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 实例 #include <stdio.h>int main() {int a 21;int b 10;int c ;c a b;printf("Line 1 - c 的值是 %d\n", c );c a - b;printf("Line 2 - …

机器学习100天(四十一):041 对偶支持向量机-公式推导

《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:对偶支持向量机-公式推导! 本节主要延续上一节的内容,推导线性支持向量机的对偶形式。本节内容包含的数学理论和推导很多,我尽量简化其中的数学部分,只做感性的介绍,便于大家在理解的同时不受数学复杂公式…

ubuntu 18.04 虚拟机分区扩容

我的虚拟机存在一个问题&#xff0c;原来分配的是60G的空间&#xff0c;但实际只用了30G就已经最显示空间已经满&#xff0c;没办法使用:通过fdisk -l查看分区情况查看LVM卷组的信息Free PE / Size 7551 / <29..50 GiB&#xff0c;这是还可以扩充的大小#lvextend -L 10G /de…

git常用命令汇总

Git 是一种分布式版本控制系统&#xff0c;它具有以下优点&#xff1a; 分布式&#xff1a;每个开发者都可以拥有自己的本地代码仓库&#xff0c;不需要连接到中央服务器&#xff0c;这样可以避免单点故障和网络延迟等问题。 非线性开发&#xff1a;Git 可以支持多个分支并行开…

踩坑:解决npm版本升级报错,无法安装node-sass的问题

npm版本由于经常更新&#xff0c;迁移前端项目时经常发现报错安装不上。 比如&#xff0c;项目经常使用的sass模块&#xff0c;可能迁移的时候就发现安装不了。 因为node-sass 编译器是通过 C 实现的。在 Node.js 中&#xff0c;采用 gyp 构建工具进行构建 C 代码&#xff0c…

自制有声书阅读器:用PaddleSpeech打开读书新方式

吕声辉&#xff0c;飞桨开发者技术专家&#xff08;PPDE&#xff09;&#xff0c;某网络科技公司研发工程师。主要研究方向为图像识别&#xff0c;自然语言处理等。 • AI Studio主页 https://aistudio.baidu.com/aistudio/personalcenter/thirdview/227158 项目背景 随着互联…

第十四届蓝桥杯三月真题刷题训练——第 3 天

目录 题目1&#xff1a;门牌制作 题目描述 运行限制 代码&#xff1a; 题目2&#xff1a;货物摆放_long 题目描述 答案提交 运行限制 代码&#xff1a; 题目3&#xff1a;跳跃_dp 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 题目4&a…

AAAI顶会行人重识别算法详解——Relation Network for Person Re-identification

1.论文整体框架概述 在行人重识别任务中,通常都是对整个输入数据进行特征提取,但是缺少了局部信息。能不能既考虑局部与整体信息,也同时加入他们的联系呢?这篇论文主要的思想就是局部信息和全局信息的融合。 整体流程如上图所示, 首先对整体进行特征提取, 通常采用…

【FPGA】Verilog:MSI/LSI 组合电路之解码器 | 多路分解器

写在前面&#xff1a;本章将理解编码器与解码器、多路复用器与多路分解器的概念&#xff0c;通过使用 Verilog 实现多样的解码器与多路分解器&#xff0c;通过 FPGA 并使用 Verilog 实现。 Ⅰ. 前置知识 0x00 解码器与编码器&#xff08;Decoder / Encoder&#xff09; 解码器…

素数分类的猜想==素数,划分分类,就分为真素质数与非真素质数

素数分类的猜想 根据哥德巴赫公理&#xff08;我暂不称之为猜想了&#xff09;&#xff0c;普通素数加一&#xff0c;成为合数&#xff0c;必可分解成两个素数&#xff0c;所以&#xff0c;两个素数Pi,Pj相加减一&#xff0c;是有可能为素数Pn的&#xff0c;这样的素数Pi,Pj&am…

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目&#xff0c;diffusion model】一、简介二、扩散过程&#xff1a;输入是x_0和时刻num_steps&#xff0c;输出是x_t三、逆扩散过程&#xff1a;输入x_t&#xff0c;不断采样最终输出x_0四、具体参考算法流程图五、模型mo…

Android Framework 启动流程必知必会

课前预习在了解启动流程之前先了解一下下面两个概念:1、子进程与父进程的区别1.除了文件锁以外,其他的锁都会被继承2.各自的进程ID和父进程ID不同3.子进程的未决告警被清除4.子进程的未决信号集设置为空集2、什么是写时拷贝(copy-on-write)Linux 的 fork() 使用是通过「写时拷贝…

【Linux】Linux项目自动化构建工具make makefile

文章目录1. 背景2.实例3.原理4.项目清理5. 文件属性中的三个时间6. Linux下第一个小程序——进度条6.1 前置知识1&#xff1a;缓冲区6.2前置知识2&#xff1a;回车换行6.3进度条的实现7 Linux下git的”三板斧“1. 背景 一个工程中的源文件不计其数&#xff0c;其按类型、功能、…

【C++】位图+哈希切割+布隆过滤器

文章目录一、位图1.1 位图概念1.2 位图实现1.2.1 把x对应比特位0置11.2.2 把x对应比特位1置01.2.1 查看x对应比特位1.3 位图源码1.4 位图的应用二、哈希切割&#xff08;处理海量数据&#xff09;三、布隆过滤器3.1 布隆过滤器的概念3.2 布隆过滤器的应用场景3.3 布隆过滤器的实…

zookeeper安装使用

一、因使用kafka 需使用zookeeper,此处使用单节点 ZooKeeper有两种安装模式&#xff0c;最简单的方式是单机模式&#xff08;standalone mode&#xff09;&#xff0c;它只需要在一台机器上面运行&#xff0c;另一种方式是集群模式&#xff0c;集群模式需要多台服务器部署。 Z…

Java中垃圾回收(GC)基本概念

如果想真正理解GC&#xff0c;则需要循序渐进&#xff0c;由浅入深的了解GC&#xff0c;从本篇文章开始我们详细介绍Java中的GC&#xff0c;本篇文章我们通过4个主题先介绍垃圾回收的基本概念一、Java中什么是GC&#xff0c;为什么需要GC二、早期垃圾回收三、Java垃圾回收机制四…

DockQuery x 达梦 国产数据库生态“加速跑”

「数字化」是当今社会最先进和最具穿透力的生产力&#xff0c;近十年里开展着气势磅礴的发展。而信创产业则是保障中国经济数字化转型平稳健康发展的基础。 随着信创产业规模不断扩大&#xff0c;国产数据库市场释放出前所未有的活力。达梦作为国产数据库领头羊&#xff0c;坚…