import socket
import _thread
import json
import MySQLdb
db = MySQLdb.connect(host='127.0.0.1',user='root', passwd='a15737321920',db ='userInfor')
cursor = db.cursor()
class config:
confpath='/home/wei/fty/test/im/server/pushserver.json'
def __init__(self):
self.host = '127.0.0.1'
self.port = 7077
self.load()
def load(self):
with open(self.confpath, 'r') as f:
jsondist = json.load(f)
hostobj = jsondist.get('host')
if hostobj:
self.host = hostobj
portobj = jsondist.get('port')
if portobj:
self.port = portobj
print(jsondist)
conf = config()
def help():
print('''
cmdkeys:
quit/exit
'''
)
def client_thread_handle( s, addr):
print("Recv from client ", addr)
while True:
msg = s.recv(1024)
if not msg :
break
msgd = msg.decode()
print(addr, " says: ", msgd)
if msgd.lower() == "logout" :
break
msgDict = json.loads(msgd)
msgType = msgDict["MsgType"]
MsgVaule = msgDict["MsgVaule"]
userpasswd = MsgVaule["UserPasswd"]
username = MsgVaule["UserName"]
if not msgType:
pass
elif msgType == "register":
usersex = MsgVaule["Sex"]
sql = "INSERT INTO userInfo(username,userpasswd,usersex) \
VALUES ('%s', '%s', '%s' )" % \
(username, userpasswd, usersex)
registerresultStr = ''
registerfailReason = ''
try:
cursor.execute(sql)
db.commit()
except:
registerresultStr = 'register failed'
print('注册失败')
registerfailReason = '用户已存在'
db.rollback()
else:
registerresultStr = 'secessful'
print('恭喜',username,'用户注册成功')
registerReasult = {
"MsgType" :"register",
"MsgVaule": {
"UserName":username,
"loginRusult":registerresultStr,
"failReason":registerfailReason
}
}
registermsg = json.dumps(registerReasult)
s.send(registermsg.encode())
elif msgType == "unregister":
sql = "select userpasswd \
from userInfo where username=\'" + username + "\'"
unregisterRusultStr = ''
unregisterfailReason = ''
try:
cursor.execute(sql)
alldata = cursor.fetchall()
if alldata:
unregisterState = False
for rec in alldata:
if userpasswd ==rec[0]:
print('恭喜',username,'注销成功。')
unregisterState = True
sql = "delete from userInfo where username =\'" + username + "\'"
try:
cursor.execute(sql)
db.commit()
except :
db.rollback()
break
if unregisterState == False:
unregisterRusultStr = 'fail'
unregisterfailReason = '密码错误'
print('注销失败')
else:
unregisterRusultStr = 'sucess'
print('注销成功')
else:
unregisterRusultStr = 'fail'
unregisterfailReason = '用户名错误'
print('注销失败')
except :
db.rollback()
unregisterReasult = {
"MsgType" :"unregister",
"MsgVaule": {
"username":userpasswd,
"unregisterRusult":unregisterRusultStr,
"failReason":unregisterfailReason
}
}
unregistermsg = json.dumps(unregisterReasult)
s.send(unregistermsg.encode())
elif msgType == "login":
sql = "select userpasswd, log_date \
from userInfo where username=\'" + username + "\'"
loginresultStr = ''
loginfailReason = ''
try:
cursor.execute(sql)
alldata = cursor.fetchall()
if alldata:
loginState = False
for rec in alldata:
if userpasswd ==rec[0]:
print('恭喜' , username , '登陆成功!' )
loginState = True
sql = "update userInfo set log_date = now() where username =\'" + username + "\'"
try:
cursor.execute(sql)
db.commit()
except :
db.rollback()
break
if loginState == False:
loginresultStr = 'fail'
loginfailReason = '密码错误'
print(' 登陆失败')
else:
loginresultStr = 'sucess'
print('登陆成功')
else:
loginresultStr = 'fail'
loginfailReason = '用户名不存在'
print('用户名不存在')
except:
db.rollback()
loginReasult = {
"MsgType":"loginResult",
"MsgValue":{
"UserName":username,
"loginRusult":loginresultStr,
"failReason":loginfailReason
}
}
loginmsg = json.dumps(loginReasult)
s.send(loginmsg.encode())
elif msgType == "logout":
sql = "select userpasswd, log_date \
from userInfo where username=\'" + username + "\'"
logoutresultStr = ''
logoutfailReason = ''
try:
cursor.execute(sql)
alldata = cursor.fetchall()
if alldata:
logoutState = False
for rec in alldata:
if userpasswd ==rec[0]:
print('恭喜' , username , '登出成功!' )
logoutState = True
break
if logoutState == False:
logoutresultStr = 'fail'
logoutfailReason = '密码错误'
print(' 登出失败')
else:
logoutresultStr = 'sucess'
print('登出成功')
else:
logoutresultStr = 'fail'
logoutfailReason = '用户名不存在'
print('用户名不存在')
except:
db.rollback()
logoutReasult = {
"MsgType":"logoutResult",
"MsgValue":{
"UserName":username,
"logoutRusult":logoutresultStr,
"failReason":logoutfailReason
}
}
logoutmsg = json.dumps(logoutReasult)
s.send(logoutmsg.encode())
print("Bye ! ", addr)
s.close()
def process_client(s, addr):
try:
_thread.start_new_thread( client_thread_handle, (s, addr, ) )
except:
print ("Error: 无法为", addr, "创建线程")
else:
print ("Info: 成功为", addr, "创建线程")
clientDict = {}
def setup_server_and_wait_for_client():
s = socket.socket()
host = conf.host
port = conf.port
s.bind((host,port))
s.listen(5)
while True:
print("等待客户端连接.")
newS ,addr = s.accept()
oldCI = clientDict.get(addr)
if oldCI:
oldCI[0].close()
clientDict[addr] = (newS, addr)
process_client(newS, addr)
def setup_server_handle():
try:
_thread.start_new_thread( setup_server_and_wait_for_client, ())
except BaseException as err:
print ("Error: 无法为 setup_server_and_wait_for_client 创建线程: ", err)
else:
print ("Info: 成功为 setup_server_and_wait_for_client 创建线程")
setup_server_handle()
'''
cmdkeys:
quit/exit
help
'''
while True:
cmdline = input("> ")
cmd = cmdline.split(' ')
cmdkey = cmd[0]
username = cmd[1]
if cmdkey == "" :
continue
elif cmdkey.lower() == "quit" or cmdkey.lower() == "exit" :
print('Bye')
break
elif cmdkey.lower()=='help':
help()
elif cmdkey.lower()=='login':
print('login')
if len(cmd) < 3:
print('login need three args')
continue
elif cmdkey.lower() == 'logout':
print('login')
if len(cmd) < 3:
print('login need three args')
continue
else:
print('illegal command')
help()
db.close()
/*
用到的协议:
protocal-loginClnt.json
{
"MsgType":"login",
"MsgVaule":{
"UserName":"username",
"UserPasswd":"userpasswd"
}
}
protocal-loginSer.json
{
"MsgType":"loginResult",
"MsgVaule":{
"UserName":"username",
"loginRusult":"success/fail",
"failReason":""
}
}
protocal-logoutClnt.json
{
"MsgType":"logout",
"MsgVaule":{
"UserName":"username",
"UserPasswd":"userpasswd"
}
}
protocal-logoutSer.json
{
"MsgType":"logoutResult",
"MsgVaule":{
"UserName":"username",
"logoutRusult":"success/fail",
"failReason":""
}
}
protocal-registerClnt.json
{
"MsgType" :"register",
"MsgVaule": {
"UserName":"UserName",
"Passwd":"passwd",
"Sex":"sex"
}
}
protocal-registerSer.json
{
"MsgType" :"register",
"MsgVaule": {
"UserName":"UserName",
"registerRusult":"success/fail",
"failReason":""
}
}
protocal-sayClnt.json
{
"MsgType" :"say",
"MsgVaule": "..."
}
protocal-saySer.json
{
"MsgType" :"say",
"MsgVaule": "..."
}
protocal-unregisterClnt.json
{
"MsgType" :"unregister",
"MsgVaule": {
"UserName":"username",
"UserPasswd":"userpasswd"
}
}
protocal-unregisterSer.json
{
"MsgType" :"unregister",
"MsgVaule": {
"userName":"username",
"unregisterRusult":"success/fail",
"failReason":""
}
}
pushserver.json
{
"host" : "0.0.0.0",
"port" :7077
}
*/