【Python】基于socket函数的TCP通信

基于socket函数的TCP通信

  • 1 引言
    • 1.1 通信协议函数(客户端)
    • 1.2 通信协议函数(服务端)
  • 2 传输文件(以txt文件为例)
    • 2.1 发送端(客户端)
    • 2.2 接受端(服务端)
  • 3 传输图片(基于OpenCV)
    • 3.1 发送端(客户端)
    • 3.2 接受端(服务端)
  • 4 传输视频帧(以默认摄像头为例)
    • 4.1 发送端
    • 4.2 接收端
  • 5 应用实例
    • 5.1 客户端
    • 5.2 服务端

1 引言

TCP协议,传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。
参考链接:
🔗Python struct.pack用法介绍
🔗OpenCV实现图像网络传输的基本步骤

1.1 通信协议函数(客户端)

def TCPClient(host,port):  # 通信协议函数(客户端)"""发送文件(也可以发送图片,但是比较慢)"""time_now = time.strftime("%Y-%m-%d %H:%M:%S")# 1.创建一个客户端的socket对象:AF_INET表示IPv4地址、SOCK_STREAM表示使用TCP协议进行通信tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 2.设置要连接的服务端的ip和端口tcpclient.connect((host, port))print('%s 服务器已连接'%time_now)return tcpclientexcept:print('服务器连接失败,请修改后重新运行!!')exit(0)

1.2 通信协议函数(服务端)

def TCPSever(host,port):  # 通信协议函数(服务端)time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))# 1.创建一个客户端的socket对象tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP# 2.绑定端口:tcpserver.bind((host,port))print("%s 服务端已开启" % time_now)return tcpserver

2 传输文件(以txt文件为例)

2.1 发送端(客户端)

def SendFile(tcpclient, file):"""发送文件(也可以发送图片,但是比较慢)"""fhead = struct.pack(b'128sq', bytes(os.path.basename(file), encoding='utf-8'),os.stat(file).st_size)  # 将图片路径和大小打包成一个二进制字符串tcpclient.send(fhead)fp = open(file, 'rb')  # 打开要传输的文件(二进制只读模式)while True:data = fp.read(1024)  # 读入图片数据(每次读取1KB)if not data:print('{0} send over...'.format(file))breaktcpclient.send(data)  # 以二进制格式发送文件数据============================================>

2.2 接受端(服务端)

def ReceiveFile(tcpserver):"""循环接收文件"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128sq')print(fileinfo_size)buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename, filesize = struct.unpack('128sq', buf)  # 解包recvd_size = 0save_name = filename.decode().strip('\x00')  # 文件名解码print(f"文件名:{save_name}")fp = open(save_name, 'wb')while not recvd_size == filesize:if filesize - recvd_size > 1024:data = sock.recv(1024)recvd_size += len(data)else:data = sock.recv(1024)recvd_size = filesizefp.write(data)  # 写入文件数据fp.close()print("-" * 5 + "接收完成" + "-" * 5)sock.close()break

3 传输图片(基于OpenCV)

3.1 发送端(客户端)

def SendImgArray(tcpclient,file):"""发送图片(OpenCV读取的图像数组)"""img = cv2.imread(file)# 图片编码params = [cv2.IMWRITE_JPEG_QUALITY, 100]  # 指定JPEG的图像质量,100(最高质量)img_encode = cv2.imencode('.jpg', img, params)[1]data_encode = np.array(img_encode)data = data_encode.tobytes()len_data = len(data)fhead = struct.pack(b'128siiiiq',bytes(os.path.basename(file), encoding='utf-8'),1263,627,1459,1073,len_data)  # 将图片路径和大小打包成一个二进制字符串# 3.发送数据tcpclient.send(fhead)tcpclient.send(data)  # 发送图片============================================================>

3.2 接受端(服务端)

def ReceiveImg(tcpserver):"""循环接收图片"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128siiiiq')buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename,x1,y1,x2,y2,filesize = struct.unpack('128siiiiq', buf)  # 解包save_name = filename.decode().strip('\x00')  # 文件名解码print(f"图片名称:{save_name}")print(f"目标检测坐标:{x1,y1,x2,y2}")  # 附加信息,可以自定义data = b''while len(data)<filesize:data += sock.recv(1024)img_decode = cv2.imdecode(np.frombuffer(data, dtype=np.uint8), cv2.IMREAD_COLOR)# 显示图像cv2.imshow('Image', img_decode)cv2.waitKey(500)  # 显示时长根据传输的速度自定义# 保存图像cv2.imwrite(save_name,img_decode)print("-" * 5 + "接收完成" + "-" * 5)cv2.destroyAllWindows()break

