客户端代码
# acc_manage_cli.py
# 账户管理系统客户端
'''
数据格式
查询:
请求:
query::all 查询全部信息
query::62223450001 指定账户查询
响应:
账号:62223450001 ,户名:Harry ,余额:10000
新增:
请求:
new::62234500002::Tom::1::10.00
响应:
执行一笔操作
'''
from socket import *
client = None
host = '127.0.0.1'
port = 9999
def print_menu():
menu = '''
---------账户管理系统-----------
1 - 查询账户
2 - 新建账户
3 - 修改账户
4 - 删除账户
5 - 退出'''
print(menu)
def open_conn():# 连接到后台服务器
try:
global client
client = socket()
client.connect((host,port))
print('连接成功')
return 0
except:
print('连接服务器失败')
return -1
def new_acct(): # 新增账户
try:
acct_no = input('帐号:')
acct_name = input('户名:')
acct_type = input('账户类型:')
balance = float(input('开户金额:'))
assert balance >=10.0000
except:
print('输入有误')
else:
msg = 'new::%s::%s::%s::%.f'%(acct_no,acct_name,acct_type,balance)
print(msg)
if send_msg(msg) <0:
print('发送失败')
return
data = recv_msg()
if not data:
print('接收失败')
else:
print(data.decode())
def send_msg(msg):# 向服务器端发送数据
if not client: # Socket 没有初始化
return -1
n = client.send(msg.encode())# 调用Socket发送
return n
def recv_msg():
if not client:
return None
data = client.recv(2048) #接收2K
return data
def query_acct():# 查询账户
acct_no = input('请输入要查询的帐号:')
if not acct_no: # 非空
msg = 'query::'+acct_no
else:
msg = 'query::all' # 查询所有
if send_msg(msg) < 0: # 调用函数发送请求
print('发送失败')
return
data = recv_msg() # 接收查询结果
if not data:
print('查询失败')
else:
print(data.decode()) # 打印查询结果
def main(): # 主函数
open_conn() # 连接服务器
while True:
print_menu()
oper = input('请输入要执行的操作')
if not oper:
continue
if oper == '1': # 查询
query_acct()
if oper == '2': # 新增
new_acct()
if oper == '3': # 修改
pass
if oper == '4': # 删除
pass
if oper == '5': # 退出
break
else:
print('请输入正确的值')
main()
服务器端
# acc_manage_svr.py
# 账户管理系统服务端
from socket import *
import pymysql
# 数据库
db_host = '127.0.0.1'
db_user = 'root'
db_passwd = '123456'
db_name = 'test'
db_conn = None # 数据库连接对象
# 服务器
address = ('127.0.0.1',9999)
# 连接数据库
def conn_database():
global db_conn
db_conn = pymysql.connect(db_host,db_user,db_passwd,db_name)
if not db_conn:
print('连接失败')
return -1
else:
return 1
def close_data(): # 关闭数据库连接
if not db_conn:
return
else:
db_conn.close()
def query(msgs):
global db_conn
cursor = db_conn.cursor()
if msgs[1] == 'all':
sql = 'select * from acct'
else:
sql = 'select * from acct where acct_no = %s'%msgs[1]
print(sql)
try:
cursor.execute(sql)
result = cursor.fetchall()
for row in result:
acct_no = row[0]
acct_na = row[1]
balance = row[4]
acc_info = '帐号:%s,户名:%s,余额:%.2f\n'%(acct_no,acct_na,balance)
except:
print('查询错误')
return acc_info
def new_acct(msgs):
result = 0
global db_conn
cursor = db_conn.cursor() # 获取游标
acc_no = msgs[1] # 获取帐号
acc_name = msgs[2] # 获取户名
acc_type = msgs[3] # 获取类型
balance = msgs[4] # 获取金额
sql = "insert into acct values('%s','%s',now(),%s,%s)"%(acc_no,acc_name,acc_type,balance)
print(sql)
try:
result = cursor.execute(sql)
db_conn.commit() # 提交事物
except:
db_conn.rollback()
re = '操作结果影响%d行' % result
return re
def main(): # 服务器主程序
if conn_database():# 添加数据库长连接
return '数据库连接失败'
# Socket服务
server = socket()
server.bind(address)
server.listen(5)
print('服务已经启动')
sockfd,addr = server.accept()
# 循环接收
while True:
data = sockfd.recv(2048)
if not data:
print('客户端已经关闭')
break
# 解析 分发
print(data.decode())
msgs = data.decode().split('::') # 按::分割接收的数据
if msgs[0] == 'query':
result = query(msgs)
elif msgs[0] == 'new':
result = new_acct(msgs)
elif msgs[0] == 'update':
pass
elif msgs[0] == 'delete':
pass
else:
print('非法请求操作')
sockfd.send(result.encode()) # 发送处理结果
close_data() # 循环退出关闭数据库
server.close() # 关闭Socket监听
main()