python用udp实现图形化界面远程不同主机之间发送和接受文本信息多线程在线聊天具备托盘功能将信息显示出来和从输入框中获取ip和端口号代码
时间: 2024-02-20 12:56:03 浏览: 151
以下是一个基于UDP协议的Python多线程在线聊天程序的代码,具备图形化界面和托盘功能,能够在不同主机之间发送和接收文本信息,同时能够从输入框中获取IP和端口号信息:
```python
import threading
import socket
import tkinter as tk
import tkinter.scrolledtext as st
import tkinter.messagebox as mb
from tkinter import ttk
# 定义全局变量
local_ip = '127.0.0.1'
local_port = 8888
target_ip = ''
target_port = ''
sock = None
t_recv = None
t_send = None
# 接收消息
def recv_msg():
global sock
while True:
try:
data, addr = sock.recvfrom(1024)
msg = f'{addr[0]}:{addr[1]} >> {data.decode()}'
text.insert(tk.END, msg + '\n')
except ConnectionResetError:
mb.showinfo('提示', '对方已经关闭连接!')
break
# 发送消息
def send_msg():
global sock
global target_ip
global target_port
while True:
try:
msg = input_text.get()
if not msg:
continue
sock.sendto(msg.encode(), (target_ip, target_port))
input_text.set('')
except ConnectionResetError:
mb.showinfo('提示', '对方已经关闭连接!')
break
# 启动接收线程和发送线程
def start_chat():
global sock
global t_recv
global t_send
if not target_ip or not target_port:
mb.showinfo('提示', '请输入对方的IP地址和端口号!')
return
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((local_ip, local_port))
# 启动接收和发送线程
t_recv = threading.Thread(target=recv_msg)
t_send = threading.Thread(target=send_msg)
t_recv.start()
t_send.start()
# 关闭聊天
def close_chat():
global sock
global t_recv
global t_send
if t_recv and t_recv.is_alive():
t_recv.join()
if t_send and t_send.is_alive():
t_send.join()
if sock:
sock.close()
# 创建主窗口
root = tk.Tk()
root.title('UDP聊天')
root.geometry('400x300')
# 创建菜单栏
menubar = tk.Menu(root)
root.config(menu=menubar)
# 创建文件菜单
filemenu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label='文件', menu=filemenu)
filemenu.add_command(label='退出', command=root.quit)
# 创建帮助菜单
helpmenu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label='帮助', menu=helpmenu)
helpmenu.add_command(label='关于', command=lambda: mb.showinfo('关于', 'UDP聊天 V1.0'))
# 创建输入框和发送按钮
input_text = tk.StringVar()
input_frame = ttk.Frame(root)
input_frame.pack(side=tk.BOTTOM, fill=tk.X)
input_entry = ttk.Entry(input_frame, textvariable=input_text)
input_entry.pack(side=tk.LEFT, expand=True, fill=tk.X)
input_entry.bind('<Return>', lambda event: send_msg())
send_button = ttk.Button(input_frame, text='发送', command=send_msg)
send_button.pack(side=tk.RIGHT)
# 创建聊天窗口
text = st.ScrolledText(root, wrap=tk.WORD)
text.pack(expand=True, fill=tk.BOTH)
# 创建IP地址和端口号输入框
ip_frame = ttk.Frame(root)
ip_frame.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
ip_label = ttk.Label(ip_frame, text='目标IP地址:')
ip_label.pack(side=tk.LEFT)
ip_entry = ttk.Entry(ip_frame)
ip_entry.pack(side=tk.LEFT, expand=True, fill=tk.X)
port_label = ttk.Label(ip_frame, text='目标端口号:')
port_label.pack(side=tk.LEFT)
port_entry = ttk.Entry(ip_frame)
port_entry.pack(side=tk.LEFT)
# 创建连接和关闭按钮
button_frame = ttk.Frame(root)
button_frame.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
connect_button = ttk.Button(button_frame, text='连接', command=start_chat)
connect_button.pack(side=tk.LEFT)
close_button = ttk.Button(button_frame, text='关闭', command=close_chat)
close_button.pack(side=tk.LEFT)
# 创建系统托盘
tray = None
if 'win' in tk.Tk().windowingsystem.lower():
import ctypes
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID('UDPChat')
root.iconbitmap('icon.ico')
tray = tk.SystemTrayIcon(root, 'icon.ico', '')
tray.visible = True
root.mainloop()
```
这个程序使用了Python的socket模块创建UDP套接字,使用多线程技术实现了接收和发送消息的功能,同时使用了tkinter模块创建了图形化界面,并且使用了托盘功能将程序最小化到系统托盘。用户可以通过输入框输入目标主机的IP地址和端口号,然后点击连接按钮启动聊天功能。当用户输入消息并点击发送按钮时,消息会通过UDP协议发送给目标主机。同时,程序会在图形化界面上显示接收到的消息。当用户关闭聊天时,程序会关闭UDP套接字和线程。
阅读全文