Python套接字综合应用(UDP篇)
Python套接字综合应用(UDP篇)
1、 主要功能
- UDP客户端实现
- UDP服务端实现
- 输出字体颜色控制
- 响应捕获键盘
Ctrl+C信号 - 套接字异常捕获及处理
- 通信报文16进制格式化输出
2、 Python UDP套接字应用
Windows程序在WinServer2022上验证运行,Linux程序在银河麒麟V10上验证运行。
通过《网络调试助手》进行调试验证,工具运行界面如下:

①、 Linux服务端
server.py
# -*- coding: gbk -*-import socket
import datetime#服务端参数设置
listen_addr = "192.168.58.145"
listen_port = 1281#输出字体颜色控制
TEXT_COLOR_WHITE = '\033[97m'
TEXT_COLOR_MAGENTA = '\033[95m'
TEXT_COLOR_BLUE = '\033[94m'
TEXT_COLOR_YELLOW = '\033[93m'
TEXT_COLOR_GREEN = '\033[92m'
TEXT_COLOR_RED = '\033[91m'
TXET_COLOR_DEFAULT = '\033[0m'#输出字体大小控制
TEXT_FONT_WEIGHT_DEFAULT = '\033[0m'
TEXT_FONT_WEIGHT_BOLD = '\033[1m\033[5m'
TEXT_FONT_WEIGHT_THIN = '\033[2m\033[3m'#1. 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. 绑定地址
sock.bind((listen_addr, listen_port))
#3. 接收数据
while True:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印客户地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"%s" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_RED}%s{TXET_COLOR_DEFAULT}" % str_rx_msg)#发送信息给对方tx_msg = rx_msgsock.sendto(tx_msg,peer_endpoint)str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"print(f"%s" % str_tx + str_now + str_peer)#发送内容格式化line = ['%02X' % i for i in tx_msg]str_tx_msg = " ".join(line)print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % str_tx_msg)sock.close()
运行效果

②、 Linux客户端
client.py
# -*- coding: gbk -*-import socket
import datetime
import time#本地网络参数设置
local_bind_addr = "192.168.58.145"
local_bind_port = 1281#对方网络参数设置
remote_ep_addr = "192.168.58.1"
remote_ep_port = 50001#交互模式
#[0]: 固定次数、固定间隔发送,用户只输入一次
#[1]: 每次要求用户输入,用户输入后才发送(默认方式)
tx_mode = 0#只有tx_mode为[0]时生效
tx_count = 10
tx_interval_second = 2#输出字体颜色控制
TEXT_COLOR_WHITE = '\033[97m'
TEXT_COLOR_MAGENTA = '\033[95m'
TEXT_COLOR_BLUE = '\033[94m'
TEXT_COLOR_YELLOW = '\033[93m'
TEXT_COLOR_GREEN = '\033[92m'
TEXT_COLOR_RED = '\033[91m'
TXET_COLOR_DEFAULT = '\033[0m'#1. 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. 绑定本地地址
sock.bind((local_bind_addr, local_bind_port))
#设置接收超时时间(单位为秒)
timeout_seconds = 2
sock.settimeout(timeout_seconds)#每次要求用户输入,用户输入后才发送(默认方式)
if tx_mode == 1 :while True:#3. 接收用户输入input_stream = input("请输入16进制发送报文数据,以空格分隔:")#4. 发送数据sock.sendto(bytearray.fromhex(input_stream),(remote_ep_addr,remote_ep_port))str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"str_remote_addr = "[{}]".format((remote_ep_addr,remote_ep_port))print(f"%s" % str_tx + str_now + str_remote_addr)#发送内容格式化print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % input_stream.upper())#5.接收数据try:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印对端地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"%s" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_RED}%s{TXET_COLOR_DEFAULT}" % str_rx_msg.upper())except socket.timeout:#超时,继续continue#固定次数、固定间隔发送,用户只输入一次
elif tx_mode == 0 :#3. 接收用户输入input_stream = input("请输入16进制发送报文数据,以空格分隔:")while tx_count > 0:#4. 发送数据sock.sendto(bytearray.fromhex(input_stream),(remote_ep_addr,remote_ep_port))str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"str_remote_addr = "[{}]".format((remote_ep_addr,remote_ep_port))print(f"%s" % str_tx + str_now + str_remote_addr)#发送内容格式化print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % input_stream.upper())#5.接收数据try:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印对端地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"%s" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_RED}%s{TXET_COLOR_DEFAULT}" % str_rx_msg.upper())except socket.timeout:#接收超时continueexcept Exception as e:print(f"[处理异常]: {e}")print(f"{TEXT_COLOR_RED}terminating...{TXET_COLOR_DEFAULT}")sock.close()sys.exit(0)tx_count -= 1time.sleep(tx_interval_second)sock.close()
运行效果

