Socket通讯之UDP多任务

本文介绍如何使用Python的socket和threading模块实现UDP的多任务通信。通过创建UDP套接字并利用多线程同时处理数据的接收与发送,实现全双工通信。文章提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDP的基本构造编写

前面也写过关于UDP和TCP的通信,不够都是单线程的,这一次我们想要实现同时收数据和同时发数据,就需要用到threading模块了

首先我们还是理一下编写一个UDP通信需要哪几个步骤。

比如我们想要写一个发数据的客户端。

  1. 创建UDP类型的套接字
  2. 设置目标的ip及其端口信息
  3. 将构造好的数据发送给目标

又如我们想要写一个接收数据的服务器。

  1. 创建UDP类型的套接字
  2. 设置本地IP及其端口信息
  3. 接收来自服务端的信息

好了,我们肯定知道socket是一个全双工的,所以我们不用考虑更多的事情。

那么接下来我们就可以将发送数据和接收数据的两个方法给构造出来。

首先第一步我们肯定要先做战前准备,绑定本地IP端口信息,和填写目标IP及其端口信息。

def main():
    # 创建套接字
    socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定本地信息
    ip_port_Rece = (("127.0.0.1"), 1234)
    socket_UDP.bind(ip_port_Rece)
    # 连接目标服务器
    ip = input("请输入目标IP:")
    port = int(input("请输入目标端口:"))
    # 目标信息
    ip_port_Send = ((ip), port)

第一步我们已经完成了,那么就可以考虑下一步了,也就是编写发送数据的方法和接收数据的方法。

def Send(socket_UDP, ip_port_Send):
    while True:
        data = input("请输输入你要发送的信息:")
        socket_UDP.sendto(data.encode("gbk"), ip_port_Send)
def Rece(socket_UDP):
    while True:
        data = socket_UDP.recvfrom(1024)
        """提取数据"""
        # 提取接收的信息
        data_Rece = data[0].decode("gbk")
        """提取ip及端口信息"""
        data_ip_port = data[1]
        # 提取ip信息
        ip = data_ip_port[0]
        # 提取端口信息
        port = data_ip_port[1]
        print("[*] 来自 %s:%s 的信息为:%s" % (ip, port, data_Rece))

利用threading模块实现多任务

我们现在已经把发送和接收两个方法写出来了,接下里就是使用threading模块了,其实也很贱单,这里我就不再说threading怎么用了。

    # 启用多线程
    t1 = threading.Thread(target=Send, args=(socket_UDP, ip_port_Send))
    t2 = threading.Thread(target=Rece, args=(socket_UDP,))
    t1.start()
    t2.start()

好了,接下来我们整合一下代码。

import socket
import threading


def main():
    # 创建套接字
    socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定本地信息
    ip_port_Rece = (("127.0.0.1"), 1234)
    socket_UDP.bind(ip_port_Rece)
    # 连接目标服务器
    ip = input("请输入目标IP:")
    port = int(input("请输入目标端口:"))
    # 目标信息
    ip_port_Send = ((ip), port)
    # 启用多线程
    t1 = threading.Thread(target=Send, args=(socket_UDP, ip_port_Send))
    t2 = threading.Thread(target=Rece, args=(socket_UDP,))
    t1.start()
    t2.start()


def Send(socket_UDP, ip_port_Send):
    while True:
        data = input("请输输入你要发送的信息:")
        socket_UDP.sendto(data.encode("gbk"), ip_port_Send)


def Rece(socket_UDP):
    while True:
        data = socket_UDP.recvfrom(1024)
        """提取数据"""
        # 提取接收的信息
        data_Rece = data[0].decode("gbk")
        """提取ip及端口信息"""
        data_ip_port = data[1]
        # 提取ip信息
        ip = data_ip_port[0]
        # 提取端口信息
        port = data_ip_port[1]
        print("[*] 来自 %s:%s 的信息为:%s" % (ip, port, data_Rece))


if __name__ == '__main__':
    main()

我们打开我们的网络调试工具进行测试看看。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值