• 实战|轻松用 Python 开发一个简单有趣的聊天小程序


    前言

    Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。

    UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

    UDP 的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

    比如我们聊天用的 QQ 就是使用的 UDP 协议。

    ——摘自百度百科

    今天的分享内容是使用 Python 结合 UDP传输协议 来开发一个简单的聊天小程序

    环境准备
    1. 准备工具:网络调试助手

    如下图所示,选择UDP测试这个 tab 栏

    2. 本地&目标 ip 与 port 配置

    1)本地端口这栏需要配置一个指定的端口并绑定,因为在 Python 程序中需要指定这个 ip 地址和绑定的 port 号来接收信息

    2)目标 IP 与目标端口也需要配置,用于 Python 程序接收从网络调试助手页面发送的消息,目标 IP 我这里和本地 IP 是一致的,目标端口则是 Python 程序中代码指定的

    代码实战
    import socket
    
    
    class UdpMessage:
        def send_message(self, udp_socket):
            # 接收控制台输入的需发送消息的内容
            msg = input('请输入您要发送的信息:')
            try:
                # 接收控制台输入的发送对象的实际ip地址
                dest_ip = input('请输入您要发送对象的ip地址:')
                # 接收控制台输入的发送对象的实际port地址,port必须是int类型,使用int强转
                dest_port = int(input('请输入您发送对象的端口号:'))
                # 调用sendto方法先将消息内容进行utf-8的编码,后再将消息发送至目标对象
                udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
            except Exception as err:
                # 输出错误异常信息
                print('请输入正确的端口号,错误类型为:%s' % err)
    
        def receive_message(self, udp_socket):
            # 接收数据的最大信息字节数为1024
            recv_msg = udp_socket.recvfrom(1024)
            # 将接收的消息进行解码
            recv_ip_port = recv_msg[1]
            recv_msg = recv_msg[0].decode('gbk')
            print(f'收到消息内容:{recv_msg}, 对方的地址与端口:{recv_ip_port}')
    
        def entrance(self):
            # 创建套接字, AF_INET表示:ipv4的ip协议类型, SOCK_DGRAM表示:udp的套接字类型
            udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # 绑定本机信息,当ip地址为空字符串时默认绑定本机的ip,接收发送方传递的信息
            udp_socket.bind(('', 1230))
            # 死循环保证当前程序一直在运行中,可以随时接收和发送消息
            while True:
                print('若发送消息,请输入:send')
                print('若接收消息,请输入:receive')
                op_num = input('请问您是想发送还是接收信息?')
                if op_num == 'send':
                    self.send_message(udp_socket)
                elif op_num == 'receive':
                    self.receive_message(udp_socket)
                else:
                    print('您输入的指令非send&receive,请重新输入!')
    
    
    if __name__ == '__main__':
        UdpMessage().entrance()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    实现思路

    1.实现 send_message 方法逻辑

    接收用户输入需要发送的消息,发送消息对象的 ip 地址, port 信息,对消息内容进行编码,使用try...except代码段来捕获异常

    2.实现 receive_message 方法逻辑

    通过recvfrom方法接收消息,并指定能接收的最大信息字节数,对接收到的消息进行解码,打印出收到的消息与对方发送该条消息的 ip 地址和 port 信息

    3.实现 entrance 方法逻辑

    这个方法是整个聊天程序的入口主文件,send_messagereceive_message方法都将在此文件中被调用

    • 绑定本机 ip 地址和 1230 端口,发送消息时这个 ip 和 port 就是出口 ip 与 port 信息,在网络调试助手中目标 ip 与 port 要与此设置值保持一致

    • 这里是以死循环来保证聊天程序一直运行中状态,通过用户输入的指令来判断是走接收消息逻辑还是发送消息的逻辑

    实现效果
    1. 发送消息

    配置正确的情况下,按照提示输入指定的信息,就能发送消息成功

    2. 接收消息

    网络调试助手中配置的目标IP,目标端口信息要与程序中设置一样,接收消息需在控制台输入指令:receive,则可收到 8987 端口发送的消息了

    欢迎关注 无量测试之道 公众号,后台回复:udp 即可领取源码,回复:领取资源

    Python+Unittest框架API自动化、

    Python+Unittest框架API自动化、

    Python+Pytest框架API自动化、

    Python+Pandas+Pyecharts大数据分析、

    Python+Selenium框架Web的UI自动化、

    Python+Appium框架APP的UI自动化、

    Python编程学习资源干货、

    Vue前端组件化框架开发、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

    包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

    微信搜索公众号:无量测试之道

    添加关注,让我们一起共同成长!

  • 相关阅读:
    月是故乡明,每逢佳节倍思亲,近乡情更怯
    图解LeetCode——895. 最大频率栈(难度:困难)
    小程序开发 - 基本组件
    漏洞复现:通过CVE-2022-30190上线CS
    excel表格乱码怎么解决呢?
    STM32入门笔记(02):SPI 通信之xxx(SPL库函数版)
    Neo4j图数据库实践——基于知识图谱方法开发构建猪类养殖疾病问答查询系统
    TensorFlow的transformer类模型文件转换为pytorch
    软件测试中的43个功能测试点总结
    数字化卡券拉新怎么做?卡券营销系统如何裂变用户
  • 原文地址:https://blog.csdn.net/weixin_41754309/article/details/126690965