③、 Windows服务端
server.py
# -*- coding: gbk -*-import socket
import datetime
import sys#服务端参数设置
listen_addr = "192.168.58.151"
listen_port = 1281#输出字体颜色控制
TEXT_COLOR_WHITE = '\033[1;30m'
TEXT_COLOR_GRAY = '\033[1;37m'
TEXT_COLOR_MAGENTA = '\033[1;35m'
TEXT_COLOR_BLUE = '\033[1;34m'
TEXT_COLOR_YELLOW = '\033[1;33m'
TEXT_COLOR_GREEN = '\033[1;32m'
TEXT_COLOR_RED = '\033[1;31m'
TXET_COLOR_DEFAULT = '\033[0m'#输出字体大小控制
TEXT_FONT_WEIGHT_DEFAULT = '\033[0m'
TEXT_FONT_WEIGHT_BOLD = '\033[1m\033[5m'
TEXT_FONT_WEIGHT_THIN = '\033[2m\033[3m'# "\033"是转义序列的开始,后面跟着一个或多个字符来指定具体的样式。
# [0m表示默认样式,[1m表示加粗,[2m表示常规,[5m表示放大,[3m表示缩小。#仅限Windows系统
#print颜色控制失败时调用如下语句
import os
if os.name == "nt":os.system("")#捕获键盘Ctrl+C信号
import signal
def signal_handler(signal,code):print(f"{TEXT_COLOR_RED}terminating...{TXET_COLOR_DEFAULT}")sys.exit(0)signal.signal(signal.SIGINT,signal_handler)
signal.signal(signal.SIGTERM,signal_handler)#16进制格式化输出
def print_hex(bytes):line = ['%02X' % i for i in bytes] print(" ".join(line))#1. 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. 绑定地址
sock.bind((listen_addr, listen_port))
#3. 设置接收超时时间(单位为秒)
timeout_seconds = 2
sock.settimeout(timeout_seconds)
#4. 接收数据
while True:try:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印客户地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"{TEXT_COLOR_GRAY}%s{TXET_COLOR_DEFAULT}" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % str_rx_msg)#发送信息给对方tx_msg = rx_msgsock.sendto(tx_msg,peer_endpoint)str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"print(f"{TEXT_COLOR_GRAY}%s{TXET_COLOR_DEFAULT}" % str_tx + str_now + str_peer)#发送内容格式化line = ['%02X' % i for i in tx_msg]str_tx_msg = " ".join(line)print(f"{TEXT_COLOR_GREEN}%s{TXET_COLOR_DEFAULT}" % str_tx_msg)except socket.timeout:#超时,继续continue
sock.close()
运行效果

