python實(shí)現(xiàn)電子詞典
本文實(shí)例為大家分享了python實(shí)現(xiàn)電子詞典的具體代碼,供大家參考,具體內(nèi)容如下
服務(wù)端
#!/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():
# 連接數(shù)據(jù)庫(kù)
db = pymysql.connect\
('localhost', 'root', '123456', 'dict')
# 創(chuàng)建流式套接字
s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen(5)
# 或略子進(jìn)程退出
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
while True:
try:
c, addr = s.accept()
print("Connect from", addr)
except KeyboardInterrupt:
s.close()
sys.exit("服務(wù)器退出")
except Exception as e:
print(e)
continue
# 創(chuàng)建子進(jìn)程處理客戶端請(qǐng)求
pid = os.fork()
if pid == 0:
s.close()
do_child(c, db)
else:
c.close()
def do_child(c, db):
# 循環(huán)接收請(qǐng)求
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注冊(cè)成功" % 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 服務(wù)端異常".encode())
return
while True:
line = f.readline().decode()
w = line.split(' ')[0]
if (not line) or w > word:
c.send("沒(méi)找到該單詞".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('沒(méi)有歷史記錄'.encode())
return
else:
c.send(b'OK')
except:
c.send("數(shù)據(jù)庫(kù)查詢錯(cuò)誤".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.注冊(cè) 2.登錄 3.退出--
===========================
''')
try:
cmd = int(input("輸入選項(xiàng)>>"))
except Exception:
print("輸入命令錯(cuò)誤")
continue
if cmd not in [1,2,3]:
print("對(duì)不起,沒(méi)有該命令")
sys.stdin.flush() #清除輸入
continue
elif cmd == 1:
name = do_register(s)
if name != 1:
print("注冊(cè)成功,直接登錄!")
login(s,name)
else:
print("注冊(cè)失敗!")
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("確認(rèn)密碼:")
if (' ' in name) or (' ' in passwd):
print("用戶名密碼不允許空格")
continue
if passwd != passwd1:
print("兩次密碼不一致")
continue
msg = "R {} {}".format(name,passwd)
#發(fā)送請(qǐng)求
s.send(msg.encode())
#接收回復(fù)
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("輸入選項(xiàng)>>"))
except Exception:
print("命令錯(cuò)誤")
continue
if cmd not in [1,2,3]:
print("對(duì)不起,沒(méi)有該命令")
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()


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django contenttypes 框架詳解(小結(jié))
這篇文章主要介紹了Django contenttypes 框架詳解(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
TensorBoard 計(jì)算圖的可視化實(shí)現(xiàn)
今天小編就為大家分享一篇TensorBoard 計(jì)算圖的可視化實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
python自動(dòng)化測(cè)試三部曲之request+django實(shí)現(xiàn)接口測(cè)試
這篇文章主要介紹了python自動(dòng)化測(cè)試三部曲之request+django實(shí)現(xiàn)接口測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
使用Python腳本將絕對(duì)url替換為相對(duì)url的教程
這篇文章主要介紹了使用Python腳本將絕對(duì)url替換為相對(duì)url的教程,腳本代碼非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04
Django中反向生成models.py的實(shí)例講解
今天小編就為大家分享一篇Django中反向生成models.py的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

