当前位置: 首页 > news >正文

CANoe编程实例--TCP/IP通信

1、简介

本实例将使用目前常用的开发工具C#来开发服务器端,以CANoe端作为客户端。服务器端和客户端,通过TCP/IP连接,实现数据交换。
首先在服务器端建立一个监听Socket,自动创建一个监听线程,随时监听是否有客户端的连接。它只起到监听作用,当监听线程监听到客户端请求时,监听线程就调用Socket上的消息响应函数OnAccept,接收客户端的连接请求。服务器为每一个客户端请求建立一个Socket,以便并行建立消息响应,服务器端为了接收数据,必须为客户端建立消息响应函数OnReceive,用于接收数据。客户端为了接收服务器端的数据,需要在连接的Socket上建立一个消息响应函数OnReceive,用来接收数据。

2、C# TCP/IP服务器端开发

      在Visual Studio 开发环境中利用C#开发一个TCP/IP服务器端程序。

2.1、新建工程

       在Visual Studio 开发环境中,单击“文件”→“新建”→“项目”进入“新建项目”对话框。在Visual C#下面选择模板“Windows窗体应用程序”新建一个工程,并将项目命名为TCP_Demo,如图所示。

2.2、界面设计

2.2.1、控件属性列表

2.2.2、最终界面

2.3、C#代码实现

      由于程序需要使用多线程监听客户端是否接入,以及接收客户端的数据,本程序除了要添加System.NET.Sockets外,还要需要添加System.Threading。以下为C#完整代码。

