【Java万花筒】通信无限:构建强大的Java应用的电信与通信库

连接世界:发挥Java的电信与通信库的集成能力

前言

通信在现代社会中起着至关重要的作用,而在Java应用程序中集成通信功能可以为用户提供更好的体验。本文将介绍几个强大的电信与通信库,包括Java Communications API (javax.comm)、Apache Camel、Asterisk-Java、Netty和Twilio Java Helper Library。这些库提供了丰富的功能和集成能力,使开发人员能够轻松构建各种通信应用,包括短信、电话、语音和网络通信等。

欢迎订阅专栏:Java万花筒

文章目录

  • 连接世界:发挥Java的电信与通信库的集成能力
    • 前言
      • 1. Java Communications API (javax.comm)
        • 1.1 概述
        • 1.2 特性
        • 1.3 使用案例
        • 1.4 使用案例:事件监听和流控制
          • 1.4.1 事件监听
          • 1.4.2 流控制
      • 2. Apache Camel (集成框架)
        • 2.1 介绍
        • 2.2 集成能力
        • 2.3 支持的协议
        • 2.4 实际应用场景
        • 2.5 路由定义
        • 2.6 组件和数据格式
        • 2.7 扩展功能
      • 3. Asterisk-Java (Asterisk集成库)
        • 3.1 Asterisk简介
        • 3.2 与Java的集成
        • 3.3 语音与电话应用
        • 3.4 关键特性与使用案例
        • 3.5 呼叫事件监听
      • 4. Netty (网络通信框架)
        • 4.1 简介
        • 4.2 高性能网络通信
        • 4.3 异步与事件驱动
        • 4.4 应用领域
        • 4.5 异步与事件驱动编程
      • 5. Twilio Java Helper Library (短信和电话服务)
        • 5.1 Twilio服务概述
        • 5.2 Java库的集成
        • 5.3 短信和电话功能
        • 5.4 安全性和其他功能
    • 总结

1. Java Communications API (javax.comm)

1.1 概述

Java Communications API (javax.comm) 是一个用于在Java平台上进行串行通信的标准API。它提供了一组类和接口,用于与串行端口进行通信,例如RS-232串行端口。

1.2 特性

javax.comm 提供了一些核心特性,包括串行端口的打开、关闭、读取和写入数据等功能。它支持多种串行通信协议和硬件设备,并且具有较好的跨平台性能。

1.3 使用案例

以下是一个使用 javax.comm 进行串行通信的简单示例:

