Table of Contents
[TOC]
# 1.复习内容
子网掩码:192.168.0.1/24 意思是24个1,十进制表现形式就是255.255.255.0
# 2.灵感代办
# 3.学习内容
项目开发流程:network-project-day02
词典项目的开发:用到了socket,mysql,多进程
```python
"""
dict_server客户端
"""
from multiprocessing import Process
import socket
import getpass
import signal
import sys
from dict_mysql import *
HOST = '127.0.0.1'
PORT = 8888
ADDR = (HOST, PORT)
sockfd = socket.socket()
sockfd.connect(ADDR)
def input_user():
name = input("请输入姓名:")
password = input("请输入密码")
return name, password
def do_login():
"""
发送数据
"""
name, password = input_user()
sockfd.send("login".encode())
data = name + "#" + password
sockfd.send(data.encode())
status = sockfd.recv(1024).decode()
print_dev(status)
def do_register():
"""
帐号密码
"""
sockfd.send("register".encode())
for i in range(2):
name, password = input_user()
if name == '' or password == '' \
' ' in name or ' ' in password:
print("请重新输入密码")
else:
data = name + "#" + password
sockfd.send(data.encode())
break
status = sockfd.recv(1024).decode()
print_dev(status)
def do_return():
print("do_return")
sockfd.send('return'.encode())
def do_find_word():
while True:
sockfd.send("find".encode())
word = input("请输入要查询的单词")
sockfd.send(word.encode())
print_dev(sockfd.recv(1024).decode())
def menu():
while True:
try:
login = sockfd.recv(1024).decode() # 先知道状态是登录还是注册
print(login)
if login == 'false':
print("--------------------------------")
print("1)登录")
print("2)注册")
print("3)退出")
print("--------------------------------")
select_num = int(input("请输入选项:"))
if select_num == 1:
do_login()
elif select_num == 2:
do_register()
elif select_num == 3:
sockfd.send('exit programmer'.encode())
return
elif login == 'true':
print("--------------------------------")
print("1)查询")
print("2)返回上一层")
print("3)退出")
print("--------------------------------")
select_num = int(input("请输入选项:"))
if select_num == 1:
do_find_word()
elif select_num == 2:
do_return()
elif select_num == 3:
sockfd.send('exit login'.encode())
sys.exit(1)
except KeyboardInterrupt as e:
sockfd.send('exit'.encode())
sys.exit(1)
def main():
menu()
if __name__ == "__main__":
main()
```
```python
"""
dict_server处理请求逻辑
"""
from multiprocessing import Process
from socket import *
import signal
import sys
from dict_mysql import *
HOST = '127.0.0.1'
PORT = 8888
ADDR = (HOST, PORT)
dict_mysql = DictMysqlHelp()
def is_login():
return dict_mysql.get_login_status().encode()
def find_word(connfd):
try:
data = connfd.recv(1024).decode()
print_dev(data)
explain = dict_mysql.find_word(data)
print_dev(explain)
if explain:
connfd.send(explain[2].encode())
else:
connfd.send("查询单词不存在".encode())
except Exception as e:
print_dev(e)
def do_requset(connfd):
"""
查询单词
:return:
"""
connfd.send(is_login())
while True:
try:
data = connfd.recv(1024).decode()
if not data:
break
if data == 'return':
dict_mysql.set_login("false")
connfd.send(dict_mysql.get_login_status().encode())
if data == 'login':
data = connfd.recv(1024).decode()
name, password = data.split('#')
login(connfd, name, password)
if data == 'register':
data = connfd.recv(1024).decode()
name, password = data.split('#')
register(connfd, name, password)
if data == 'exit' or data == 'exit login' or data == 'exit programmer':
print(connfd.getpeername(), "退出登录")
sys.exit(1)
if data == "find":
find_word(connfd)
print_dev(data)
except Exception as e:
print_dev(e)
break
def login(connfd, name, password):
if dict_mysql.user_login(name, password):
dict_mysql.set_login("true")
connfd.send("登录成功".encode())
connfd.send(dict_mysql.get_login_status().encode())
else:
dict_mysql.set_login("false")
connfd.send("登录失败".encode())
connfd.send(dict_mysql.get_login_status().encode())
def register(connfd, name, password):
if dict_mysql.user_register(name, password):
connfd.send("注册成功".encode())
else:
connfd.send("注册失败".encode())
def main():
sockfd = socket()
sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sockfd.bind(ADDR)
sockfd.listen(10)
while True:
# signal.signal(signal.SIGCHLD, signal.SIG_IGN)
print("等待客户端连接 ...")
try:
connfd, addr = sockfd.accept()
print("客户端以连接 ...", addr, connfd)
process = Process(target=do_requset, args=(connfd,))
process.start()
except KeyboardInterrupt:
sys.exit(1)
except Exception as e:
print(e)
break
if __name__ == "__main__":
main()
```
```python
"""
dict词典数据库操作方法集合
"""
import re
from functools import wraps
import pymysql
dicts = {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "root",
"database": "dict",
"charset": "utf8"
}
dev = True
def print_dev(*args, **kwargs):
if dev is True:
print(*args, **kwargs)
# 装饰器
def try_func(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except Exception as e:
self.db.rollback()
print(e)
return wrapper
class DictMysqlHelp:
def __init__(self):
self.db = pymysql.connect(**dicts)
self.cursor = self.db.cursor()
# self.init_dict_table()
# self.init_dict_data("dict.txt")
@try_func
def init_dict_table(self):
"""
创建三个表
dict_word 是单词和解释
dict_user 是注册用户
dict_history 是查询记录
:return:
"""
self.cursor.execute('create database dict')
self.cursor.execute(
'create table dict_word(id int primary key auto_increment,`word` varchar(20) not null ,`explain` text not null );')
self.cursor.execute(
'create table dict_history(id int primary key auto_increment,`name` varchar(20) unique not null ,`word` varchar(20) not null ,`time` datetime not null );')
self.cursor.execute(
'create table dict_user(id int primary key auto_increment,`name` varchar(20) not null ,`password` varchar(20) not null );')
@try_func
def init_dict_data(self, filename):
"""
初始化词典数据
:return:
"""
sql = 'insert into `dict_word`(`word`,`explain`) values(%s,%s)'
with open(filename, "r") as fd:
while True:
data = fd.readline()
if not data:
break
split_word = re.split(r'\s{3,}', data)
word = split_word[0]
explain = " ".join(split_word[1:])
# print(explain)
self.cursor.execute(sql, [word, explain])
self.db.commit()
@try_func
def save_word(self):
pass
@try_func
def find_word(self, word=None):
self.cursor.execute("select * from dict_word where word=%s", (word,))
return self.cursor.fetchone()
@try_func
def user_login(self, name=None, password=None):
self.cursor.execute("select * from dict_user where name=%s and password=%s", (name, password))
return self.cursor.fetchone()
@try_func
def user_register(self, name, password):
self.cursor.execute("select * from dict_user where name=%s", (name,))
if not self.cursor.fetchone():
self.cursor.execute("insert into dict_user(name,password)values(%s,%s)", (name, password))
return True
return False
@try_func
def get_login_status(self):
self.cursor.execute("select login_status from login_status")
return self.cursor.fetchone()[0]
@try_func
def close_mysql(self):
self.cursor.close()
self.db.close()
@try_func
def verity_user(self):
pass
@try_func
def set_login(self, is_login):
self.cursor.execute("update login_status set login_status = %s where id = 1", (is_login,))
if __name__ == '__main__':
dicts = DictMysqlHelp()
dicts.get_login_status()
``` # 4.扩展延伸知识
easy_install pip
hash加密 ,加盐
```
# 5.知识内容个人梳理
# 6.今天都复习了之前的什么内容