图形化UDP发包小工具


前言

工具编写用的语言是python,组件采用的是tkiner组件,可以对指定目标地址和端口,发送消息,界面简单清晰


一、构思

在主窗口,用户填写对应的IPV4地址,服务器的端口号,要发送的消息内容,线程数量,发送消息的数量,点击发送按钮,即可发送UDP包给指定的服务器,并且将发送的数据包的大小以及服务器返回的内容,通过子窗口文本的形式展示出来

二、用到的python模块

tkiner模块

目前很火的编程语言:java,python等都有自己GUI界面编写模块,tkiner是python中用于图形化界面编写的模块

tkiner模块下载

win+R 打开运行框,输入cmd

需要安装python环境,并加入到环境变量,才可执行如下的命令

在DOS窗口输入如下命令

pip install tkiner

socket模块

socket模块是python中网络编程必用的模块,编写客户端和服务端的代码,必须采用socket模块进行连接,通信,数据的传输等,在java中也有相应的网络编程模块,socket(AF_INET,SOCK_DGRAM)返回的是一个非连接的通信对象,采用UDP传输,socket(AF_INET,SOCK_STRAM)返回的是一个面向连接的通信对象,采用TCP传输

ThreadPoolExecutor模块

ThreadPoolExecutor模块是python中线程池需要的模块,本次的udp发包小工具,用到了线程池,所以这个模块也是必须的

导入方式

from concurrent.futures import ThreadPoolExecutor

编码实现

由于本次测试的环境都是本地机器,所以客户端代码和服务端代码都是在本地上,话不多说,下面附上代码

客户端

from tkinter import *
import tkinter.messagebox
from socket import *
from concurrent.futures import ThreadPoolExecutor
# 客户端代码
if __name__ == '__main__':
    root = Tk()
    root.geometry("600x600+300+300")
    send_result = []
    get_result_index = 0
    def get_result(args):
        server_address = args[0]
        server_port = args[1]
        send_msg = args[2]
        client_socket = socket(AF_INET,SOCK_DGRAM)
        return_result = client_socket.sendto(send_msg.encode('utf8'),(server_address,int(server_port)))
        serverMsg,serverAddress = client_socket.recvfrom(1024)
        result_Text_Obj = args[3]
        result_Text_Obj.insert('end',"发送字节大小为"+str(return_result)+'\n服务器返回内容#'+serverMsg.decode('utf8')+'\n')

    def sendMsg(ipv4addr,msg,serverPort,thread_pool_number=10,msg_number=100):
        # ipv4addr = ipv4_entry.get()
        # msg = msg_entry.get()
        if (ipv4addr == "" or msg == "" or serverPort==""):
            tkinter.messagebox.showinfo(title="数据异常", message="请填写完整的数据")
        else:
            # 开始连接服务端,发送数据
            # from socket import *
            # serverName = '192.168.3.8'
            # serverPort = 12345
            # clientSocket = socket(AF_INET, SOCK_DGRAM)
            # while 1:
            #     message = input().encode()
            #     clientSocket.sendto(message, (serverName, serverPort))
            #     modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
            #     print(modifiedMessage)
            # clientSocket.close()
            serverName=ipv4addr
            sport = serverPort
            root2 = Tk()
            root2.title("获得结果")
            root2.geometry('300x300+100+100')
            result_Text = Text(root2, width=200, height=200)
            result_Text.place(x=10, y=10, width=280, height=280)
            pool = ThreadPoolExecutor(int(thread_pool_number))
            for i in range(int(msg_number)+1):
                pool.submit(get_result,args=(serverName,sport,msg,result_Text))
            root2.mainloop()


    root.title("UDP消息发送客户端")
    label = Label(root,justify="center",text="IPV4addr",padx="10",pady="10",relief="groove").place(x=100,y=100,width=80,height=50)
    ipv4_entry = Entry(root,justify="center",width="100",relief="groove")
    ipv4_entry.place(x=180,y=100,width=180,height=50)
    ipv4_info_text = Label(root,justify="center",text="例如:192.168.10.100,无需掩码",padx="10",pady="10").place(x=380,y=100,width=180,height=50)
    send_msg_info_text = Label(root,justify="center",text="消息",padx="10",pady="10",relief="groove").place(x=100,y=160,width=80,height=50)
    msg_entry = Entry(root,justify="center",width="100",relief="groove")
    msg_entry.place(x=180,y=160,width=200,height=50)
    port_label = Label(root, justify="center", text="端口号", padx="10", pady="10").place(x=100, y=220,width=100, height=50)
    port_entry = Entry(root,justify="center",width="100",relief="groove")
    port_entry.place(x=210,y=220,width=100,height=50)
    #获取线程数量,使用线程去跑
    thread_pool_number_label = Label(root,justify="center",padx="10",pady="10",text="线程").place(x=100,y=290,width=100,height=50)
    thread_pool_number_entry = Entry(root,justify="center",width="100",relief="groove")
    thread_pool_number_entry.place(x=210,y=290,width=100,height=50)
    thread_pool_info_label = Label(root,justify="center",padx="10",pady="10",text="默认线程数量10").place(x=320,y=290,width=100,height=50)
    #设置发送消息数量
    msg_number_label = Label(root,justify='center',padx="10",pady="10",text="发送数量").place(x=100,y=360,width=100,height=50)
    msg_number_entry = Entry(root,justify="center",width=100,relief="groove")
    msg_number_entry.place(x=210,y=360,width=100,height=50)
    msg_number_info_label = Label(root,justify="center",padx="10",pady="10",text="默认数量100").place(x=320,y=360,width=100,height=50)
    #防止按钮自动触发函数,添加 lambda 函数添加一个参数, 或者去掉括号,不带参数
    send_Btn = Button(root,justify="center",padx="10",pady="10",text="发送",command=lambda:sendMsg(ipv4_entry.get(),msg_entry.get(),port_entry.get(),thread_pool_number_entry.get(),msg_number_entry.get()),width=100,height=50)
    send_Btn.place(x=100,y=420,width=100,height=50)
    root.mainloop()