import javax.comm.*;public class SerialCommunicationExample {public static void main(String[] args) {try {// 获取CommPortIdentifier对象CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM1");// 打开串行端口SerialPort serialPort = (SerialPort) portIdentifier.open("SerialCommunicationExample", 2000);// 配置串行通信参数serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);// 获取输入输出流InputStream inputStream = serialPort.getInputStream();OutputStream outputStream = serialPort.getOutputStream();// 读取数据byte[] buffer = new byte[1024];int len = inputStream.read(buffer);String data = new String(buffer, 0, len);System.out.println("Received data: " + data);// 写入数据String message = "Hello, Serial Port!";outputStream.write(message.getBytes());// 关闭流和串行端口inputStream.close();outputStream.close();serialPort.close();} catch (Exception e) {e.printStackTrace();}}
}

请确保已安装javax.comm库,并将示例中的端口名(如"COM1")更改为实际可用的串行端口。

1.4 使用案例:事件监听和流控制

在前面的例子中,我们展示了如何使用javax.comm进行基本的串行通信。现在,让我们深入探讨如何使用该API进行事件监听和流控制。

1.4.1 事件监听

javax.comm提供了事件监听机制,可以通过注册SerialPortEventListener来监听串口上的事件。以下是一个示例:

import javax.comm.*;public class SerialEventExample {public static void main(String[] args) {try {CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM1");SerialPort serialPort = (SerialPort) portIdentifier.open("SerialEventExample", 2000);serialPort.addEventListener(new SerialPortEventListener() {@Overridepublic void serialEvent(SerialPortEvent event) {if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {try {InputStream inputStream = serialPort.getInputStream();byte[] buffer = new byte[1024];int len = inputStream.read(buffer);String data = new String(buffer, 0, len);System.out.println("Received data: " + data);} catch (IOException e) {e.printStackTrace();}}}});serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);serialPort.notifyOnDataAvailable(true);} catch (Exception e) {e.printStackTrace();}}
}

在上述例子中,我们注册了一个SerialPortEventListener来监听串口上的数据可用事件。当有数据可读取时,我们从输入流中读取数据并进行处理。这样,我们可以实时地获取串口上的数据。

1.4.2 流控制

javax.comm还支持流控制功能,包括硬件流控制(RTS/CTS)和软件流控制(XON/XOFF)。以下是一个示例:

import javax.comm.*;public class SerialFlowControlExample {public static void main(String[] args) {try {CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM1");SerialPort serialPort = (SerialPort) portIdentifier.open("SerialFlowControlExample", 2000);serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);// 其他通信参数的配置...serialPort.getOutputStream().write("AT\r\n".getBytes());// 等待响应...} catch (Exception e) {e.printStackTrace();}}
}

在上述例子中,我们通过setFlowControlMode方法设置了RTS/CTS硬件流控制模式。这可以确保在发送数据之前,接收方已准备好接收数据。根据具体需求,我们可以选择其他流控制模式。

请注意,具体的实现细节和操作方法可能因操作系统和硬件设备的不同而有所差异。在使用javax.comm之前,请参考相关文档和资料以确保正确使用和配置。

2. Apache Camel (集成框架)

2.1 介绍

Apache Camel 是一个开源的集成框架,用于在应用程序之间进行消息路由、转换和交互。它提供了丰富的组件和语法,简化了不同系统之间的集成开发。

2.2 集成能力

Apache Camel 支持多种协议和数据格式,包括HTTP、FTP、JMS、SOAP等。它可以在不同的传输协议之间进行消息路由和转换,并提供了强大的路由引擎和消息处理器。

2.3 支持的协议

Apache Camel 支持广泛的通信协议,如HTTP、FTP、JMS、AMQP、SMTP等,以及数据格式的转换和处理。

2.4 实际应用场景

以下是一个使用 Apache Camel 进行消息路由的示例:

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;public class MessageRoutingExample {public static void main(String[] args) throws Exception {// 创建Camel上下文CamelContext context = new DefaultCamelContext();// 定义路由context.addRoutes(new RouteBuilder() {public void configure() {// 从input文件夹读取文本文件from("file:input?noop=true").to("log:input").to("direct:process");// 处理文本并转换为大写from("direct:process").log("Processing file: ${header.CamelFileName}").convertBodyTo(String.class).process(exchange -> {String body = exchange.getIn().getBody(String.class);exchange.getIn().setBody(body.toUpperCase());}).to("log:output").to("file:output");}});// 启动Camel上下文context.start();Thread.sleep(5000);// 关闭Camel上下文context.stop();}
}

该示例使用Apache Camel将input文件夹中的文本文件读取并转换为大写后输出到output文件夹中。通过使用Apache Camel的路由引擎和转换功能,可以轻松实现不同系统之间的消息路由和转换。

2.5 路由定义

在Apache Camel中,路由是使用DSL(领域特定语言)进行定义的。DSL提供了一种简洁而强大的方式来描述消息路由、转换和处理。以下是一些常用的路由语法:

  • from(“source”):指定消息来源,可以是文件夹、队列、主题等。
  • to(“destination”):指定消息的目标,可以是文件夹、队列、主题等。
  • transform():对消息进行转换。
  • filter():根据某些条件对消息进行过滤。
  • split():将消息拆分成多个部分进行处理。
  • aggregate():将多个消息聚合成一个。
  • choice():根据条件选择不同的路由路径。

通过组合和配置这些路由语法,可以构建复杂的消息路由和处理流程。

2.6 组件和数据格式

Apache Camel提供了丰富的组件和数据格式,用于支持各种通信协议和数据格式的处理。例如:

  • File:处理文件和文件夹。
  • FTP:处理FTP协议的文件传输。
  • HTTP:处理HTTP协议的请求和响应。
  • JMS:处理Java消息服务(JMS)。
  • CXF:处理SOAP和RESTful Web服务。
  • JSON:处理JSON格式的数据。
  • XML:处理XML格式的数据。

开发人员可以根据具体需求选择适合的组件和数据格式,以满足集成应用的需求。

2.7 扩展功能

除了基本的路由和转换功能之外,Apache Camel还提供了许多扩展功能,如错误处理、事务管理、并行处理等。开发人员可以根据实际需求进一步探索这些功能。

3. Asterisk-Java (Asterisk集成库)

3.1 Asterisk简介

Asterisk 是一个开源的电话和语音通信平台,可以用于构建各种电话和语音应用。它具有强大的通信功能和灵活的配置选项。

3.2 与Java的集成

Asterisk-Java 是一个用于与Asterisk进行集成的Java库。它提供了一组Java类和方法,用于与Asterisk服务器进行通信和控制。

3.3 语音与电话应用

Asterisk-Java 可以用于开发语音自动应答系统、呼叫中心应用、电话会议等。通过与Asterisk集成,开发人员可以实现电话和语音功能。

3.4 关键特性与使用案例

以下是一个使用 Asterisk-Java 进行呼叫控制的示例:

import org.asteriskjava.manager.DefaultManagerConnection;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.OriginateAction;
import org.asteriskjava.manager.response.ManagerResponse;public class CallControlExample {public static void main(String[] args) {ManagerConnectionFactory factory = new ManagerConnectionFactory("localhost", "admin", "password");ManagerConnection connection = factory.createManagerConnection();try {// 建立与Asterisk的连接connection.login();// 发起一个呼叫OriginateAction originateAction = new OriginateAction();originateAction.setChannel("SIP/1000");originateAction.setExten("1001");originateAction.setContext("default");originateAction.setPriority(1);ManagerResponse response = connection.sendAction(originateAction, 30000);// 输出呼叫结果System.out.println("Response: " + response.getResponse());System.out.println("Message: " + response.getMessage());// 断开与Asterisk的连接connection.logoff();} catch (TimeoutException | InterruptedException e) {e.printStackTrace();} finally {if (connection != null && connection.isConnected()) {connection.logoff();}}}
}

请确保已在本地运行了Asterisk服务器,并将示例中的连接参数(如"localhost"、“admin”、“password”)更改为实际可用的Asterisk服务器信息。该示例使用Asterisk-Java库与Asterisk服务器建立连接,并通过OriginateAction发起一个呼叫。

3.5 呼叫事件监听

除了发起呼叫,Asterisk-Java还提供了事件监听机制,可以监听和处理与呼叫相关的事件。以下是一个示例,演示如何使用Asterisk-Java进行呼叫事件监听:

import org.asteriskjava.manager.DefaultManagerConnection;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.OriginateAction;
import org.asteriskjava.manager.event.ManagerEvent;
import org.asteriskjava.manager.response.ManagerResponse;public class CallEventListenerExample {public static void main(String[] args) {ManagerConnectionFactory factory = new ManagerConnectionFactory("localhost", "admin", "password");ManagerConnection connection = factory.createManagerConnection();try {// 建立与Asterisk的连接connection.login();// 添加事件监听器connection.addEventListener(event -> {if (event instanceof ManagerEvent) {ManagerEvent managerEvent = (ManagerEvent) event;System.out.println("Received event: " + managerEvent.getClass().getSimpleName());// 在这里处理与呼叫相关的事件}});// 发起一个呼叫OriginateAction originateAction = new OriginateAction();originateAction.setChannel("SIP/1000");originateAction.setExten("1001");originateAction.setContext("default");originateAction.setPriority(1);ManagerResponse response = connection.sendAction(originateAction, 30000);// 输出呼叫结果System.out.println("Response: " + response.getResponse());System.out.println("Message: " + response.getMessage());// 断开与Asterisk的连接connection.logoff();} catch (TimeoutException | InterruptedException e) {e.printStackTrace();} finally {if (connection != null && connection.getState() != ManagerConnectionState.DISCONNECTED) {connection.logoff();}}}
}

在此示例中,我们使用 connection.addEventListener() 方法添加了一个事件监听器,该监听器在接收到任何事件时都会打印出事件的类名。您可以根据需要在监听器中处理特定类型的事件,例如处理呼叫状态变化、通话录制等。

请确保已在本地运行了 Asterisk 服务器,并将示例中的连接参数(如 “localhost”、“admin”、“password”)更改为实际可用的 Asterisk 服务器信息。

通过使用 Asterisk-Java 库的事件监听机制,开发人员可以实现更加灵活和定制化的呼叫控制和电话应用。

4. Netty (网络通信框架)

4.1 简介

Netty 是一个高性能的网络通信框架,用于构建可扩展的服务器和客户端应用程序。它提供了简单而强大的抽象,使开发人员能够轻松地处理各种网络协议。

4.2 高性能网络通信

Netty 基于事件驱动和异步的编程模型,提供了高性能的网络通信能力。它使用了非阻塞的I/O操作,充分利用了现代操作系统的异步I/O特性。

4.3 异步与事件驱动

Netty 使用异步和事件驱动的方式处理网络通信。它基于事件的机制,将各种网络事件(如连接、读取、写入)转化为事件对象,并通过处理器链来处理这些事件。

4.4 应用领域

Netty 可以应用于各种网络通信场景,包括服务器端开发、客户端开发、实时数据传输、高性能代理等。它已被广泛应用于互联网、物联网和大数据等领域。

以下是一个使用 Netty 实现简单的Echo服务器的示例:

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;public class EchoServerExample {private final int port;public EchoServerExample(int port) {this.port = port;}public void start() throws Exception {EventLoopGroup group = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(group).channel(NioServerSocketChannel.class).localAddress(port).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new EchoServerHandler());}});ChannelFuture future = bootstrap.bind().sync();System.out.println("Server started on port " + port);future.channel().closeFuture().sync();} finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {int port = 8080;EchoServerExample server = new EchoServerExample(port);server.start();}
}class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}

该示例使用Netty创建了一个简单的Echo服务器,它会将客户端发送的消息原样返回。通过使用Netty的高性能网络通信能力,开发人员可以构建可扩展和高性能的网络应用程序。

4.5 异步与事件驱动编程

在 Netty 中,异步与事件驱动是核心概念。通过异步的方式处理网络通信,可以充分利用系统资源,提高系统的并发能力。而事件驱动的编程模型则可以使开发人员更加灵活地处理各种网络事件。

Netty 提供了丰富的事件和处理器,以便开发人员能够处理不同类型的事件,例如连接建立、数据读取、数据写入等。通过将处理器按照特定的顺序组织成处理器链,可以实现复杂的网络通信逻辑。

以下是一个示例,演示了如何使用 Netty 实现一个简单的时间服务器:

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;import java.time.LocalDateTime;public class TimeServerExample {private final int port;public TimeServerExample(int port) {this.port = port;}public void start() throws Exception {NioEventLoopGroup group = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(group).channel(NioServerSocketChannel.class).localAddress(port).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new TimeServerHandler());}});ChannelFuture future = bootstrap.bind().sync();System.out.println("Server started on port " + port);future.channel().closeFuture().sync();} finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {int port = 8080;TimeServerExample server = new TimeServerExample(port);server.start();}
}class TimeServerHandler extends SimpleChannelInboundHandler<ByteBuf> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {LocalDateTime now = LocalDateTime.now();String timeString = now.toString() + System.lineSeparator();ByteBuf response = ctx.alloc().buffer(timeString.length());response.writeBytes(timeString.getBytes());ctx.writeAndFlush(response);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}

在该示例中,我们通过创建一个时间服务器,向客户端发送当前的时间信息。通过使用 Netty 的异步和事件驱动编程模型,我们可以轻松地处理数据读写、异常处理等网络事件。

5. Twilio Java Helper Library (短信和电话服务)

5.1 Twilio服务概述

Twilio 是一个云通信平台,提供了短信、语音和视频通信服务。Twilio Java Helper Library 是 Twilio 提供的用于在Java应用程序中使用 Twilio 服务的辅助库。

5.2 Java库的集成

要使用 Twilio Java Helper Library,需要在项目中添加相应的依赖项。可以使用 Maven 或 Gradle 等构建工具,将以下依赖项添加到项目配置文件中:

<!-- Maven 依赖项 -->
<dependency><groupId>com.twilio.sdk</groupId><artifactId>twilio</artifactId><version>7.55.0</version>
</dependency><!-- Gradle 依赖项 -->
implementation 'com.twilio.sdk:twilio:7.55.0'
5.3 短信和电话功能

使用 Twilio Java Helper Library,可以轻松地在Java应用程序中实现短信和电话功能。以下是一个发送短信和拨打电话的示例:

import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Message;
import com.twilio.type.PhoneNumber;public class TwilioExample {// Twilio账号信息public static final String ACCOUNT_SID = "Your_Account_SID";public static final String AUTH_TOKEN = "Your_Auth_Token";public static void main(String[] args) {// 初始化TwilioTwilio.init(ACCOUNT_SID, AUTH_TOKEN);// 发送短信String fromPhoneNumber = "+1234567890"; // Twilio分配给您的电话号码String toPhoneNumber = "+9876543210"; // 接收短信的电话号码String messageBody = "Hello, Twilio!";Message message = Message.creator(new PhoneNumber(toPhoneNumber), new PhoneNumber(fromPhoneNumber), messageBody).create();System.out.println("Message SID: " + message.getSid());// 拨打电话String fromPhoneNumber = "+1234567890"; // Twilio分配给您的电话号码String toPhoneNumber = "+9876543210"; // 要拨打的电话号码Call call = Call.creator(new PhoneNumber(toPhoneNumber), new PhoneNumber(fromPhoneNumber), new URI("http://demo.twilio.com/docs/voice.xml")).create();System.out.println("Call SID: " + call.getSid());}
}

请确保替换示例中的 Your_Account_SIDYour_Auth_Token 为您自己的 Twilio 帐户凭据。使用 Twilio Java Helper Library,您可以轻松地发送短信和拨打电话,并获得与之相关的唯一标识符(SID)。

5.4 安全性和其他功能

Twilio Java Helper Library 提供了许多其他功能,例如:

  • 账户信息和余额查询
  • 获取短信、电话和录音的详细信息
  • 管理通话记录和短信记录
  • 创建、更新和删除电话号码等

此外,Twilio 还提供了安全性功能,如身份验证和授权。您可以使用这些功能来保护您的应用程序和用户的通信数据。

总结

本文详细介绍了几个强大的电信与通信库,涵盖了不同的领域和应用场景。通过使用这些库,开发人员可以轻松构建各种通信应用,满足用户的需求,并提供出色的用户体验。

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

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

相关文章

第3章-python深度学习——(波斯美女)

第3章 神经网络入门 本章包括以下内容&#xff1a; 神经网络的核心组件 Keras 简介 建立深度学习工作站 使用神经网络解决基本的分类问题与回归问题 本章的目的是让你开始用神经网络来解决实际问题。你将进一步巩固在第 2 章第一个示例中学到的知识&#xff0c;还会将学到的…

外汇监管牌照解析:确保交易安全与合规性

外汇交易中&#xff0c;资金安全与平台监管是大家最关心的话题。监管是评估外汇经纪商是否值得信赖、是否具备相关资质的关键依据&#xff0c;因此选择一家拥有海外合法监管的经济商至关重要。 那么&#xff0c;今天我们就来聊聊全球权威的几大监管机构 — FCA、ASIC、NFA、FSA…

【思科】 GRE VPN 的实验配置

【思科】GRE VPN 的实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“虚拟专…

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…

在Mixamo网站上,下载的动画导入unity给自己的模型添加后出错怎么解决

在Mixamo网站上&#xff0c;下载的动画导入unity给自己的模型添加后出错 一、在Mixamo下载的模型可以正常使用二、在自己的模型和unity自带模型上就出错1.解决方法2.解决成功 注意 一、在Mixamo下载的模型可以正常使用 二、在自己的模型和unity自带模型上就出错 1.解决方法 选…

C/C++ - 类的继承机制

目录 类继承 继承的本质 继承的作用 继承的语法 继承的权限 继承的构造析构 继承构造函数 继承析构函数 继承的基类调用 继承的对象赋值 继承与友元关系 继承与静态成员 不能被继承的类 构造函数 语法特性 单继承 单继承的特点 多继承 多继承概念 多继承语…

Linux ubuntu 20.4.6安装docker

这边需要在vm中使用docker&#xff0c;记录下 1.更新系统包列表 确保您的系统包列表是最新的 sudo apt update 2.安装依赖工具 sudo apt install apt-transport-https ca-certificates curl software-properties-common 3.添加Docker GPG密钥 curl -fsSL https://downloa…

Android Room数据库异常: Room cannot verify the data integrity.

文章目录 一、前言二、错误信息如下三、参考链接 一、前言 在Room数据库结构变动的情况下&#xff0c;如果没有进行Room数据库升级迁移&#xff0c;则会报错Room cannot verify the data integrity.。在实际开发过程中&#xff0c;数据库结构会经常变化&#xff0c;直到发版。…

Centos 7.9 在线安装 VirtualBox 7.0

1 访问 Linux_Downloads – Oracle VM VirtualBox 2 点击 ​the Oracle Linux repo file 复制 内容到 /etc/yum.repos.d/. 3 在 /etc/yum.repos.d/ 目录下新建 virtualbox.repo&#xff0c;复制内容到 virtualbox.repo 并 :wq 保存。 [rootlocalhost centos]# cd /etc/yum.rep…

【数据结构 05】双链表

一、原理 双链表又称双向链表&#xff0c;通常情况下是带头循环结构&#xff0c;在CSTL标准模板库中封装的<list.h>头文件就是带头双向循环链表。 特性&#xff1a;增删灵活且高效&#xff0c;支持随机增删但不支持随机访问 设计思路&#xff1a; 链表包含一个头节点h…

一维差分(c++题解)

题目描述 输入一个长度为n的整数序列。 接下来输入 个操作&#xff0c;每个操作包含三个整数 &#xff0c;表示将序列中 之间的每个数加上 。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数 n 和 m。 第二行包含n个整数&#xff0c;表示整数序列。 接下来…

【Linux】模拟实现一个简单的minishell

目录 从显示屏获取输入字符流 分割字符串 取出命令名称及选项 去除输入时多按的那个换行符 创建子进程&#xff0c;实现程序替换 如果替换失败&#xff0c;进程终止exit 查看子进程情况 实现echo $?功能 实现cd 最终代码 基本思路 让父进程创建一个子进程&#xff0c…

我用Java写了一个简单的二叉树算法

二叉树是一种常见的数据结构&#xff0c;它是由节点和连接节点的边组成的。每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树算法包括遍历、查找、插入、删除等操作。 class Node {int data;Node left, right;public Node(int item) {data item;left…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令&#xff0c;哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…

微信小程序如何调整checkbox和radios选择框的大小和样式

目录 修改选中框大小 修改Checkbox样式 修改Radio样式 修改选中框大小 直接使用width和height调整checkbox和radios选择框的大小是无效的,简单的调整大小可以通过修改transform值,如下所示: .wxss .fill-checkbox{transform: scale(0.5,0.5); } scale参数分别为在长…

二分查找(c++题解)

题目描述 在一个单调递增的序列里查找X。 如果找到x&#xff0c;则返回x在数组中的位置 如果没有找到&#xff0c;则返回&#xff0d;1 输入格式 第1行&#xff1a;1个整数N(1<N<2000000), 表示元素的个数 第2行开始的若干行&#xff0c;每行10个空格分开的整数&am…

SpringMVC处理ajax请求(@RequestBody注解),ajax向后端传递的数据格式详解

目录 RequestBody注解简单介绍 RequestBody获取json格式的请求参数 Servlet方式处理ajax请求 本文讲解两种方式实现SpringMVC与Ajax交互&#xff0c;1、通过SpringMVC提供的注解RequestBody处理ajax请求&#xff1b;2、通过JavaEE时期的Servlet来处理 RequestBody注解简单介…

CISAW和CISP-PTE证书选择指南

&#x1f4e3;在信息安全领域&#xff0c;选择合适的证书可以为你的职业生涯增添光彩。很多从事信息渗透行业的朋友经常讨论CISP-PTE和CISAW之间的选择问题。今天就从4个方面带你详细了解这两张证书&#xff0c;帮你做出明智的选择&#xff01; 1️⃣证书的行业前景 &#x1f4…

【数据结构1-4】图的基本应用

一、【P5318】查找文献&#xff08;邻接表DFSBFS&#xff09; 本题是图的遍历模板题&#xff0c;需要使用DFS和BFS遍历方法。 由于本题最多有1e5个顶点&#xff0c;如果采用邻接矩阵存储图的话需要4*1e10 Byte空间&#xff0c;显然会超内存&#xff0c;因此这里采用邻接表的方法…

【Nuxt3】layouts的使用

简言 Nuxt 提供了一个布局框架&#xff0c;用于将常见的 UI 模式提取为可重用的布局。 为了获得最佳性能&#xff0c;在使用时&#xff0c;放置在此目录中的组件将通过异步导入自动加载。 layouts layouts文件夹存放的是ui布局文件&#xff0c;就是实现一个页面整体架构规则的…