python实现电子词典


Posted in Python onMarch 03, 2020

本文实例为大家分享了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实现电子词典

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python里大整数相乘相关技巧指南
Sep 12 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
python pygame模块编写飞机大战
Nov 20 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python中异常处理用法
Nov 27 Python
python关于变量名的基础知识点
Mar 03 #Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 #Python
python 插入日期数据到Oracle实例
Mar 02 #Python
Python datetime 格式化 明天,昨天实例
Mar 02 #Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 #Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 #Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 #Python
You might like
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
js 控制页面跳转的5种方法
2013/09/09 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
python 全局变量的import机制介绍
2017/09/07 Python
python实现用户答题功能
2018/01/17 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python事件驱动event实现详解
2018/11/21 Python
Django和Flask框架优缺点对比
2019/10/24 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
兴趣小组活动总结
2014/05/05 职场文书
技术负责人任命书
2014/06/05 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
教师节寄语2015
2015/03/23 职场文书
整改通知书
2015/04/20 职场文书
文艺演出主持词
2015/07/01 职场文书
公司周年庆寄语
2019/06/21 职场文书
python中sys模块的介绍与实例
2021/04/17 Python