编写UDP端口通信程序

 用了一个下午,写出了python UDP通信的实现:

import tkinter
from tkinter.font import Font
from tkinter.ttk import *
from socket import socket,AF_INET,SOCK_DGRAM
from socketserver import BaseRequestHandler,UDPServer
from tkinter.scrolledtext import *
from threading import Thread
def listen():
    server=UDPServer(("",output),Chat)
    server.serve_forever()
def login():
    global logintext,yesbt,nameen,name,root,outputen,output,outputtext
    name=nameen.get()
    logintext.config(text=f"Hello,{name}")
    sendbt=tkinter.Button(root,text="send",command=Mailbox)
    nameen.pack_forget()
    outputen.pack_forget()
    yesbt.pack_forget()
    outputtext.pack_forget()
    guibt=tkinter.Button(root,text="GUI",command=gui)
    sendbt.pack()
    guibt.pack()
    output=int(outputen.get())
    Thread(target=listen).start()
class Chat(BaseRequestHandler):
    def handle(self):
        global mail
        msg,sock=self.request
        mail.append(msg)
class Mailbox():
    def __init__(self):
        global screen,mailtext,toen
        screen=tkinter.Toplevel()
        screen.geometry("400x450")
        fromtext=tkinter.Label(screen,text=f"From:{name}\noutput:{output}")
        totext=tkinter.Label(screen,text="To:")
        toen=tkinter.Entry(screen)
        mailtext=tkinter.Text(screen)
        yesbt2=tkinter.Button(screen,text="OK",command=self.send)
        fromtext.pack()
        totext.pack()
        toen.pack()
        mailtext.pack()
        yesbt2.pack()
    def send(self):
        server2=socket(AF_INET,SOCK_DGRAM)
        text=f"from:{name}\noutput:{output}\n"+mailtext.get("1.0",tkinter.END)
        server2.sendto(text.encode(),('localhost',int(toen.get())))
        screen.destroy()
def gui():
    global mail,guitext
    guiw=tkinter.Toplevel()
    guitext=ScrolledText(guiw,undo=True)
    guibt2=tkinter.Button(guiw,text="Refresh",command=refresh_gui)
    refresh_gui()
    guibt2.pack()
def refresh_gui():
    for m in mail:
        guitext.insert(tkinter.END,m)
    guitext.pack()
if __name__ == "__main__":
    mail=[]
    root=tkinter.Tk()
    root.title("LetChat")
    root.geometry("400x200")
    titletext=tkinter.Label(root,text="Let Chat")
    titletext.config(font=Font(size=30))
    logintext=tkinter.Label(root,text="login")
    outputtext=tkinter.Label(root,text="output(8000<=output<=25000)")
    nameen=tkinter.Entry(root)
    yesbt=tkinter.Button(root,text="yes",command=login)
    outputen=tkinter.Entry(root)
    titletext.pack()
    logintext.pack()
    nameen.pack()
    outputtext.pack()
    outputen.pack()
    yesbt.pack()

这个程序是一个类似于e-mail的应用,但必须在对方在线的时候使用。

1.0v

在编写服务器时,发现UDP会使tkinter未响应,于是用了多线程threading.Thread来多线程(此灵感来源于https://cloud.tencent.com/developer/article/1703172)感谢!

最后造福没有登陆的人~awa

import tkinter
from tkinter.font import Font
from tkinter.ttk import *
from socket import socket,AF_INET,SOCK_DGRAM
from socketserver import BaseRequestHandler,UDPServer
from tkinter.scrolledtext import *
from threading import Thread
def listen():
    server=UDPServer(("",output),Chat)
    server.serve_forever()
def login():
    global logintext,yesbt,nameen,name,root,outputen,output,outputtext
    name=nameen.get()
    logintext.config(text=f"Hello,{name}")
    sendbt=tkinter.Button(root,text="send",command=Mailbox)
    nameen.pack_forget()
    outputen.pack_forget()
    yesbt.pack_forget()
    outputtext.pack_forget()
    guibt=tkinter.Button(root,text="GUI",command=gui)
    sendbt.pack()
    guibt.pack()
    output=int(outputen.get())
    Thread(target=listen).start()
class Chat(BaseRequestHandler):
    def handle(self):
        global mail
        msg,sock=self.request
        mail.append(msg)
class Mailbox():
    def __init__(self):
        global screen,mailtext,toen
        screen=tkinter.Toplevel()
        screen.geometry("400x450")
        fromtext=tkinter.Label(screen,text=f"From:{name}\noutput:{output}")
        totext=tkinter.Label(screen,text="To:")
        toen=tkinter.Entry(screen)
        mailtext=tkinter.Text(screen)
        yesbt2=tkinter.Button(screen,text="OK",command=self.send)
        fromtext.pack()
        totext.pack()
        toen.pack()
        mailtext.pack()
        yesbt2.pack()
    def send(self):
        server2=socket(AF_INET,SOCK_DGRAM)
        text=f"from:{name}\noutput:{output}\n"+mailtext.get("1.0",tkinter.END)
        server2.sendto(text.encode(),('localhost',int(toen.get())))
        screen.destroy()
def gui():
    global mail,guitext
    guiw=tkinter.Toplevel()
    guitext=ScrolledText(guiw,undo=True)
    guibt2=tkinter.Button(guiw,text="Refresh",command=refresh_gui)
    refresh_gui()
    guibt2.pack()
def refresh_gui():
    for m in mail:
        guitext.insert(tkinter.END,m)
    guitext.pack()
if __name__ == "__main__":
    mail=[]
    root=tkinter.Tk()
    root.title("LetChat")
    root.geometry("400x200")
    titletext=tkinter.Label(root,text="Let Chat")
    titletext.config(font=Font(size=30))
    logintext=tkinter.Label(root,text="login")
    outputtext=tkinter.Label(root,text="output(8000<=output<=25000)")
    nameen=tkinter.Entry(root)
    yesbt=tkinter.Button(root,text="yes",command=login)
    outputen=tkinter.Entry(root)
    titletext.pack()
    logintext.pack()
    nameen.pack()
    outputtext.pack()
    outputen.pack()
    yesbt.pack()
 

Python连接TCP未开启端口时程序“假死”的解决办法-腾讯云开发者社区-腾讯云 (tencent.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值