写端口-tcp udp不同方式发包和接包

news2024/10/12 5:52:55

最近一直在学习网络编程,今天把 socket部分做一个总结。

Python 的socket库可以实现不同协议不同地址的发包和收包,无奈资料很少,官方例子有限,大神博客很少提及, 经过一番尝试后,总结以下几点用法以便大家以后使用。

client端
import socket
import time
import random
import string

# 定义一些常量,变量名可以变。自己好记就行
buffer = 1024  # 发送缓冲区大小,这里是1KB
data_size = 128  # 每个UDP数据包的大小
bandwidth = 1  # 目标带宽,1 Mbps
PACKETS_PER_SECOND = bandwidth * 1024 * 1024 / (8 * data_size)  # 计算每秒需要发送的数据包数量

# 目标服务器的IP和端口
SERVER_IP = '127.0.0.1'  # 请替换为实际服务器IP
SERVER_PORT = 1245 # 请替换为实际端口

def generate_random_data(size):
    """生成随机数据,生成往UDP包中放的随机值"""
    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(size)).encode()

def udp_main():
    # 创建UDP套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print(f"Starting UDP bandwidth test to {SERVER_IP}:{SERVER_PORT} aiming for {bandwidth} Mbps...")
    start_time = time.time()
    packets_sent = 0

    try:
        while True:
            # 生成随机数据
            data = generate_random_data(data_size)
            # 发送数据包
            client_socket.sendto(data, (SERVER_IP, SERVER_PORT))
            #包计数
            packets_sent += 1
            # 控制发送速率以达到目标带宽
            elapsed_time = time.time() - start_time
            if elapsed_time >= 1:
                #实际带宽,怎么算需要记一下
                actual_bandwidth = (packets_sent * data_size * 8) / (elapsed_time * 1024 * 1024)
                print(f"Actual bandwidth: {actual_bandwidth:.2f} Mbps")
                #重新计算包
                packets_sent = 0
                start_time = time.time()
            time.sleep(1 / PACKETS_PER_SECOND)  # 等待,控制发送频率
    except KeyboardInterrupt:
        print("\nBandwidth test interrupted by user.")
    finally:
        client_socket.close()

def tcp_main():
    client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client_socket.connect((SERVER_IP, SERVER_PORT))
    start_time = time.time()
    packets_sent = 0
    try:
        while True:
            data = generate_random_data(data_size)
            client_socket.send(data)
            packets_sent += 1
            elapsed_time = time.time() - start_time
            if elapsed_time >= 1:
                client_socket.send("q".encode())
                packets_sent = 0
                start_time = time.time()
                acutalwidth = (packets_sent * data_size * 8) / (elapsed_time * 1024 * 1024)
                print(f"Actual bandwidth: {acutalwidth:.2f} Mbps")
            time.sleep(1/PACKETS_PER_SECOND)
    except KeyboardInterrupt:
        print("\nBandwidth test interrupted by user.")
    finally:
        client_socket.close()


