python实现电子词典

作者:RareJie 时间:2021-12-19 08:29:03 

本文实例为大家分享了python实现电子词典的具体代码,供大家参考,具体内容如下

服务端


#!/usr/bin/env python3
from __future__ import unicode_literals
# coding=utf-8

from socket import *
import os
import pymysql
import time
import sys
import signal

DICT_TEXT = "./dict.txt"
HOST = '0.0.0.0'
PORT = 8000
ADDR = (HOST, PORT)

# 主控制流程

def main():
# 连接数据库
db = pymysql.connect\
('localhost', 'root', '123456', 'dict')

# 创建流式套接字
s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen(5)
# 或略子进程退出
signal.signal(signal.SIGCHLD, signal.SIG_IGN)

while True:
try:
 c, addr = s.accept()
 print("Connect from", addr)
except KeyboardInterrupt:
 s.close()
 sys.exit("服务器退出")
except Exception as e:
 print(e)
 continue
# 创建子进程处理客户端请求
pid = os.fork()
if pid == 0:
 s.close()
 do_child(c, db)
else:
 c.close()

def do_child(c, db):
# 循环接收请求
while True:
data = c.recv(128).decode()
print("Request:", data)
if (not data) or data[0] == 'E':
 c.close()
 sys.exit(0)
elif data[0] == 'R':
 do_register(c, db, data)
elif data[0] == "L":
 do_login(c, db, data)
elif data[0] == 'Q':
 do_query(c, db, data)
elif data[0] == 'H':
 do_history(c, db, data)

def do_register(c, db, data):
l = data.split(' ')
name = l[1]
passwd = l[2]

cursor = db.cursor()
sql = \
"select * from user where name='%s'" % name
cursor.execute(sql)
r = cursor.fetchone()
if r != None:
c.send(b'EXISTS')
return

sql = "insert into user (name,passwd)\
values ('%s','%s')" % (name, passwd)
try:
cursor.execute(sql)
db.commit()
c.send(b'OK')
except:
db.rollback()
c.send(b'FALL')
return
else:
print("%s注册成功" % name)

def do_login(c, db, data):
l = data.split(' ')
name = l[1]
passwd = l[2]
cursor = db.cursor()

sql = "select * from user where \
name='%s' and passwd='%s'" % (name, passwd)

cursor.execute(sql)
r = cursor.fetchone()
if r == None:
c.send('用户名或密码不正确'.encode())
else:
c.send(b'OK')

def do_query(c, db, data):
l = data.split(' ')
name = l[1]
word = l[2]
cursor = db.cursor()

def insert_history():
tm = time.ctime()
sql = "insert into hist (name,word,time)\
 values ('%s','%s','%s')" % (name, word, tm)
try:
 cursor.execute(sql)
 db.commit()
except:
 db.rollback()
 return

try:
f = open(DICT_TEXT, 'rb')
except:
c.send("500 服务端异常".encode())
return
while True:
line = f.readline().decode()
w = line.split(' ')[0]
if (not line) or w > word:
 c.send("没找到该单词".encode())
 break
elif w == word:
 c.send(b'OK')
 time.sleep(0.1)
 c.send(line.encode())
 insert_history()
 break
f.close()

def do_history(c, db, data):
name = data.split(' ')[1]
cursor = db.cursor()

try:
sql = "select * from hist \
where name='%s'" % name
cursor.execute(sql)
r = cursor.fetchall()
if not r:
 c.send('没有历史记录'.encode())
 return
else:
 c.send(b'OK')
except:
c.send("数据库查询错误".encode())
return
n = 0
for i in r:
n += 1
# 最多显示10条
if n > 10:
 break
time.sleep(0.1)
msg = "%s %s %s" % (i[1], i[2], i[3])
c.send(msg.encode())
time.sleep(0.1)
c.send(b'##')

if __name__ == "__main__":
main()

客户端


#!/usr/bin/env python3
#coding=utf-8

from socket import *
import sys
import getpass

def main():
if len(sys.argv) < 3:
print("argv is error")
return
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT)

s = socket()
s.connect(ADDR)

while True:
print('''\n
 ===========Welcome=========
 --1.注册 2.登录 3.退出--
 ===========================
 ''')
try:
 cmd = int(input("输入选项>>"))
except Exception:
 print("输入命令错误")
 continue

if cmd not in [1,2,3]:
 print("对不起,没有该命令")
 sys.stdin.flush() #清除输入
 continue
elif cmd == 1:
 name = do_register(s)
 if name != 1:
 print("注册成功,直接登录!")
 login(s,name)
 else:
 print("注册失败!")