4 传输视频帧(以默认摄像头为例)

4.1 发送端

def SendFrame(host, port,add=0):  # 仅传视频cap = cv2.VideoCapture(add)  # 生成读取摄像头对象# 定义视频对象输出# width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度# height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度# fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率# fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 视频的编码# writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))while cap.isOpened():tcpclient = TCPClient(host, port)ret, frame = cap.read()  # 读取摄像头画面hm = int(round(time.time() * 1000))frame_now = datetime.datetime.fromtimestamp(hm/1000).strftime("%Y%m%d%H%M%S%f")# 图像压缩frame = cv2.resize(frame, (192, 108))# 图像编码params = [cv2.IMWRITE_JPEG_QUALITY, 100]  # ratio:0~100frame_encode = cv2.imencode('.jpg', frame, params)[1]  # 图像编码frame_encode = np.array(frame_encode)frame_encode = frame_encode.tobytes()# 3.发送数据len_data = len(frame_encode)fhead = struct.pack(b'128sq',bytes(frame_now, encoding='utf-8'),len_data)  # 将图片路径和大小打包成一个二进制字符串# 3.发送数据tcpclient.send(fhead)tcpclient.send(frame_encode)  # 发送图片============================================================# 显示画面cv2.imshow('Map', frame)key = cv2.waitKey(24)# writer.write(frame)  #视频保存# 按Q退出if key == ord('q'):breakcap.release()  # 释放摄像头cv2.destroyAllWindows()  # 释放所有显示图像窗口

4.2 接收端

