0
点赞
收藏
分享

微信扫一扫

Python的UDP通讯(收发一体、多线程)

陌岛 2022-04-01 阅读 57
python
想着自己做一个上位机,用labview的话还要装软件和驱动,用python装一个解释器就ok了比较省事,这个只是个dome!刚学python三个小时!若有错误请见谅,请指导,谢谢!代码如下!
import time
from socket import *
from threading import Thread
from tkinter import *  # 导入tkinter文件库
from tkinter import Frame  # 库文件入口

# UdpSocket = None
AddrIP = '192.168.0.10'
AddrPort = 50000


# ------------------------------ Send() ----------------------------- #
def SendData():
    while True:
        Data = "这是UDP发送数据!"
        UdpSocket.sendto(Data.encode('gb2312'), (AddrIP, AddrPort))
        # print(AddrIP, AddrPort)
        time.sleep(1)


# ------------------------------ Recv() ----------------------------- #
def RecvfromData():
    while True:
        global text1
        TempData = UdpSocket.recvfrom(1024)
        # cur = datetime.datetime.now()  # 获取当前系统时间
        print("从[%s:%d]接收到了:%s" % (TempData[1][0], TempData[1][1], TempData[0].decode("GB2312")))
        text1.insert(END, TempData)
        # text1.insert(END, cur)
        text1.insert(END, "\n")  # INSERT索引表示插入光标当前的位置
        text1.see(END)  # 跟随Y轴滚动轴向下
        time.sleep(0.1)


# ------------------------------ main() ----------------------------- #
def main():
    init_window = Tk()
    init_window.title('UDP收发检测-下位机控制')  # 标题
    init_window.geometry("730x400")  # UI尺寸 长 * 宽

    frame_root = Frame(init_window)
    frame_left: Frame = Frame(frame_root)
    frame_right = Frame(frame_root)

    frame5 = Frame(frame_root)
    frame5.pack(side=TOP)
    frame6 = Frame(frame_root)
    frame6.pack(side=TOP)

    global text1, text2
    # ------------------------------ 文本设置() ----------------------------- #
    text1 = Text(frame5, width=100, height=10, bg='Pink')  # 边框颜色
    text1.grid(column=0, row=0)
    s1 = Scrollbar(text1)
    s1.pack(side=RIGHT, fill=Y)

    text1 = Text(text1, yscrollcommand=s1.set, wrap='none', width=100, height=10, bg='LightSteelBlue',
                 font=("华文宋体", 10))
    text1.pack(expand=YES, fill=BOTH)
    s1.config(command=text1.yview)

    text2 = Text(frame6, width=100, height=10, bg='Pink')  # 边框颜色
    text2.grid(column=0, row=0)
    s2 = Scrollbar(text2)
    s2.pack(side=RIGHT, fill=Y)

    text2 = Text(text2, yscrollcommand=s2.set, wrap='none', width=100, height=10, bg='LightSteelBlue',
                 font=("华文宋体", 10))
    text2.pack(expand=YES, fill=BOTH)
    s2.config(command=text2.yview)
    # ------------------------------ key() ----------------------------- #
    button2 = Button(frame6, text="发送", width=14, height=1, bg='red', activebackground="SlateGray",
                     justify="left")  # 按键2(发送按钮)属性
    button2.bind("<Button-1>", lambda event:
    UdpSocket.sendto(text2.get("0.0", "end").encode("GB2312"), (AddrIP, AddrPort)))  # 给按键2绑定串口发送功能
    button2.grid(column=0, row=1, sticky=E)  # sticky=E 靠右放置

    button3 = Button(frame6, text="自定义", width=14, height=1, bg='green', activebackground="SlateGray",
                     justify="left")  # 按键2(发送按钮)属性
    button3.bind("<Button-1>", lambda event:
    UdpSocket.sendto("自定义的命令!".encode("GB2312"), (AddrIP, AddrPort)))  # 给按键2绑定串口发送功能
    button3.grid(column=0, row=2, sticky=E)  # column列数  row行数   sticky=E 靠右放置

    button3 = Button(frame6, text="清除接收", width=14, height=1, bg='blue', activebackground="SlateGray",
                     justify="left")  # 按键2(发送按钮)属性
    button3.bind("<Button-1>", lambda event:
    text1.delete('1.0', 'end'))  # 给按键2绑定串口发送功能
    button3.grid(column=0, row=3, sticky=E)  # sticky=E 靠右放置

    button4 = Button(frame6, text="清除发送", width=14, height=1, bg='yellow', activebackground="SlateGray",
                     justify="left")  # 按键2(发送按钮)属性
    button4.bind("<Button-1>", lambda event:
    text2.delete('1.0', 'end'))  # 给按键2绑定串口发送功能
    button4.grid(column=0, row=4, sticky=E)  # sticky=E 靠右放置

    global UdpSocket  # 全局变量
    global TempData  # 全局变量
    # ------------------------------ UDP配置() ----------------------------- #
    UdpSocket = socket(AF_INET, SOCK_DGRAM)
    UdpSocket.bind(('', 7788))
    ts = Thread(target=SendData)
    tr = Thread(target=RecvfromData)
    ts.start()
    tr.start()

    frame_left.pack(side=LEFT)
    frame_right.pack(side=RIGHT)
    frame_root.pack()
    init_window.mainloop()


if __name__ == "__main__":
    main()

# ------------------------------ END() ----------------------------- #
# 运行PYTHON代码的这个电脑的IP是对方电脑的远程主机192.168.0.121 端口7788 对应:UdpSocket.bind(('', 7788))
# AddrIP = '192.168.0.10' AddrPort = 50000 为对方电脑的本地主机地址和本地主机端口
# label.grid(row=0, column=2, rowspan=2, columnspan=2,sticky = W + E + N + S, padx = 5, pady = 5)  # 合并两行,两列,居中,四周外延5个长度
举报

相关推荐

0 条评论