elif cmd == 2:
 name = do_login(s)
 if name != 1:
 print("登录成功!")
 login(s,name)
 else:
 print("登录失败!")
elif cmd == 3:
 s.send(b"E")
 sys.exit("谢谢使用")

def do_register(s):
while True:
name = input("用户名:")
passwd = getpass.getpass("密 码:")
passwd1 = getpass.getpass("确认密码:")

if (' ' in name) or (' ' in passwd):
 print("用户名密码不允许空格")
 continue
if passwd != passwd1:
 print("两次密码不一致")
 continue

msg = "R {} {}".format(name,passwd)
#发送请求
s.send(msg.encode())
#接收回复
data = s.recv(128).decode()

if data == "OK":
 return name
elif data == 'EXISTS':
 print("该用户已存在")
 return 1
else:
 return 1
def do_login(s):
name = input("用户名:")
passwd = getpass.getpass("密 码:")
msg = "L {} {}".format(name,passwd)
s.send(msg.encode())
data = s.recv(128).decode()

if data == 'OK':
return name
else:
print(data)
return 1

def login(s,name):
while True:
print('''\n
 ===========查询界面============
 1.查词 2.历史记录 3.注销
 =============================
 ''')
try:
 cmd = int(input("输入选项>>"))
except Exception:
 print("命令错误")
 continue
if cmd not in [1,2,3]:
 print("对不起,没有该命令")
 sys.stdin.flush() #清除输入
 continue
elif cmd == 1:
 do_query(s,name)
elif cmd == 2:
 do_history(s,name)
elif cmd == 3:
 return

def do_query(s,name):
while True:
word = input("单词:")
if word == "##":
 break
msg = "Q {} {}".format(name,word)
s.send(msg.encode())
data = s.recv(128).decode()
if data == 'OK':
 data = s.recv(2048).decode()
 print(data)
else:
 print(data)

def do_history(s,name):
msg = "H {}".format(name)
s.send(msg.encode())
data = s.recv(128).decode()
if data == 'OK':
while True:
 data = s.recv(1024).decode()
 if data == "##":
 break
 print(data)
else:
print(data)

if __name__ == "__main__":
main()

插入字典


import pymysql
import re

f = open('dict.txt')
db = pymysql.connect\
('localhost','root','123456','dict')

cursor = db.cursor()

for line in f:
try:
l = re.split("[ ]+",line)
except:
pass
sql = "insert into words (word,interpret)\
values ('%s','%s')"%(l[0],' '.join(l[1:]))

try:
cursor.execute(sql)
db.commit()
except:
db.rollback()

f.close()

python实现电子词典

python实现电子词典

来源:https://blog.csdn.net/RareJie/article/details/82773825

标签:python,电子词典
0
投稿

猜你喜欢

  • Go语言递归函数的具体实现

    2023-08-05 02:35:32
  • python通过函数属性实现全局变量的方法

    2023-08-25 04:54:20
  • ASP中使用Set ors=oConn.Execute()时获取记录数的方法

    2011-02-20 10:48:00
  • pycharm sciview的图片另存为操作

    2022-09-26 08:03:07
  • PyQt5实现简易计算器

    2022-12-14 02:12:38
  • python 打印出所有的对象/模块的属性(实例代码)

    2023-09-02 21:46:15
  • Python机器学习NLP自然语言处理基本操作词向量模型

    2022-01-16 10:33:42
  • String.indexOf 方法介绍

    2013-06-01 20:22:27
  • php的ajax框架xajax入门与试用介绍

    2023-09-27 14:46:16
  • CSS3的新特性

    2009-03-23 17:46:00
  • 如何解决因使用On Error Resume Next导致错误不正确的问题?

    2009-12-16 18:34:00
  • python函数运行内存时间等性能检测工具

    2021-04-08 02:24:00
  • Python实现简单的文本相似度分析操作详解

    2023-07-18 11:16:12
  • ServerXMLHTTP的setTimeouts超时设置

    2010-01-02 20:38:00
  • 不能使用“;文件已在使用中 Microsoft JET Database Engine

    2012-12-04 20:34:36
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    2023-05-04 05:09:51
  • Python基于正则表达式实现计算器功能

    2021-08-17 13:00:02
  • 使用PHP实现微信摇一摇周边红包

    2023-11-14 12:04:22
  • Access2003:不支持这种ActiveX控件

    2010-12-09 19:59:00
  • Python Pygame中精灵和碰撞检测详解

    2021-01-31 05:45:27
  • asp之家 网络编程 m.aspxhome.com