def ReceiveFrame(tcpserver):"""循环接收视频帧"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128sq')buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename,filesize = struct.unpack('128sq', buf)  # 解包save_name = filename.decode().strip('\x00')  # 文件名解码print(f"图片名称:{save_name}")data = b''while len(data)<filesize:data += sock.recv(1024)img_decode = cv2.imdecode(np.frombuffer(data, dtype=np.uint8), cv2.IMREAD_COLOR)# 显示图像cv2.imshow('Image', img_decode)cv2.waitKey(500)  # 显示时长根据传输的速度自定义# 保存图像# cv2.imwrite(save_name,img_decode)print("-" * 5 + "接收完成" + "-" * 5)cv2.destroyAllWindows()break

5 应用实例

完整代码如下:

5.1 客户端

# -*- coding: utf-8 -*-
"""
2023.12.28
author:alian
function
发送端:车载服务器
1.传输文件
2.传输图片
3.传输视频帧
"""
import os.path
import socket
import cv2
import numpy as np
import time
import struct
import glob
import datetimedef TCPClient(host,port):  # 通信协议函数(客户端)"""发送文件(也可以发送图片,但是比较慢)"""time_now = time.strftime("%Y-%m-%d %H:%M:%S")# 1.创建一个客户端的socket对象:AF_INET表示IPv4地址、SOCK_STREAM表示使用TCP协议进行通信tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 2.设置要连接的服务端的ip和端口tcpclient.connect((host, port))print('%s 服务器已连接'%time_now)return tcpclientexcept:print('服务器连接失败,请修改后重新运行!!')exit(0)def SendFile(tcpclient, file):"""发送文件(也可以发送图片,但是比较慢)"""fhead = struct.pack(b'128sq', bytes(os.path.basename(file), encoding='utf-8'),os.stat(file).st_size)  # 将图片路径和大小打包成一个二进制字符串tcpclient.send(fhead)fp = open(file, 'rb')  # 打开要传输的文件(二进制只读模式)while True:data = fp.read(1024)  # 读入图片数据(每次读取1KB)if not data:print('{0} send over...'.format(file))breaktcpclient.send(data)  # 以二进制格式发送文件数据============================================># 4.关闭客户端tcpclient.close()def SendImgArray(tcpclient,file):"""发送图片(OpenCV读取的图像数组)"""img = cv2.imread(file)# 图片编码params = [cv2.IMWRITE_JPEG_QUALITY, 100]  # 指定JPEG的图像质量,100(最高质量)img_encode = cv2.imencode('.jpg', img, params)[1]data_encode = np.array(img_encode)data = data_encode.tobytes()len_data = len(data)fhead = struct.pack(b'128siiiiq',bytes(os.path.basename(file), encoding='utf-8'),1263,627,1459,1073,len_data)  # 将图片路径和大小打包成一个二进制字符串# 3.发送数据tcpclient.send(fhead)tcpclient.send(data)  # 发送图片============================================================># 4.关闭客户端tcpclient.close()def SendFrame(host, port,add=0):  # 仅传视频cap = cv2.VideoCapture(add)  # 生成读取摄像头对象# 定义视频对象输出# width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频的宽度# height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取视频的高度# fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率# fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))  # 视频的编码# writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))while cap.isOpened():tcpclient = TCPClient(host, port)ret, frame = cap.read()  # 读取摄像头画面hm = int(round(time.time() * 1000))frame_now = datetime.datetime.fromtimestamp(hm/1000).strftime("%Y%m%d%H%M%S%f")# 图像压缩frame = cv2.resize(frame, (192, 108))# 图像编码params = [cv2.IMWRITE_JPEG_QUALITY, 100]  # ratio:0~100frame_encode = cv2.imencode('.jpg', frame, params)[1]  # 图像编码frame_encode = np.array(frame_encode)frame_encode = frame_encode.tobytes()# 3.发送数据len_data = len(frame_encode)fhead = struct.pack(b'128sq',bytes(frame_now, encoding='utf-8'),len_data)  # 将图片路径和大小打包成一个二进制字符串# 3.发送数据tcpclient.send(fhead)tcpclient.send(frame_encode)  # 发送图片============================================================# 显示画面cv2.imshow('Map', frame)key = cv2.waitKey(24)# writer.write(frame)  #视频保存# 按Q退出if key == ord('q'):breakcap.release()  # 释放摄像头cv2.destroyAllWindows()  # 释放所有显示图像窗口if __name__ == "__main__":file_path = '/media/ll/AI-2/20231225-bjdt/Camera/Camera_1226/results_txt'  # 路径file_list = glob.glob('%s/*'%file_path)  # 文件列表"""车载ip:20.198.147.136地面ip:172.16.77.1alian_ubuntu:192.168.2.42alian_window:192.168.2.36"""host = "192.168.2.36"port = 6666for file in file_list:tcpclient = TCPClient(host,port)# 3.发送数据# 3.1 发送文件SendFile(tcpclient, file)# 3.2 发送图片# SendImgArray(tcpclient, file)# 3.3 发送视频帧(接收端与图片接收端一致)# SendFrame(host, port, add=0)

5.2 服务端

#coding:utf-8
"""
2023-12-28
author:alian
function
接收端:地面服务器
1.循环接收文件
2.循环接收图片
3.循环接收视频帧
"""
import socket
import cv2
import numpy as np
import time
import structdef TCPSever(host,port):  # 通信协议函数(服务端)time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))# 1.创建一个客户端的socket对象tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP# 2.绑定端口:tcpserver.bind((host,port))print("%s 服务端已开启" % time_now)return tcpserverdef ReceiveFile(tcpserver):"""循环接收文件"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128sq')print(fileinfo_size)buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename, filesize = struct.unpack('128sq', buf)  # 解包recvd_size = 0save_name = filename.decode().strip('\x00')  # 文件名解码print(f"文件名:{save_name}")fp = open(save_name, 'wb')while not recvd_size == filesize:if filesize - recvd_size > 1024:data = sock.recv(1024)recvd_size += len(data)else:data = sock.recv(1024)recvd_size = filesizefp.write(data)  # 写入文件数据fp.close()print("-" * 5 + "接收完成" + "-" * 5)sock.close()breakdef ReceiveImg(tcpserver):"""循环接收图片"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128siiiiq')buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename,x1,y1,x2,y2,filesize = struct.unpack('128siiiiq', buf)  # 解包save_name = filename.decode().strip('\x00')  # 文件名解码print(f"图片名称:{save_name}")print(f"目标检测坐标:{x1,y1,x2,y2}")  # 附加信息,可以自定义data = b''while len(data)<filesize:data += sock.recv(1024)img_decode = cv2.imdecode(np.frombuffer(data, dtype=np.uint8), cv2.IMREAD_COLOR)# 显示图像cv2.imshow('Image', img_decode)cv2.waitKey(500)  # 显示时长根据传输的速度自定义# 保存图像cv2.imwrite(save_name,img_decode)print("-" * 5 + "接收完成" + "-" * 5)cv2.destroyAllWindows()breakdef ReceiveFrame(tcpserver):"""循环接收图片"""# 设置监听tcpserver.listen(5)while True:# 3.接收数据:accept()函数会返回一个元组, 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)sock, addr = tcpserver.accept()print("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口print("-" * 5 + "开始接收" + "-" * 5)while True:fileinfo_size = struct.calcsize('128sq')buf = sock.recv(fileinfo_size)  # 接收图片名if buf:filename,filesize = struct.unpack('128sq', buf)  # 解包save_name = filename.decode().strip('\x00')  # 文件名解码print(f"图片名称:{save_name}")data = b''while len(data)<filesize:data += sock.recv(1024)img_decode = cv2.imdecode(np.frombuffer(data, dtype=np.uint8), cv2.IMREAD_COLOR)# 显示图像cv2.imshow('Image', img_decode)cv2.waitKey(500)  # 显示时长根据传输的速度自定义# 保存图像# cv2.imwrite(save_name,img_decode)print("-" * 5 + "接收完成" + "-" * 5)cv2.destroyAllWindows()breakif __name__=="__main__":host,port = '192.168.2.36', 6666tcpserver = TCPSever(host,port)# 3.接收数据# 3.1 接收文件函数ReceiveFile(tcpserver)# 3.2 接收图片函数# ReceiveImg(tcpserver)# 3.3 接收视频帧# ReceiveFrame(tcpserver)# 4.关闭服务端tcpserver.close()

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

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

相关文章

istio 示例程序 bookinfo 快速部署

官网 文档位置 相关 yaml 资源下载 Bookinfo 应用分为四个单独的微服务&#xff1a; productpage&#xff1a;这个微服务会调用 details 和 reviews 两个微服务&#xff0c;用来生成页面details&#xff1a;这个微服务中包含了书籍的信息reviews&#xff1a;这个微服务中包含了…

开源元数据治理平台Datahub部署指南(小白版)

1.引言 datahub是做什么的&#xff0c;这里就不展开描述了&#xff0c; 如果想了解更多请自行阅读DataHub官网文档&#xff0c; 这里主要教大家如何一步一步安装然后100%部署完成。一般开源产品的文档都是被大家吐槽的最多的&#xff0c;部署步骤写的非常简单&#xff0c;重要…

编程语言的未来?

随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 一、当前编程语言的发展趋势 1、向…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中&#xff0c;很多查询语句需要进行GROUP BY分组汇总&#xff0c;但是一旦经过分组&#xff0c;SELECT返回的记录数就会减少。为了保留所有原始行记录&#xff0c;并且仍可以进行分组数据分析&#xff0c;分析函数应运而生。 Oracle 8i 版本开始支持窗…

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成&#xff0c;每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义…

Matlab:非线性规划

1、语法&#xff1a; xfmincon(fun,x0,A,b) xfmincon(fun,x0,A,b,Aeq,beq) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) xfmincon(problem) [x,fval]fmincon(___) [x,fval,exitflag,…

vue前端学习笔记

filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。 const words [active, sunlight, self-confident, clever, health];const result words.filter((word) > word.length 6);console.log(result);结果如下&#xff1a; &…

Vue指令详解

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. `v-bind`2. `v-model`3. `v-if` / `v-else-if` / `v-else`4. `v-for`5. `v-on`6. `v-show`7. `v-pre`8. `v-cloak`⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷

边缘检测——PidiNet网络训练自己数据集并优化推理测试(详细图文教程)

PiDiNet 是一种用于边缘检测的算法&#xff0c;它提出了一种简单、轻量级但有效的架构。PiDiNet 采用了新 颖的像素差卷积&#xff0c;将传统的边缘检测算子集成到现代 CNN 中流行的卷积运算中&#xff0c;以增强任务性能。 在 BSDS500、NYUD 和 Multicue 上进行了大量的实验…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步&#xff1a;保存相机当前参数设置UserSet_Save第二步&#xff1a;载入已经保…

go 语言程序设计第1章--入门

1.1 hello, world helloworld.go package mainimport "fmt"func main() {fmt.Println("Hello, World") }执行 go run helloworld.go 运行程序。 构建和执行. go build helloworld.go ./helloworld1.2 命令行参数 变量 os.Args 是一个字符串 slice. …

1527. 患某种疾病的患者

1527. 患某种疾病的患者 患者信息表&#xff1a; Patients --------------------- | Column Name | Type | --------------------- | patient_id | int | | patient_name | varchar | | conditions | varchar | --------------------- 在 SQL 中&#xff0c;patient_id &…

高并发系统常见问题及解决方案(Java)

在 Java Web 应用中,高并发环境会带来一系列的挑战,这些挑战可能会影响应用的性能、稳定性和可用性。下面是一些常见的问题以及相应的解决方案: 1. 线程资源竞争 问题: 当多个线程尝试同时访问同一资源时,可能会导致竞争条件,进而影响数据的完整性。 解决方案: 使用同步…

小米路由器2(R2D) 安装 MIXBOX

1. 先刷开发版 ROM http://www1.miwifi.com/miwifi_download.html 进入上述网页&#xff0c;找到 R2D 点击下载 开发版 ROM 教程 看 下载按钮上边的 “刷机教程” 刷机教程 2. 开启SSH工具 登录自己的小米账号后&#xff0c;里面会显示出 自己的 root密码&#xff1b; 默认…

『JavaScript』JavaScript事件类型详解:全面解析各类用户交互行为

&#x1f4e3;读完这篇文章里你能收获到 理解事件驱动编程的基本概念和工作原理掌握JavaScript中常见的事件类型及其应用场合学习如何使用DOM API添加和移除事件监听器探讨事件冒泡、事件捕获和事件委托等高级事件处理技术 文章目录 一、事件处理程序1. HTML事件处理HTML事件处…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

Vue.js项目部署至Linux服务器的详细步骤

引言 在现代Web开发中&#xff0c;Vue.js作为一款流行的前端框架&#xff0c;为开发者提供了灵活且高效的工具。然而&#xff0c;在将Vue.js项目成功部署到Linux服务器上&#xff0c;可能需要一些额外的步骤和注意事项。本文将深入介绍在Linux服务器上部署Vue.js项目的详细步骤…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

【经验模态分解】5.结合EMD与最小二乘法的信号趋势项的提取方法

利用 EMD 将信号分解为一系列 固有模态函数IMF&#xff0c;根据 振动信号过零点特性 对属于趋势项的 IMF 分量进行判别&#xff0c;并对判别为趋势项的 IMF 分量进一步利用 最小二乘法 进行趋势项拟合&#xff0c;将拟合结果求和作为最终趋势项。数值模拟试验和实测数据处理结果…