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

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()

运行效果
在这里插入图片描述

http://www.lryc.cn/news/424117.html

相关文章:

  • 服务器安装哪吒面板详细教程
  • LLM微调(精讲)-以高考选择题生成模型为例(DataWhale AI夏令营)
  • 安全基础学习-RC4加密算法
  • 雨云宁波电信大带宽服务器测评(非广告)
  • 2024年,最新前端趋势
  • Linux静态进程和动态进程查看管理
  • CPU飙升 怎么定位问题
  • The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动
  • JS 和 JSX、TS 和 TSX 的区别
  • 25款极氪007上市,小米SU7就不该买?
  • 旋转字符串 | LeetCode-796 | 模拟 | KMP | 字符串匹配
  • 网络安全测试工具Burp Suite基本使用
  • 使用pytest+selenium编写网页UI自动化脚本和用例
  • 新能源遇“秋老虎”,8月第二周销量集体下滑,问界惨遭腰斩
  • SEO模板网站的wordpress主题最适合google外贸SEO
  • fetch跨域请求数据的前端设置和后端php的header设置
  • Ted靶机
  • HarmonyOS ArkTS 构建布局
  • yolov5详解(二):通过yaml文件构建完整模型
  • 8月8日学习笔记 python基础
  • 电动自行车出海黑马Avento独立站拆解(上)丨出海笔记
  • Gerrit 使用教程
  • sudu提权命令账号安全控制(su命令)执行单个命令并返回原用户、执行多个命令并返回原用户、保持当前环境变量、配置文件/etc/sudoers
  • 【线性代数】【二】2.7 矩阵的秩
  • 计算机网络部分基础知识
  • WESWOO合作的出海企业(一)
  • vue 项目中 使用vxe-grid 表格中给表格的表头设置特殊的格式 , 并且给指定的列文字设置颜色
  • 基于SpringBoot的企业资产管理系统
  • ps快捷键,学习
  • python代码模拟服务器实验2:IO多路复用select