④、 Windows客户端
client.py
# -*- coding: gbk -*-import socket
import datetime
import time#本地网络参数设置
local_bind_addr = "192.168.58.131"
local_bind_port = 1281#对方网络参数设置
remote_ep_addr = "192.168.58.1"
remote_ep_port = 50001#交互模式
#[0]: 固定次数、固定间隔发送,用户只输入一次
#[1]: 每次要求用户输入,用户输入后才发送(默认方式)
tx_mode = 0#只有tx_mode为[0]时生效
tx_count = 10
tx_interval_second = 2#仅限Windows系统
#print颜色控制失败时调用如下语句
import os
if os.name == "nt":os.system("")#捕获键盘Ctrl+C信号
import signal
def signal_handler(signal,code):print(f"{TEXT_COLOR_RED}terminating...{TXET_COLOR_DEFAULT}")sys.exit(0)signal.signal(signal.SIGINT,signal_handler)
signal.signal(signal.SIGTERM,signal_handler)#输出字体颜色控制
TEXT_COLOR_WHITE = '\033[1;30m'
TEXT_COLOR_GRAY = '\033[1;37m'
TEXT_COLOR_MAGENTA = '\033[1;35m'
TEXT_COLOR_BLUE = '\033[1;34m'
TEXT_COLOR_YELLOW = '\033[1;33m'
TEXT_COLOR_GREEN = '\033[1;32m'
TEXT_COLOR_RED = '\033[1;31m'
TXET_COLOR_DEFAULT = '\033[0m'#1. 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. 绑定本地地址
sock.bind((local_bind_addr, local_bind_port))
#设置接收超时时间(单位为秒)
timeout_seconds = 2
sock.settimeout(timeout_seconds)#每次要求用户输入,用户输入后才发送(默认方式)
if tx_mode == 1 :while True:#3. 接收用户输入input_stream = input("请输入16进制发送报文数据,以空格分隔:")#4. 发送数据sock.sendto(bytearray.fromhex(input_stream),(remote_ep_addr,remote_ep_port))str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"str_remote_addr = "[{}]".format((remote_ep_addr,remote_ep_port))print(f"%s" % str_tx + str_now + str_remote_addr)#发送内容格式化print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % input_stream.upper())#5.接收数据try:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印对端地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"%s" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_RED}%s{TXET_COLOR_DEFAULT}" % str_rx_msg.upper())except socket.timeout:#超时,继续continue#固定次数、固定间隔发送,用户只输入一次
elif tx_mode == 0 :#3. 接收用户输入input_stream = input("请输入16进制发送报文数据,以空格分隔:")while tx_count > 0:#4. 发送数据sock.sendto(bytearray.fromhex(input_stream),(remote_ep_addr,remote_ep_port))str_tx = "[TX]"now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"str_remote_addr = "[{}]".format((remote_ep_addr,remote_ep_port))print(f"%s" % str_tx + str_now + str_remote_addr)#发送内容格式化print(f"{TEXT_COLOR_BLUE}%s{TXET_COLOR_DEFAULT}" % input_stream.upper())#5.接收数据try:rx_msg, peer_endpoint = sock.recvfrom(2048) print('\n')# 获取当前时间now = datetime.datetime.now()str_date = now.strftime('%Y-%m-%d %H:%M:%S')str_ms = f"{now.strftime('%f')[:3]}".zfill(3)str_now = f"[{str_date}.{str_ms}]"#打印对端地址str_peer = "[{}]".format(peer_endpoint)str_rx = "[RX]"#打印头部信息print(f"%s" % str_rx + str_now + str_peer)#接收内容,格式化16进制line = ['%02X' % i for i in rx_msg]str_rx_msg = " ".join(line)print(f"{TEXT_COLOR_RED}%s{TXET_COLOR_DEFAULT}" % str_rx_msg.upper())except socket.timeout:#接收超时continueexcept Exception as e:print(f"[处理异常]: {e}")print(f"{TEXT_COLOR_RED}terminating...{TXET_COLOR_DEFAULT}")sock.close()sys.exit(0)tx_count -= 1time.sleep(tx_interval_second)sock.close()
运行效果

