服务端代码逻辑大致为:
- 创建一个基于 tkinter 的 GUI 窗口,用于展示聊天内容和接收用户输入的消息。
- 创建一个 UDP 套接字
server_socket
,并绑定到本地地址127.0.0.1:9999
。 - 使用
start_server
函数作为一个线程,在一个循环中接收来自客户端的消息,并将消息显示在 GUI 窗口的文本框中。同时将接收到的消息写入聊天记录文件。 - 当用户在 GUI 窗口中输入消息并点击发送按钮时,调用
send_message
函数,将消息发送给客户端,并在 GUI 窗口中显示发送的消息。同时将发送的消息写入聊天记录文件。 - 提供了退出聊天室和查看聊天记录的功能。
- 通过
read_record
函数,用户可以输入日期来查询当天的聊天记录,并在 GUI 窗口中显示出来。 - 最后启动 GUI 界面并进入主事件循环
客户端代码,大致逻辑为:
1. 在 `client_interface` 函数中创建了一个 GUI 窗口,包括标题、输入框、发送按钮、退出按钮、查询聊天记录按钮以及一个显示聊天内容的文本框。同时设置了一个隐藏的用于显示聊天记录的窗口。
2. 创建了一个 UDP 套接字 client_socket,并向服务器地址 127.0.0.1:9999 发送初始连接消息,然后启动一个线程receive_message 来接收服务器发送的消息。
3. send_messag 函数用于发送用户输入的消息给服务器,并将发送的消息显示在 GUI 窗口中。同时将消息内容和发送时间保存到聊天记录文件中。
4. quit_chat函数用于停止程序运行,关闭套接字并退出窗口。
5. read_record 函数用于查询聊天记录文件中特定日期的聊天记录,并在窗口中显示出来。
6. save_data 函数用于保存聊天记录数据到文件中,实现了聊天记录的简单管理功能。
7. 在 __main__ 中初始化了一些变量,并启动了客户端界面的主循环。
总体来说,这段代码实现了一个简单的客户端聊天室程序,用户可以在界面上输入消息发送给服务器,同时可以查看聊天记录和退出程序。
聊天界面运行结果:
聊天记录查询结果:
服务端代码
import tkinter
import threading
import socket
import json
import datetime
def start_server():
global server_socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('127.0.0.1', 9999))
receive_message()
def receive_message():
global client_addr
global text_box,current_time
while not stop_event.is_set():
try:
server_socket.settimeout(1.0)
recv_data, client_addr = server_socket.recvfrom(1024)
print(f"Server received data from {client_addr}")
if recv_data:
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
data=recv_data.decode('utf-8'