この記事の例では、参考のためにpythonで電子辞書を実装するための特定のコードを共有しています。具体的な内容は次のとおりです。
サーバ
#! /usr/bin/env python3
from __future__ import unicode_literals
# coding=utf-8from 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')returnelse: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()returntry:
f =open(DICT_TEXT,'rb')
except:
c.send("500サーバー例外".encode())returnwhile 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())returnelse:
c.send(b'OK')
except:
c.send("データベースクエリエラー".encode())return
n =0for 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-8from socket import*import sys
import getpass
def main():iflen(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("入力コマンドエラー")continueif 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("ユーザー名とパスワードにスペースを入れない")continueif passwd != passwd1:print("2つのパスワードに一貫性がありません")continue
msg ="R {} {}".format(name,passwd)
# リクエストを送信
s.send(msg.encode())
# 返信を受け取る
data = s.recv(128).decode()if data =="OK":return name
elif data =='EXISTS':print("ユーザーはすでに存在します")return1else:return1
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)return1
def login(s,name):while True:print('''\n
=========== クエリインターフェイス============1.ワードルックアップ2.歴史3.ログアウト
=============================''') try:
cmd =int(input("入力オプション"))
except Exception:print("コマンドエラー")continueif 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 =="##":breakprint(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()
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。
Recommended Posts