相关文章:
Python套接字综合应用(UDP篇)
Python套接字综合应用(UDP篇) 1、 主要功能 UDP客户端实现UDP服务端实现输出字体颜色控制响应捕获键盘CtrlC信号套接字异常捕获及处理通信报文16进制格式化输出 2、 Python UDP套接字应用 Windows程序在WinServer2022上验证运行,Linux程序在银河麒麟V10上验证运…...
服务器安装哪吒面板详细教程
本文长期更新地址: 服务器安装哪吒面板详细教程-星零岁的博客https://blog.0xwl.com/13568.html 注:本文中部分内容源自网络,第四步中部分来自本人曾经文章:云服务器安装配置宝塔面板并安装基础运行环境教程-星零岁的博客 今天来讲…...
LLM微调(精讲)-以高考选择题生成模型为例(DataWhale AI夏令营)
前言 你好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,上一篇文章中,作者介绍了基于讯飞开放平台进行大模型微调的完整流程;而在本文中,作者将对大模型微调的数据准备部分进行深入;…...
安全基础学习-RC4加密算法
这里仅仅记录一些基础的概念。后期有需求进一步扩展。 RC4 是一种对称流加密算法,由罗恩里维斯特(Ron Rivest)于1987年设计。RC4 的设计目的是提供一种简单且高效的加密方法。尽管 RC4 曾经广泛使用,但它的安全性在现代已受到质疑…...
雨云宁波电信大带宽服务器测评(非广告)
提示:本文非广告,非宣传! 本文长期更新地址:雨云宁波电信大带宽服务器测评(非广告) 雨云现在有一个国内的新区——宁波 宣传的是电信大带宽,可附加100G防御,采用NVME,和铂…...
2024年,最新前端趋势
随着技术的不断发展,前端开发领域在2024年迎来了新的趋势和挑战。对于开发者来说,紧跟这些趋势不仅能提升技术水平,还能在激烈的市场竞争中脱颖而出。今天,我想向大家介绍一款在这波趋势中脱颖而出的开发神器——MemFire Cloud。这…...
Linux静态进程和动态进程查看管理
1.静态进程的查看PS PPID:谁启动的父亲ID USER:运行进程的用户名称 PID:进程ID %CPU:CPU的占用比例占用资源 %MEM:内存使用的占用比例 VSZ:占用虚拟内存多少 RSS:占用实际内存多少 TTY:…...
CPU飙升 怎么定位问题
传统的方法 【top】 查看所有进程占系统CPU的排序,定位是哪个进程搞的鬼。PID那一列就是进程号。 【top -Hp pid】 定位进程中使用 CPU 最高的线程tid 【printf ‘0x%x’ tid】 线程 tid 转化 16 进制,例如printf ‘0x%x’ 11882 得到16进制的 0x2e6a 【jstack…...
The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动
欢迎回到我们的系列,我们将记录 The Sandbox Game Maker 的 “On-Equip”(装备)功能的多种用途。 如果你刚加入 The Sandbox,On-Equip 功能是 “可收集组件”(Collectable Component)中的一个多功能工具&a…...
JS 和 JSX、TS 和 TSX 的区别
1. JS(JavaScript) 定义与特性: JavaScript(简称JS)是一种轻量级、解释型或即时编译型的编程语言。它基于原型编程、多范式的动态脚本语言,支持面向对象、命令式、声明式、函数式编程范式。JavaScript 是…...
25款极氪007上市,小米SU7就不该买?
文 | AUTO芯球 作者 | 谦行 我是刚刚才知道 买小米SU7的原来是盯着他这两个功能 可爱的小女孩喊小爱同学帮她停个车 妈妈给她说SU7自己能停好,她还叮嘱一句“小爱同学你给我好好停” SU7滴溜溜的就停在车位上,全程不到一分钟 视频属实温馨&#x…...
旋转字符串 | LeetCode-796 | 模拟 | KMP | 字符串匹配
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 🕹️KMP算法练习题 LeetCode链接:796. 旋转字符串 文章目录 1.题目描述🍑2.题解🫐2.1 暴力解法🫒2.2 模拟…...
网络安全测试工具Burp Suite基本使用
一、介绍 Burp Suite 是一款由 PortSwigger 开发的集成网络安全测试工具,广泛用于渗透测试和漏洞扫描。它提供了一系列功能强大的工具和功能,帮助安全研究人员和渗透测试人员识别和修复 Web 应用程序中的安全漏洞。以下是 Burp Suite 的主要功能和特点&…...
使用pytest+selenium编写网页UI自动化脚本和用例
1 UI自动化测试 UI自动化测试(User Interface Automation Testing)是一种通过编写脚本或使用自动化测试工具,对界面(UI)进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面,自动化执行用户…...
新能源遇“秋老虎”,8月第二周销量集体下滑,问界惨遭腰斩
文/王俣祺 导语:随着日前7月份乘用车销量的公布,我们发现7月并没有因6月各车企的“冲量”行为迎来反噬,对于这种“淡季不淡”的现象市场上一片看好。但从近日公布的8月销量数据来看,人们对于“秋老虎”的恐怖可以说是一无所知。随…...
SEO模板网站的wordpress主题最适合google外贸SEO
在寻找最适合Google外贸SEO的WordPress主题时,有几个关键因素需要考虑:速度、SEO友好性、多语言支持、以及是否易于定制。以下是一些推荐的WordPress主题,它们不仅速度快,而且对SEO非常友好,非常适合外贸网站ÿ…...
fetch跨域请求数据的前端设置和后端php的header设置
跨源请求,也称为CORS(Cross-Origin Resource Sharing)请求,是Web开发中常见的一种需求,允许一个网页的JavaScript代码向与该网页不同源的服务器发出HTTP请求。以下是使用JavaScript中的fetch函数进行跨源请求的一个基本…...
Ted靶机
信息收集: 靶机地址:https://www.vulnhub.com/entry/ted-1,327/ (1)ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:FF:7F:9A (2)端口扫描 nmap -p- -A 192.168.254.159 (3&#x…...
HarmonyOS ArkTS 构建布局
在 HarmonyOS 中,ArkTS 是一种基于 TypeScript 的编程语言,专为开发 HarmonyOS 应用而设计。构建布局是开发应用的关键步骤之一。以下是如何在 ArkTS 中构建布局的基本指南。 1. 创建项目和页面 首先,确保已经创建了一个 HarmonyOS 项目。如…...
yolov5详解(二):通过yaml文件构建完整模型
依然拿yolov5l v6.0版本来讲解 1. yaml文件 以下是yolov5l.yaml文件内容 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 80 # number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple …...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
