python自己做电子词典_python实现电子词典

本文实例为大家分享了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()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值