用了一个下午,写出了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()