服务端代码

from socket import *
import datetime
#udp服务端代码
# from socket import *
# serverPort=12345
# serverSocket=socket(AF_INET,SOCK_DGRAM)
# serverSocket.bind(('192.168.3.8',serverPort))
# print('ready')
# while 1:
#     message,clientAddress=serverSocket.recvfrom(2048)
#     modifiedMessage=message.upper()
#     print(modifiedMessage)
#     serverSocket.sendto(modifiedMessage,clientAddress)
serverport = 12345
serverSocket = socket(AF_INET,SOCK_DGRAM)
serverSocket.bind(('127.0.0.1',serverport))
while 1:
    message,clientAddress = serverSocket.recvfrom(1024)
    print(message.decode('utf8')+"####"+str(datetime.datetime.now()))
    serverSocket.sendto(('服务端已收到'+message.decode('utf8')).encode('utf8'),clientAddress)


三、运行结果

客户端

在这里插入图片描述

发送消息

在这里插入图片描述

在这里插入图片描述

服务端

在这里插入图片描述


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Windows操作系统上,我们有很多UDP发包工具可供选择。以下是一些常见的UDP发包工具和它们的简要介绍: 1. Packet Sender:Packet Sender是一款简单易用的UDP/TCP网络发包工具,可以在Windows平台上发送UDP包。它提供了用户友好的界面,可以轻松设置源和目标IP地址、端口号、数据包内容等参数,并实时查看发送和接收的数据包。 2. Netcat:Netcat(也称为NC)是一个多功能的网络工具,也可以用作UDP发包工具。它是一个命令行工具,在Windows平台上提供了类Unix的shell环境,可以通过命令行参数指定要发送的UDP数据包的内容和目的地。 3. Hping:Hping是一个非常强大的网络工具,也可以用来发送UDP数据包。它具有灵活的命令行接口,可以通过指定不同的选项和参数来定制要发送的UDP包的各个方面,如IP地址、端口、标记等。Hping还可以用于网络安全测试和调试等方面。 4. Nping:Nping是一个网络工具,专门设计用于进行网络探测和安全测试。它支持发送各种类型的网络流量,包括UDP包。通过指定参数、设置负载和其他选项,用户可以使用Nping对目标主机进行UDP网络探测、性能测试和安全审计。 总之,在Windows系统上有许多可选择的UDP发包工具,每个工具都有其自身的特点和用途。选择适合自己需求的工具,并根据自己的需求来设置参数,以便在网络测试、调试或安全评估等场景中使用UDP发包工具。 ### 回答2: UDP发包工具是一种用于测试网络传输性能的工具,在Windows系统上有许多可用的UDP发包工具。以下是几种常见的UDP发包工具: 1. Iperf:Iperf是一个开源的网络性能测试工具,可以通过UDP或TCP发送数据包来测试网络带宽、延迟和抖动等性能指标。它可以通过命令行界面或图形界面使用,非常方便实用。 2. PackETH:PackETH是一个简单而强大的网络分组发包工具,可以用于发送自定义的UDP数据包。它具有图形用户界面,可以轻松设置数据包的源地址、目标地址、端口号以及数据负载,非常适用于网络测试和研究。 3. UDP Tester:UDP Tester是一个简单但实用的UDP数据包发包工具。它可以发送UDP数据包,并显示接收到的回应时间和丢包率。UDP Tester具有直观的用户界面,可以轻松设置发送数据包的目标地址、端口号以及发送的数据负载。 4. Nping:Nping是一个流行的网络发包工具,可以用于发送各种类型的网络数据包。它支持灵活的数据包生成和定制,可以发送UDP、TCP、ICMP等协议的数据包。Nping可以通过命令行界面来使用,非常适合用于网络测试和诊断。 这些UDP发包工具在Windows系统上都有很好的兼容性,并提供了丰富的功能和选项,可以帮助用户进行各种网络性能测试和调试。无论是简单的带宽测试还是复杂的网络协议研究,这些工具都可以满足用户的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值