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

2025年1月22日(网络编程 udp)

系统信息:

ubuntu 16.04LTS
Raspberry Pi Zero 2W
系统版本: 2024-10-22-raspios-bullseye-armhf
Python 版本:Python 3.9.2
已安装 pip3
支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480)
已安装 vim
已安装 git


学习目标:

  • 网络编程
  • udp

学习内容:

CA CE
udp 基本使用

在这里插入图片描述

循环发送

在这里插入图片描述

循环发送

import socket


def main():
    # 1. 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2. 绑定本地信息
    udp_socket.bind(("192.168.0.178", 8080))
    # 3. 接收数据
    recv_data = udp_socket.recvfrom(1024)
    # 4. 打印接收的数据
    # 元组
    # (b'Welcome to NetAssist', ('192.168.0.178', 8081))
    print(recv_data)
    # 5. 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

解析接收的数据

import socket


def main():
    # 1. 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2. 绑定本地信息
    udp_socket.bind(("192.168.0.178", 8080))
    while True:
        # 3. 接收数据
        recv_data = udp_socket.recvfrom(1024)
        # 4. 打印接收的数据
        # 元组
        # (b'Welcome to NetAssist', ('192.168.0.178', 8081))
        print(recv_data)
        recv_msg = recv_data[0]
        recv_addr = recv_data[1]
        print("%s : %s" % (str(recv_addr), recv_msg.decode("utf-8")))
        # BUG
        if recv_msg.decode("utf-8") == "exit":
            break
    # 5. 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

绑定端口发送数据

import socket


def main():
    # 创建一个 udp 套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定本地信息
    udp_socket.bind(("192.168.0.178", 8080))

    while True:
        # 发送的数据
        send_data = input("请输入:")

        # 用户选择关闭
        if send_data == "exit":
            break

        # 收发数据
        udp_socket.sendto(send_data.encode("utf-8"), ("192.168.0.178", 8081))

    # 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

请添加图片描述

在使用 Python 的 socket 模块进行网络编程时,可能会遇到阻塞(blocking)问题。阻塞通常发生在网络 I/O 操作中,例如 recv() 或 accept() 方法,这些操作会等待数据到达或客户端连接,导致程序暂停执行。

在通信和数据传输中,单工、半双工和全双工是三种不同的通信模式。它们的主要区别在于数据传输的方向性。以下是这三种模式的简要说明:

1. 单工 (Simplex)

  • 定义:单工通信是指数据只能单向传输的模式。信息只能从发送方传输到接收方,接收方无法向发送方发送信息。
  • 例子:电视广播、传统的广播电台。

2. 半双工 (Half-Duplex)

  • 定义:半双工通信允许数据在两个方向上传输,但不能同时进行。在任何时刻,数据只能在一个方向上传输。
  • 例子:对讲机、一些无线通信设备。

3. 全双工 (Full-Duplex)

  • 定义:全双工通信允许数据在两个方向上同时传输。发送方和接收方可以同时发送和接收信息。
  • 例子:电话通话、现代网络通信(如以太网)。

总结表

通信模式传输方向示例
单工单向电视广播
半双工双向(不同时)对讲机
全双工双向(同时)电话通话

这些通信模式在不同的应用场景中有各自的优势和局限性,选择合适的模式可以提高通信效率和效果。

udp聊天

import socket


def send_data(udp_socket):
    sd_data = input("请输入:")
    udp_socket.sendto(sd_data.encode("utf-8"), ("192.168.0.178", 8081))


def recv_data(udp_socket):
    rv_data = udp_socket.recvfrom(1024)

    # 打印接收的数据
    recv_msg = rv_data[0]
    recv_addr = rv_data[1]
    print("%s : %s" % (str(recv_addr), recv_msg.decode("utf-8")))


def main():
    # 创建一个 udp 套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("192.168.0.178", 8080))

    while True:
        print("--- 选项 ---")
        print("1.发送")
        print("2.接收")
        print("3.退出")
        print("-----------")
        op = input("请输入:")
        # 发送的数据
        if op == "1":
            send_data(udp_socket)

        # 收数据
        elif op == "2":
            recv_data(udp_socket)

        elif op == "3":
            break

        else:
            print("输入有误")

    # 关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()


http://www.kler.cn/a/528845.html

相关文章:

  • 线性代数复习笔记
  • Mysql的主从复制及扩展功能
  • 复杂场景使用xpath定位元素
  • 简要介绍C++中的 max 和 min 函数以及返回值
  • three.js+WebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值方面的问题)
  • 【微服务与分布式实践】探索 Eureka
  • 动手学强化学习(四)——蒙特卡洛方法
  • vue之pinia组件的使用
  • AtCoder Beginner Contest 391(ABCDE)
  • Alibaba开发规范_编程规约之命名风格
  • 22.Word:小张-经费联审核结算单❗【16】
  • C_C++输入输出(下)
  • gesp(C++六级)(9)洛谷:P10721:[GESP202406 六级] 计算得分
  • UE学习日志#18 C++笔记#4 基础复习4 指派初始化器和指针
  • 手写防抖函数、手写节流函数
  • 【Rust自学】18.1. 能用到模式(匹配)的地方
  • Python在线编辑器
  • Python 环境隔离和实现方法
  • 【LeetCode 刷题】二叉树-公共祖先
  • TensorFlow简单的线性回归任务
  • OpenAI推出o3-mini推理模型,首次免费开放,性能超越o1,AIME测试准确率高达87.3%
  • 牛客题目分享:JZ64 求1+2+3+...+n(用static成员和构造函数的方法)(C++)
  • 记6(人工神经网络
  • 数据结构:优先级队列—堆
  • C++ strcpy和strcat讲解
  • NeetCode刷题第19天(2025.1.31)