詞典項目
客戶端:
"""
dict client
"""
from socket import *
from getpass import getpass
import re
ADDR = ('127.0.0.1',8000)
#create internet connect
s = socket()
s.connect(ADDR)
#deep deal
def operate(name):
while True:
print("""
===============welcom==============
1.查單詞 2.歷史記錄 3.註銷
===================================
""")
cmd = input("@%s:enter you cmd"%name)
if cmd == "1":
do_search(name)
elif cmd == '2':
pass
elif cmd == '3':
return
else:
print("enter error!")
#REGISTER
def do_register():
while True:
name = input("User:")
passwd = input('pwd')
passwd1 = input('pwd')
if not re.match(r'^[a-zA-Z0-9_]{5,12}$', name):
print('User format error,repeat:')
continue
if ' ' in passwd:
print('passwd format error!')
continue
if passwd != passwd1:
print('password is not same!')
continue
msg = "R %s %s"%(name,passwd)
#send message
s.send(msg.encode())
#reserve message
data = s.recv(128).decode()
if data == 'OK':
print("register success")
else:
print("register faild")
return
def do_login():
name =input("User:")
passwd = input("Password:")
msg = "L %s %s"%(name,passwd)
s.send(msg.encode())
print('loging ......')
data = s.recv(128).decode()
if data == "OK":
print("login success!")
operate(name)
else:
print("login faild")
def do_search(name):
while True:
word = input("enter English word: (exit: 'q')")
if word == 'q':
break
msg = "S %s %s"%(name,word)
s.send(msg.encode())
mean = s.recv(1024)
if mean == b"FAIL":
print("search faild, dict havnt the word")
else:
print('%s : %s'%(word,mean.decode()))
def main():
while True:
print("""
===============welcom==============
1.註冊 2.登錄 3.退出
===================================
""")
cmd = input("enter you cmd")
if cmd == "1":
do_register()
elif cmd == '2':
do_login()
pass
elif cmd == '3':
break
else:
print("enter error!")
main()
服務端:
"""
server
"""
from socket import *
from multiprocessing import Process
import signal
import sys
from operation_db import *
#all varieble
HOST = '0.0.0.0'
PORT = 8000
ADDR = (HOST,PORT)
def do_register(c,db,data):
tmp = data.split(' ')
name = tmp[1]
passwd = tmp[2]
if db.register(name,passwd):
c.send(b'OK')
else:
c.send(b'FAIL')
# try login
def do_login(c,db,data):
tmp = data.split(' ')
name = tmp[1]
passwd = tmp[2]
if db.login(name, passwd):
c.send(b'OK')
else:
c.send(b'FAIL')
def do_search(c,db,data):
tmp = data.split(' ')
name = tmp[1]
word = tmp[2]
if db.search(name, word):
mean = db.search(name,word)
c.send(mean.encode())
else:
c.send(b'FAIL')
#internet connect
def do_request(c,db):
db.create_cursor() #create db.cur
while True:
data = c.recv(1024).decode()
print(c.getpeername(),":",data)
if data[0] == 'R':
do_register(c,db,data)
if data[0] == 'L':
do_login(c,db,data)
if data[0] == 'S':
do_search(c,db,data)
def main():
#create a database object
db = Database()
#create tcp socket
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(5)
#deal the zombie process
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
#wait server connect
print("Listen the port 8000")
while True:
try:
c,addr = s.accept()
print("Connect from",addr)
except KeyboardInterrupt:
s.close()
sys.exit("server exit")
except Exception as e:
print(e)
continue
p = Process(target = do_request,args = (c,db))
p.daemon = True
p.start()
main()
服務端核心:
"""
idct item data core
"""
import pymysql
import hashlib
class Database:
def __init__(self,host = 'localhost',
port = 3306,
user = 'root',
passwd = '123456',
database = 'dict',
charset = 'utf8'):
self.host = host
self.port = port
self.user = user
self.passwd = passwd
self.database = database
self.connect_db() #connect database
self.charset = charset
def connect_db(self):
self.db = pymysql.connect(host = self.host,
port = self.port,
user = self.user,
passwd = self.passwd,
database = self.database,
)
def create_cursor(self):
self.cur = self.db.cursor()
def pwd_transform(self,name,passwd):
hash = hashlib.md5((name + "salt").encode())
hash.update(passwd.encode())
return hash.hexdigest()
def close(self):
self.cur.close()
self.db.close()
def register(self,name,passwd):
sql = "select * from user where name='%s'"%name
self.cur.execute(sql)
r = self.cur.fetchone()
if r:
return False
# pwd secure deal
self.pwd_transform(name,passwd)
sql = "insert into user (name,passwd) \
values (%s,%s)"
try:
self.cur.execute(sql,[name,self.pwd_transform(name,passwd)])
self.db.commit()
return True
except Exception:
self.db.rollback()
return False
def login(self,name,passwd):
sql = "select * from user where name='%s'" % name
self.cur.execute(sql)
r = self.cur.fetchone()
if not r:
return False
passwd = self.pwd_transform(name,passwd)
sql = "select passwd from user where name='%s'"% name
try:
self.cur.execute(sql)
database_pwd = self.cur.fetchone()
if database_pwd[0] == passwd:
return True
else:
return False
except Exception:
self.db.rollback()
return False
def search(self,name,word):
sql = "select mean from edict where word = '%s'" % word
try:
self.cur.execute(sql)
result = self.cur.fetchone()
if not result:
return False
return result[0]
except Exception:
self.db.rollback()
return False
數據庫推送
import pymysql
import re
db = pymysql.connect('localhost','root',
'123456','dict')
cur = db.cursor()
for data in open('dict.txt'):
l = re.findall(r'(\d+)\s+(\w+-{0,1}\w+)\s+(.*)',data)
try:
sql = "insert into edict (word, mean) values (%s,%s)"
cur.execute(sql,[l[0][1],l[0][2]])
db.commit()
except Exception as e:
print('error',e)