2.利用套接字、多线程、GUI和数据库,参考[例13-简单的C-S结构程序]或[例13-基于C-S结构的学生基本信息管理系统],实现一个C/S结构的查询服务器上数据库表的程序,可以按学号查询、按姓名查询。[50]写出示例代码
时间: 2024-03-15 15:44:34 浏览: 50
好的,下面是一个基于Python的示例代码,实现了一个C/S结构的查询服务器上数据库表的程序,可以按学号查询、按姓名查询。代码注释中有详细的说明。
服务器端代码:
```python
import socket
import threading
import sqlite3
# 定义服务器地址和端口号
HOST = '127.0.0.1'
PORT = 8888
# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口号
server_socket.bind((HOST, PORT))
# 开始监听连接
server_socket.listen()
# 定义处理客户端请求的函数
def handle_client(client_socket, address):
try:
print('Connection from', address)
while True:
# 接收客户端发送的数据
data = client_socket.recv(1024).decode()
if not data:
break
# 解析查询条件
query = data.split(',')
if len(query) != 2:
continue
field = query[0]
value = query[1]
# 连接数据库
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
# 查询数据
if field == 'id':
cursor.execute("SELECT * FROM students WHERE id=?", (value,))
elif field == 'name':
cursor.execute("SELECT * FROM students WHERE name=?", (value,))
else:
continue
results = cursor.fetchall()
# 发送查询结果给客户端
for row in results:
client_socket.send(str(row).encode())
# 关闭数据库连接
cursor.close()
conn.close()
except Exception as e:
print(e)
finally:
# 关闭客户端连接
client_socket.close()
print('Connection from', address, 'closed')
while True:
# 接受客户端连接请求
client_socket, address = server_socket.accept()
# 创建一个新的线程来处理客户端请求
client_thread = threading.Thread(target=handle_client, args=(client_socket, address))
client_thread.start()
```
客户端代码:
```python
import socket
import tkinter as tk
# 定义服务器地址和端口号
HOST = '127.0.0.1'
PORT = 8888
# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect((HOST, PORT))
# 定义GUI界面
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
# 添加Label和Entry组件,用于输入查询条件
self.id_label = tk.Label(self)
self.id_label['text'] = 'ID:'
self.id_label.grid(row=0, column=0)
self.id_entry = tk.Entry(self)
self.id_entry.grid(row=0, column=1)
self.name_label = tk.Label(self)
self.name_label['text'] = 'Name:'
self.name_label.grid(row=1, column=0)
self.name_entry = tk.Entry(self)
self.name_entry.grid(row=1, column=1)
# 添加Button组件,用于提交查询请求
self.submit_button = tk.Button(self)
self.submit_button['text'] = 'Submit'
self.submit_button['command'] = self.submit_query
self.submit_button.grid(row=2, column=1)
# 添加Text组件,用于显示查询结果
self.result_text = tk.Text(self)
self.result_text['width'] = 40
self.result_text['height'] = 10
self.result_text.grid(row=3, column=1)
# 定义提交查询请求的函数
def submit_query(self):
# 获取查询条件
id = self.id_entry.get()
name = self.name_entry.get()
# 构造查询字符串
if id:
query = 'id,' + id
elif name:
query = 'name,' + name
else:
return
# 发送查询请求给服务器
client_socket.send(query.encode())
# 接收并显示查询结果
self.result_text.delete('1.0', tk.END)
while True:
data = client_socket.recv(1024).decode()
if not data:
break
self.result_text.insert(tk.END, data)
# 创建GUI界面
root = tk.Tk()
app = Application(master=root)
app.mainloop()
# 关闭socket连接
client_socket.close()
```
注意:以上示例代码仅供参考,可能存在一些问题和不足之处,需要根据具体需求进行修改和完善。
阅读全文