using System;
using System.Windows.Forms;
using System.Net;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.ComponentModel;namespace TCP_Demo
{public partial class Form1 : Form{//定义一个TcpClient类static TcpClient client = null;         //定义一个NetworkStream类, 用于网络访问的基础流的数据操作static NetworkStream stream = null;//定义一个TcpServer类TcpListener server = null;//线程用于实时监测client是否接入,以及是否数据传过来public Thread SocketWatch; delegate void SetTextCallback(string text);//0 - 断开状态; 1- 尝试连接中; 2- 已连接;3- 尝试断开中;public int socket_status = 0;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//获取本地计算机的主机名string name = Dns.GetHostName();//获取本地计算机的Internet协议(IP)地址IPAddress[] ipadrlist = Dns.GetHostAddresses(name); foreach (IPAddress ipa in ipadrlist){//检索IPv4的IP地址if (ipa.AddressFamily == AddressFamily.InterNetwork){lstShow.Items.Add("检索到主机的IP地址:" + ipa.ToString());//将第一个有效的IPv4地址作为服务器地址if (txtServerIP.Text == "") txtServerIP.Text = ipa.ToString();}}btnSend.Enabled = false;btnEnd.Enabled = false;}private void btnStart_Click(object sender, EventArgs e){btnStart.Enabled = false;int port = Convert.ToInt32(txtServerPort.Text);IPAddress IP = System.Net.IPAddress.Parse(txtServerIP.Text);IPEndPoint p = new IPEndPoint(IP, port);server = new TcpListener(p);server.Start();lstShow.Items.Add("服务器已启动!");lstShow.Items.Add("等待客户端连接....");Update();socket_status = 1; //等待client接入//开启新的线程,用于监控client接入和数据接收this.SocketWatch = new Thread(new ThreadStart(this.SocketTask));this.SocketWatch.Start();btnSend.Enabled = true;btnEnd.Enabled = true;}private void btnSend_Click(object sender, EventArgs e){byte[] sendmsg = new byte[512]; //定义发送的Byte数组int i = 0;//Encode转换为UTF8byte[] msg = Encoding.UTF8.GetBytes(txtSend.Text);for (i = 0; i < msg.Length;i++ ){sendmsg[i] = msg[i];}//CANoe根据最后字符是否为'\0'来判断接收的字符串长度sendmsg[msg.Length] = 0x00; stream = client.GetStream();stream.Write(sendmsg, 0, sendmsg.Length);lstShow.Items.Add("发送数据成功!");}private void btnEnd_Click(object sender, EventArgs e){if (this.SocketWatch != null) this.SocketWatch.Abort();if (stream != null) stream.Close();if (client != null) client.Close();if (server != null) server.Stop();socket_status = 0;btnStart.Enabled = true;btnSend.Enabled = false;btnEnd.Enabled = false;}//用于实时监测client是否接入,以及是否数据传过来public void SocketTask(){while (true){if (socket_status==1){//接受挂起的连接请求。client = server.AcceptTcpClient(); socket_status = 2;}Byte[] bytes = new Byte[256];//返回用于发送和接收数据的NetworkStreamstream = client.GetStream(); try{stream.Read(bytes, 0, bytes.Length);//从读取Stream数据//按照UTF8的编码方式得到字符串string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);if (bytes[0] != '\0') // 如果数据是有效的{this.SetText(data);//数据传递给主线程}}catch (System.IO.IOException){if (client.Connected == true){client.Close(); //释放此TcpClient实例stream.Close(); //关闭当前流并释放与之关联的所有资源}socket_status = 3;break;}}}private void SetText(string text){// InvokeRequired required compares the thread ID of the// calling thread to the thread ID of the creating thread.// If these threads are different, it returns true.if (this.txtReceive.InvokeRequired){SetTextCallback d = new SetTextCallback(SetText);this.Invoke(d, new object[] { text });}else{this.txtReceive.Text = text;lstShow.Items.Add("接收到数据:" + text);}}private void timer1_Tick(object sender, EventArgs e){//处理界面的更新Socket s;if (client != null){if (socket_status ==3) //尝试断开中{server.Stop();lstShow.Items.Add("客户端已断开!");txtClientIP.Text = "";txtClientPort.Text = "";btnStart.Enabled = true;btnSend.Enabled = false;btnEnd.Enabled = false;client = null;socket_status = 0;}else{if (txtClientIP.Text == ""){lstShow.Items.Add("客户端已连接!");s = client.Client;//显示远程客户端IP和Port端口txtClientIP.Text = s.RemoteEndPoint.ToString().Split(':')[0];txtClientPort.Text = s.RemoteEndPoint.ToString().Split(':')[1];}}}}}}

3、CANoe TCP/IP客户端开发

       对于CANoe客户端的演示,本实例力求简单,同时突出TCP/IP的通信功能,在实例设计中只使用一个网络节点和一个面板。面板主要用于演示与TCP/IP服务器端的数据发送与接收。当然,读者可以将这单一功能移植到自己的仿真工程中,将服务器端传过来的字符串信息根据项目需要与仿真工程的系统变量、环境变量、信号、报文等关联起来。服务器端也可以将CANoe发送字符进行解析。这种通过TCP/IP来远程监控CANoe运行的解决方案,可以广泛应用于日常的项目中。

3.1、创建仿真工程

        在CANoe界面选择File→New,在可选的模板中选择CAN 500kBaud1ch(波特率为500kBaud,1通道)。在Simulation Setup窗口中添加一个网络节点为TcpClient,如图所示,并将其CAPL程序设定为TcpClient.can。

3.2、新建系统变量

         为了与面板上的控件关联,方便数据的传递和处理,本实例需要创建表中所列出的系统变量。

3.3、Panel设计

3.3.1、Panel属性列表

       与C#.NET程序的用户界面类似,在CANoe端也需要设计一个客户界面来与TCP/IP服务器端通信。下表为TCP/IP客户端面板的控件列表及属性设定,可以根据此列表来创建一个面板。

3.3.2、Panel最终界面

3.4、CAPL实现

       TCP/IP的CAPL实现主要通过调用CANoe提供的相关CAPL函数。为了方便调用CAPL的Socket接口,Vector提供了一个IPCommon.can头文件。

3.4.1、头文件

/*@!Encoding:1252*/
variables
{const long  INVALID_SOCKET =    ~0;const long  WSA_IO_PENDING =   997;const long  WSAEWOULDBLOCK = 10035;const dword INVALID_IP     = 0xffffffff;dword       gIpAddress           = INVALID_IP;char        gIpLastErrStr[1024]  = "";char        gIpAddressStr[32]    = "";int         gIpLastErr           = 0;dword       gUdpPort      = 0;long        gUdpSocket    = INVALID_SOCKET;char        gUdpRxBuffer[4096];dword       gTcpPort          = 0;long        gTcpSocket        = INVALID_SOCKET;long        gTcpDataSocket    = INVALID_SOCKET;char        gTcpRxBuffer[8192];// statusint         gStatus = 0;const int   gkSTATUS_UNINITIALISED = 0;const int   gkSTATUS_INITIALISED   = 1;
}long UdpRecv( dword socket)
{int result = 0;result = UdpReceiveFrom( socket, gUdpRxBuffer, elcount( gUdpRxBuffer));if ( 0 != result){gIpLastErr = IpGetLastSocketError( socket);if ( WSA_IO_PENDING != gIpLastErr){IpGetLastSocketErrorAsString( socket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "UdpReceive error (%d): %s", gIpLastErr, gIpLastErrStr);}}return result;
}long TcpRecv( dword socket)
{int result = 0;result = TcpReceive( socket, gTcpRxBuffer,elcount( gTcpRxBuffer));if ( 0 != result){gIpLastErr = IpGetLastSocketError( socket);if ( WSA_IO_PENDING != gIpLastErr){IpGetLastSocketErrorAsString( socket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "TcpReceive error (%d): %s", gIpLastErr, gIpLastErrStr);}}return result;
}

3.4.2、主程序

       在TcpClient.can中,CANoe作为客户端实现检索本机IP,并处理TCP/IP的连接、数据发送、数据接收及连接断开等操作。

/*@!Encoding:1252*/
includes
{#include "IPCommon.can"
}variables
{
}void SetupIp()
{int   adapterIndex = 1;char  text[512] = "";char  info[512] = "";int   size = 512;long  result = 0;dword addresses[1];writeClear(0);if (1 > IpGetAdapterCount()){writelineex(0, 3, "Error: There is no network interface available!");stop();}IpGetAdapterDescription(adapterIndex, text, size);if (0 != IpGetAdapterAddress(adapterIndex, addresses, 1)){//try to check the 2nd interfaceadapterIndex ++;if (0 != IpGetAdapterAddress(adapterIndex, addresses, 1)){writelineex(0, 3, "Error: Could not retrieve ip address!");stop();}}gIpAddress = addresses[0]; // the interface usedif (INVALID_IP == gIpAddress){writelineex(0, 3, "Error: ip address to be used is invalid!");stop();}IpGetAdapterDescription(adapterIndex, text, size);snprintf(info, size, "Interface: %s", text);writelineex(0, 1, info);IpGetAdapterAddressAsString(adapterIndex, text, size);snprintf(info, size, "Ip address: %s", text);writelineex(0, 1, info);SysSetVariableString(sysvar::TCPIP::TcpClientIp, text);IpGetAdapterMaskAsString(adapterIndex, text, size);snprintf(info, size, "Subnet mask: %s", text);writelineex(0, 1, info);IpGetAdapterGatewayAsString(adapterIndex, text, size);snprintf(info, size, "Gateway address: %s", text);writelineex(0, 1, info);@TCPIP::TcpClientPort=6566;@TCPIP::TcpServerPort =6565;gStatus = gkSTATUS_INITIALISED;
}on start
{SetupIp();  
}on stopMeasurement
{ResetIp();
}void OnTcpReceive( dword socket, long result, dword address, dword port, char buffer[], dword size)
{char  addressString[64] = "";if ( gTcpDataSocket != socket){writelineex(0, 2, "OnTcpReceive called for unknown socket 0x%X", socket);return;}if (0 != result){IpGetLastSocketErrorAsString( socket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "OnTcpReceive error (%d): %s", IpGetLastSocketError( socket), gIpLastErrStr);return;}IpGetAddressAsString(address, addressString, elcount(addressString));SysSetVariableString(sysvar::TCPIP::TcpData, buffer);TcpRecv( socket);
}void OnTcpSend( dword socket, long result, char buffer[], dword size)
{if ( gTcpDataSocket != socket){writelineex(0, 2, "OnTcpSend called for unknown socket 0x%X", socket);}if (0 != result){IpGetLastSocketErrorAsString( socket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "OnTcpSend error (%d): %s", IpGetLastSocketError( socket), gIpLastErrStr);}
}void ConnectTcp()
{ char buffer[64];dword serverIp;SysGetVariableString(sysvar::TCPIP::TcpServerIp, buffer, elcount(buffer));serverIp = IpGetAddressAsNumber(buffer);if (INVALID_IP == serverIp){writelineex(0, 1, "Error: invalid server Ip address!");return;}gTcpPort = @sysvar::TCPIP::TcpClientPort;gTcpDataSocket = TcpOpen(gIpAddress, gTcpPort);if ( INVALID_SOCKET == gTcpDataSocket){writelineex(0, 1, "Error: could not open Tcp socket!");return;}else{writelineex(0, 1, "Tcp socket opened.");}if (0 == TcpConnect(gTcpDataSocket, serverIp, @sysvar::TCPIP::TcpServerPort)){writelineex(0, 1, "Successfully connected to server %s:%d", buffer, @sysvar::TCPIP::TcpServerPort);TcpRecv( gTcpDataSocket);}
}void DisconnectTcp()
{if (INVALID_SOCKET != gTcpDataSocket){TcpClose(gTcpDataSocket);gTcpDataSocket = INVALID_SOCKET;}writelineex(0, 1, "Tcp socket is closed.");
}void SendTcpData()
{char buffer[8192];SysGetVariableString(sysvar::TCPIP::TcpClientData, buffer, elcount(buffer));if (INVALID_SOCKET == gTcpDataSocket){writelineex( 0, 2, "Tcp socket is invalid!");return;}if (0 != TcpSend( gTcpDataSocket, buffer, elcount(buffer))){gIpLastErr = IpGetLastSocketError( gTcpDataSocket);if ( WSA_IO_PENDING != gIpLastErr){IpGetLastSocketErrorAsString( gTcpDataSocket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "Tcp send error (%d): %s", gIpLastErr, gIpLastErrStr);}}else{writelineex( 0, 1, "Tcp data sent successfully!");}
}
void ResetIp()
{if (INVALID_SOCKET != gTcpDataSocket){TcpClose(gTcpDataSocket);gTcpDataSocket = INVALID_SOCKET;}if (INVALID_SOCKET != gUdpSocket){UdpClose(gUdpSocket);gUdpSocket = INVALID_SOCKET;}}void OnTcpConnect( dword socket, long result)
{if ( gTcpDataSocket != socket){writelineex(0, 2, "OnTcpConnect called for unknown socket 0x%X", socket);return;}if (0 != result){IpGetLastSocketErrorAsString( socket, gIpLastErrStr, elcount( gIpLastErrStr));writelineex( 0, 2, "OnTcpConnect error (%d): %s", IpGetLastSocketError( socket), gIpLastErrStr);return;}else{writelineex(0, 1, "Successfully connected to server via Tcp");TcpRecv( socket);}
}on sysvar_update sysvar::TCPIP::TcpConnect
{if (@this){ConnectTcp();}
}on sysvar_update sysvar::TCPIP::TcpDisconnect
{if (@this){DisconnectTcp();}
}on sysvar_update sysvar::TCPIP::TcpSend
{if (@this){SendTcpData();}
}

4、运行测试

       先运行TCP/IP服务器端应用,服务器的IP地址为本机的IP地址,端口6565是程序的默认端口,也可以输入一个其他的端口号。单击“开始”按钮,服务器端应用将进入接入监听状态。

        这时运行CANoe的Tcp_Client仿真工程,Client Panel的客户端IP地址也将自动设置为本机的IP地址,端口6566为默认端口,读者也可修改该端口号。在服务器IP地址栏和端口栏可以输入对应的服务器IP和端口。单击Connect to server按钮,服务器端将收到接入请求,这时服务器端将显示来自客户端的IP信息和端口号。成功连接以后,服务器端和客户端之间可以相互发送信息。

        作为演示,可以允许服务器端应用和CANoe仿真工程运行在同一台计算机上,图为同一台计算机上演示TCP服务器端与客户端之间通信的效果图。

       这里需要指出的是,为了演示方便,CANoe例程中采用自动识别IP地址,如果使用的计算机上有多个网络接口或蓝牙接口,建议在测试过程中将没有使用到的硬件禁掉,否则CANoe可能无法找到有效的IP地址。当然,也可以修改CANoe端的代码,去除自动识别本机IP地址的功能。

相关文章:

CANoe编程实例--TCP/IP通信

1、简介 本实例将使用目前常用的开发工具C#来开发服务器端&#xff0c;以CANoe端作为客户端。服务器端和客户端&#xff0c;通过TCP/IP连接&#xff0c;实现数据交换。 首先在服务器端建立一个监听Socket&#xff0c;自动创建一个监听线程&#xff0c;随时监听是否有客户端的连…...

Neuron协议网关的北向应用插件开发

目录 概述 指令处理层开发​ 应用层开发​ .open​ .close​ .init​ .uninit​ .start​ .stop​ .setting​ .request​ 插件设置文件​ 适配华为的思路 概述 最近研究了一段时间的Neuron协议网关&#xff0c;前面的博文也提到它虽然能够把数据发到华为的IoT平台上…...

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…...

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…...

controller层-请求格式为json-请求方法为get

前置条件 get请求映射&#xff0c;内容和PostMapping一致&#xff0c;需要请求参数更换为get数据 请求过程&#xff1a;用户请求--初始化DispatcherServlet及对接和分发用户请求--controller--service 用户请求&#xff1a;http://ip:port/user/getinfo 请求方法&#xff1a;ge…...

【Linux】网络通信基础:应用层协议、HTTP、序列化与会话管理

文章目录 前言1. 应用层自定义协议与序列化1.1 什么是应用层&#xff1f;1.2 再谈 "协议"1.3 序列化 和 反序列化 2. HTTP 协议3. 认识 URL(统一资源定位符)4. urlencode和urldecode5. HTTP 协议请求与响应格式5.1 HTTP 请求5.2 HTTP 响应 6. HTTP 的方法6.1 GET 方法…...

@NotNull、@NotEmpty 和 @NotBlank 区别

NotNull、NotEmpty 和 NotBlank 是 Java Bean Validation (JSR 380) 规范中定义的注解&#xff0c;通常用于验证对象的属性是否满足特定的条件。这些注解常用于后端验证&#xff0c;确保接收到的数据符合预期。 NotNull 用途&#xff1a;验证一个对象是否不为null。 注意&#…...

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…...

在 Qt 中获取 MouseMove 事件

在编写 Qt 程序时&#xff0c;我希望在鼠标移动时&#xff08;即使鼠标在另一个窗口上&#xff09;能够调用 mouseMoveEvent(QMouseEvent* event) 方法。目前&#xff0c;在我的 mainwindow.cpp 文件中&#xff0c;我有如下代码&#xff1a; void MainWindow::mouseMoveEvent(…...

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…...

如何为WordPress网站设置多语言站点

随着全球化的发展&#xff0c;拥有一个支持多语言的站点已成为提升用户体验、扩大受众范围的重要手段。本文将详细介绍如何为WordPress网站设置多语言站点&#xff0c;提供两种最佳方案详解&#xff0c;帮助您轻松实现多语言站点的搭建与管理。无论您是选择在同一站点内发布多语…...

【RHCE】综合真机实验(shell完成)

目录 题目&#xff1a; 需求描述 实操 一、服务端&#xff08;servera&#xff09; 1.ip配置 2.更改主机名 3.创建本地仓库 4.DNS服务 1.下载软件包和防火墙允许 2.配置主配置文件 3.配置区域文件 1.named.exam 2.named.fangxiang 4.重启服务 5.验证结果&#x…...

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&a…...

苹果笔记本电脑如何优化系统 苹果电脑系统优化软件哪个好 cleanmymac x怎么用

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。但别担心&#xff0c;优化你的Mac系统比做早餐还简单。本文将用一种轻松的风格向你介绍7种简单易…...

Vue数组操作之sort详解

在 Vue.js 中&#xff0c;sort() 方法用于对数组进行排序。它会改变原数组&#xff0c;并返回排序后的数组。默认情况下&#xff0c;sort() 方法按照字母顺序&#xff08;Unicode 编码顺序&#xff09;对数组中的元素进行排序。如果需要按照其他规则排序&#xff0c;可以传递一…...

解决 Android 应用安装错误:INSTALL_FAILED_BAD_PERMISSION_GROUP

解决 Android 应用安装错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP 在开发 Android 应用时&#xff0c;我们有时会遇到安装错误。这篇文章将讨论一种常见的错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP&#xff0c;并介绍解决方法。 问题描述 在尝试安装…...

浅谈断言之JSON断言

浅谈断言之JSON断言 JSON断言是Apache JMeter中一个非常实用的功能&#xff0c;它允许用户验证HTTP响应中的JSON数据是否符合预期。这对于API测试尤为重要&#xff0c;因为JSON&#xff08;JavaScript Object Notation&#xff09;是Web服务间通信的常用数据格式。通过精确地检…...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(四)-无人机认证与授权

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…...

1万+台网络设备运维如何选择支撑工具?

针对1万台网络设备的运维管理&#xff0c;需要采取一套系统化、自动化且高效的管理方法与策略。“工欲善其事&#xff0c;必先利其器”&#xff0c;以下结合一些关键步骤探讨运维支撑软件工具的方案。 1 建立完善的设备档案 设备信息记录&#xff1a; 为每台设备建立详细的…...

Spring Boot集成Spring Batch快速入门Demo

1.什么是Spring Batch&#xff1f; Spring Batch 是一个轻量级的开源框架&#xff0c;它提供了一种简单的方式来处理大量的数据。它基于Spring框架&#xff0c;提供了一套批处理框架&#xff0c;可以处理各种类型的批处理任务&#xff0c;如ETL、数据导入/导出、报表生成等。S…...

Linux 文件系统

在 Linux 中&#xff0c;所有的文件都是从根目录开始的&#xff0c;且所有的设备都是文件。例如&#xff0c;一块硬盘是一个文件&#xff0c;这块硬盘上的分区也是一个文件&#xff0c;声卡也是一个文件。 这种表示设备的文件叫做设备文件。设备文件一般来说是保存在/dev这个目…...

47、PHP实现机器人的运动范围

题目&#xff1a; PHP 实现机器人的运动范围 描述&#xff1a; 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格&#xff0c;但是不能进入行坐标和列坐标的数位之和大于k…...

Linux第四节课(指令与权限)

1、date指令(时间) 程序运行到自己的每一个关键时刻&#xff0c;都要自己打日志&#xff01; 日志包括时间、日志等级、日志具体信息、其他信息等&#xff0c;然后按照行为单位写入文件中&#xff0c;这个文件被称为日志文件&#xff01; 在日志文件中筛选信息时&#xff0c…...

扫雷-C语言

一、前言&#xff1a; 众所周知&#xff0c;扫雷是一款大众类的益智小游戏&#xff0c;它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 今天&#xff0c;我们的目的就是通过C语言来实现一个简…...

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…...

接口测试基础

一、认识接口测试 接口测试 接口&#xff1a;系统之间数据交互的通道。 硬件接口 软件接口 接口测试&#xff1a;基于不同的输入参数&#xff0c;校验接口响应数据与预期数据是否一致。 为什么要学接口测试? 提前介入测试、尽早发现问题 中级测试工程师必备技能 接口测试学…...

为什么 from . import * 不会导入子模块

为什么 from . import * 不会导入子模块 在 Python 中&#xff0c;from . import * 并不会自动导入子模块。这是因为 import * 的行为是由模块的 __all__ 变量决定的。如果没有定义 __all__&#xff0c;它只会导入当前模块中定义的顶层变量和函数&#xff0c;而不会递归地导入…...

LangGPT结构化提示词编写实践

langGPT提示词 # Role: 浮点数比较助手 ## Profile - author: LangGPT - version: 1.0 - language: 中文 - description: 一个专门帮助用户进行浮点数比较的助手&#xff0c;确保LLM能够准确识别和对比浮点数。## Skills 1. 理解浮点数的结构和数值意义。 2. 精…...

React: class 和 style

一、class 1、在react中使用className属性来绑定类名 <div className"header flex-middle-middle">添加2个类名 </div>2、动态添加类名 <div className{item ${nameactive ? active : }}>动态添加active类名 </div>二、style 1、react中…...

【数据结构】包装类、初识泛型

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…...

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…...

细说MCU用DMA改变DAC输出信号频率和改善输出波形质量的方法

目录 一、参考硬件 二、修改定时器参数改变输出波形频率 三、改善波形质量 四、代码修改 五、查看结果 一、参考硬件 本项目的软件硬件工程参考作者的其他文章&#xff1a;细说MCU用DMA实现DAC输出的方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/14065…...

Java高级面试题

文章目录 Java高级特性Java 8 中的新特性有哪些&#xff1f;Lambda 表达式的用途是什么&#xff1f;Stream API 的工作原理是什么&#xff1f;Optional 类的作用是什么&#xff1f;什么是函数式接口&#xff1f;Java 9 之后的新特性有哪些&#xff1f; 并发编程Java中的线程池是…...

USART串口理论知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 USART串口理论知识总结 1、通讯的串行和并行1.串口采用发送数据代码并用printf重代码 1、通讯的串行和并行 1.串口采用发送数据代码并用printf重代码 #include <stdint.h…...

基于 HTML+ECharts 实现智慧景区数据可视化大屏(含源码)

构建智慧景区数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着旅游业的蓬勃发展&#xff0c;智慧景区的概念逐渐深入人心。通过数据可视化&#xff0c;景区管理者可以实时监控游客流量、设施使用情况以及环境状况&#xff0c;从而提升游客体验和管理效率。本文将详…...

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统&#xff0c;都是用的antdelement&#xff0c;table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果&#xff1a; antv——table组件一次只支持一个参数的排序 如下图&#xff1a; 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…...

SQL

SQL全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。 SQL通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的…...

maven archetype

1.简介 maven脚手架是为了创建一个项目模板&#xff0c;以后新建项目都能够复用该模板 maven中模板引擎使用的是velocity,在文件中可以使用它的语法获取变量等操作 2.实现 单模块脚手架实现 pom.xml <?xml version"1.0" encoding"UTF-8"?> &…...

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…...

微信小程序-使用Component方法代替Page方法构造页面

一.使用Component方法的前提条件 在小程序js文件里使用Component方法代替Page方法需要在json文件里面定义usingComponents属性 {"usingComponents": {} }二.注意事项 1.在page页面里使用的钩子函数和事件监听方法都需要写在methods对象里面 methods:{update(){thi…...

Spark SQL----DISTRIBUTE BY子句

Spark SQL----DISTRIBUTE BY子句 一、描述二、语法三、参数四、例子 一、描述 DISTRIBUTE BY子句用于根据输入表达式对数据进行重新分区。与CLUSTER BY子句不同&#xff0c;这不会对每个分区内的数据进行排序。 二、语法 DISTRIBUTE BY { expression [ , ... ] }三、参数 e…...

HTML5-canvas1

1、canvas&#xff1a;创建画布 <canvas id"canvas"></canvas>2、画一条直线 var canvasdocument.getElementById(cancas&#xff09;; canvas.width800; canvas.height800; var contextcanvas.getContext(2d); //获得2d绘图上下文环境 //画一条直线 c…...

【NOI-题解】1009 - 数组逆序1162 - 数组元素的删除1211 - 数组元素的插入1161. 元素插入有序数组1159. 数组元素的移动

文章目录 一、前言二、问题问题&#xff1a;1009 - 数组逆序问题&#xff1a;1162 - 数组元素的删除问题&#xff1a;1211 - 数组元素的插入问题&#xff1a;1161. 元素插入有序数组问题&#xff1a;1159. 数组元素的移动 三、感谢 一、前言 本章节主要对数组问题中数组元素移…...

新电脑如何设置 npm 源及查看源、安装 cnpm、pnpm 和 yarn 的详细教程

当你获得一台新电脑&#xff0c;或需要在现有电脑上优化 JavaScript 和 Node.js 的开发环境时&#xff0c;正确配置 npm 是一步不可少的过程。本教程将详细指导你如何设置 npm 源&#xff0c;查看当前源&#xff0c;以及如何安装 cnpm、pnpm 和 yarn。 1. 设置 npm 源 npm (N…...

完全移动huggingface模型仓库(不是简单mv)

Linux中移动huggingface模型仓库 参考链接 先在bashrc中配置&#xff1a; export HF_DATASETS_CACHE"/your/path/dataset" export HF_HOME"/your/path/" export HUGGINGFACE_HUB_CACHE"/your/path/hub" export TRANSFORMERS_CACHE"/your…...

手机空号过滤批量查询的意义及方法

手机空号过滤批量查询是现代营销和通信管理中常用的技术手段&#xff0c;旨在通过批量处理手机号码&#xff0c;筛选出活跃号码和空号等无效号码&#xff0c;以提高营销效率和减少不必要的通信成本。以下是关于手机空号过滤批量查询的详细解答&#xff1a; 一、手机空号过滤批…...

Dockerfile制作部署wordpress-6.6

目录 一. 环境准备 二. 准备对应的配置文件 三. 编写Dockerfile 四. 构建镜像 五. 配置MySQL 六. 安装wordpress 七. 扩展 一. 环境准备 localhost192.168.226.25 rocky_linux9.4 Docker version 27.0.3 关闭防火墙和selinux&#xff0c;进行时间同步。 安装docker…...

项目的纪要

ai客服项目中发现的问题: 可以在控制台看到我们存储的cookie: 可以看到是这样的, 但是我们通过getCookie方法专门获取这个字段, 然后在控制台打印后 const userName getCookie(SA_USER_NICK_NAME); console.log(userName, userName); 输出结果是: 然后我们尝试通过de…...

ubuntu 更新源

前言 实现一键替换在线源 一键更新源 ubuntu 全球镜像站以下支持现有ubuntu 20&#xff0c;22&#xff0c;24 echo "Delete the default source" rm -rf /etc/apt/sources.listecho "Build a new source" cat <<EOF>>/etc/apt/sources.li…...

XGBoost、RF随机森林算法MATLAB实现

% 加载并预处理训练数据 opts1 = detectImportOptions(附件一AE.xlsx, PreserveVariableNames, true); train_data = readtable(附件一AE.xlsx, opts1); train_data.Time = datetime(train_data.time, InputFormat, yyyy-MM-dd HH:mm:ss); % 特征提取和标签准备 windowSize…...