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

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

最近一直在学习网络编程,今天把 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 = 0try:while True:# 生成随机数据data = generate_random_data(data_size)# 发送数据包client_socket.sendto(data, (SERVER_IP, SERVER_PORT))#包计数packets_sent += 1# 控制发送速率以达到目标带宽elapsed_time = time.time() - start_timeif elapsed_time >= 1:#实际带宽,怎么算需要记一下actual_bandwidth = (packets_sent * data_size * 8) / (elapsed_time * 1024 * 1024)print(f"Actual bandwidth: {actual_bandwidth:.2f} Mbps")#重新计算包packets_sent = 0start_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 = 0try:while True:data = generate_random_data(data_size)client_socket.send(data)packets_sent += 1elapsed_time = time.time() - start_timeif elapsed_time >= 1:client_socket.send("q".encode())packets_sent = 0start_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 socketdef Server_Socket():serverip = "0.0.0.0"serverport = 8080#1、2 创建UDP的socketserver_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 = 1245server_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":breakdataconn.send("已送达".encode('utf-8'))except KeyboardInterrupt:print("^C received, shutting down the server")finally:server_socket.close()if __name__ == "__main__":TCP_socket()
http://www.lryc.cn/news/458405.html

相关文章:

  • 计算机的错误计算(一百二十)
  • Spring Boot 中使用 JSON Schema 来校验复杂 JSON 数据
  • QT实现Opencv图像处理
  • 刚转Mac的新手如何卸载不需要的应用程序
  • Unity 3d 继承MonoBahaviour的单例
  • grafana version 11.1.0 设置Y轴刻度为1
  • Elasticsearch的安装与配置
  • win0删除 Windows.old
  • 常见IDE及其编译器的讲解
  • 用SQLyog连接mysql提示2058错误
  • Web集群服务-Nginx
  • 获取时隔半个钟的三天
  • 构建可以ssh连接的容器镜像
  • 数据库中JOIN的用法?
  • java项目之纺织品企业财务管理系统源码(springboot+vue+mysql)
  • C语言 编程练习:解决五个有趣的问题
  • 二、安装vmtools
  • 用echarts画天气预报
  • 如果要存IP地址,用什么数据类型比较好?(java)
  • LinkedList源码解读
  • springboot feign-httpclient 连接池配置
  • 电汽车充电革命:充电桩的过去现在与未来
  • windows server 2019中安装.net framework 3.5功能出错
  • vscode gitlens收费破解
  • IPv 4
  • SQL 注入漏洞 - 学习手册
  • AVLTree 旋转笔记(根据平衡因子插入的公式,贼好理解)
  • STM32(十八):SPI通信
  • Redis持久化机制(RDBAOF详解)
  • 蛋白质结构中pdbx_strand_id和entity_id相互转化