if __name__ == "__main__":
    tcp_main(

server端

import socket

def Server_Socket():
    serverip = "0.0.0.0"
    serverport = 8080

    #1、2 创建UDP的socket
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server_socket.bind((serverip,serverport))

    print(f"udp server {serverip}:{serverport}")

    try:
        while True:
            #3、接收客户端发来的值
            data,addr = server_socket.recvfrom(1024)

            print(f"recv from {addr}:{data.decode('utf-8')}") #print的内容不用背
    except KeyboardInterrupt:
        print("^C received, shutting down the server") #无所谓不用背具体详情
    finally:
        server_socket.close()

def TCP_socket():
    serverip = "127.0.0.1"
    serverport = 1245
    server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_socket.bind((serverip,serverport))
    print(f"start listening:")
    server_socket.listen(1024)
    print(f"tcp socket: {serverip}:{serverport}")
    try:
        dataconn,addr = server_socket.accept()
        print(f"client{dataconn}:{addr}")
        while True:
            data = dataconn.recv(1024)
            print(f"recv from {addr},recv data:{data.decode('utf-8')}")
            if data.decode('utf-8') == "q":
                break
            dataconn.send("已送达".encode('utf-8'))
    except KeyboardInterrupt:
        print("^C received, shutting down the server")
    finally:
        server_socket.close()

if __name__ == "__main__":
    TCP_socket()

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

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

相关文章

统一流程引擎如何具体实现对多系统业务流程的整合?

在信息化时代,企业和组织通常会使用多个业务系统来满足不同的业务需求。然而,这些分散的业务系统往往会导致业务流程的碎片化,降低工作效率。统一流程引擎的出现为解决这一问题提供了有效的途径。它能够整合多系统的业务流程,实现…

【Next.js 入门教程系列】03-路由与跳转

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话, 给我的库点个star,关注一下吧 上一篇【Next.js 入门教程系列】02-风格化 路由与跳转 本篇包括以下内容: Define dynamic routesAccess route and…

构建高效作业管理平台:Spring Boot师生协作评审系统

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

23年408数据结构

第一题: 解析: 第一点,我们要知道顺序存储的特点:优点就是随用随取,就是你想要查询第几个元素可以直接查询出来,时间复杂度就是O(1),缺点就是不适合删除和插入,因为每次删除和插入一…

Pyramid-Flow – 北大、快手、北邮联合开源的视频生成模型

Pyramid-Flow是什么 Pyramid-Flow是一种先进的视频生成模型,由北京大学、快手科技和北京邮电大学的研究人员联合推出。模型根据文本提示生成长达10秒、分辨率高达1280768、帧率24帧每秒的高清视频。Pyramid-Flow的核心为创新的金字塔流匹配算法,算法将视…

为您的人工智能数据提供类似 Git 的版本管理功能

您过去肯定有过版本控制代码。但是,您是否对数据进行了版本控制?您是否曾经想过与不同的团队协作处理大量数据,而无需提交大量数据?想象一下,使用类似 git 的命令来运行类似存储库的生态系统,在该生态系统中…

模型案例:| SenseCraft Al平台模型训练与部署

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

关于Transformer的相关问题

🎁👉点击进入文心快码 Baidu Comate 官网,体验智能编码之旅,还有超多福利!🎁 🔍【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机! ❓今日问题&am…

MacOS 同时配置github、gitee和gitlab密钥

MacOS 同时配置github、gitee和gitlab密钥 1 在终端中新建 ~/.ssh目录 1.1 生成GitHub、Gitee和Gitlab的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_ed25519_gitee ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_…

mac电脑卸载软件在哪里?苹果电脑卸载软件的正确步骤

如今,越来越多的人选择使用Mac电脑来办公,然而,随着使用时间的增长,Mac电脑上安装的软件越来越多,硬盘空间逐渐被占用,电脑性能也可能因此受到影响。许多用户在尝试卸载不再需要的软件时,发现直…

【JVM】原理篇

1 栈上的数据存储 在Java中有8大基本数据类型: 这里的内存占用,指的是堆上或者数组中内存分配的空间大小,栈上的实现更加复杂。 以基础篇的这段代码为例: Java中的8大数据类型在虚拟机中的实现: boolean、byte、char、…

【重学 MySQL】六十四、主键约束的使用

【重学 MySQL】六十四、主键约束的使用 主键约束的特性主键约束的创建创建单列主键创建联合主键在表创建后添加主键 主键约束的删除主键约束的特点主键约束与自增长约束注意事项 在MySQL中,主键约束(PRIMARY KEY)用于唯一标识表中的每一行数据…

AOT漫谈专题(第一篇): 如何调试C# AOT程序

一:背景 1. 讲故事 上个月接到了二个C# AOT程序的故障分析,发现如今的C# AOT程序也开始在各个领域开枝散叶了,这是一件非常好的事情,本着对这类程序有一个专业的维修态度,开一个系列好好聊一聊吧,当然我这…

互动式教育技术:Spring Boot师生共评作业管理系统

3系统分析 3.1可行性分析 通过对本师生共评的作业管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本师生共评的作业管理系统采用JAVA作为开发语言&…

uniapp引入ThorUI的方法

1、下载文件 2、复制相应的文件除了pages 3、往项目中复制即可 4、引入即可实现 5、添加easycome自动引入

SpringBoot2核心功能-web开发

目录 一、简单功能分析1.1、静态资源访问1.2、欢迎页支持、自定义 Favicon 二、请求参数处理2.1、请求映射2.1.1、rest使用与原理2.1.2、请求映射原理 2.2、普通参数与基本注解2.2.1、注解2.2.2、Servlet API:2.2.3、复杂参数: 三、拦截器四、Web原生组件…

STM32之CAN外设

相信大家在学习STM32系列的单片机时,在翻阅芯片的数据手册时,都会看到这么一个寄存器外设——CAN外设寄存器。那么,大家知道这个外设的工作原理以及该如何使用吗?这节的内容将会详细介绍STM32上的CAN外设,文章结尾附有…

气象数据三维可视化的实现原理及代码

气象数据三维可视化是一种使用三维图形技术来呈现和分析气象数据的方法。通过三维可视化,用户可以更直观地观察气象数据的空间分布、变化趋势以及天气现象的复杂结构。这种技术广泛应用于气象预报、科学研究以及环境监测等领域。 本文将介绍气象数据三维可视化的基…

未来战争中的指控体系不仅是分布式的

指控体系,作为军事指挥与控制的重要组成部分,经历了从传统的集权指挥向现代分布式指挥的转变。历史上,战争指挥体系主要依赖于集中式指挥官的决策,信息流动缓慢,决策过程受到地理位置、通信手段等多种因素的制约。随着…

数据库实例

例3.5建立一个“学生”表student create table student(sno char(9) primary key,sname char(20) unique,ssex char(2),sage smallint,sdept char(20)); 例3.6建立一个“课程”表course create table course(cno char(4) primary key,cname char(40) not null,cpno char(4),…