服务器端

#ser.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
import _thread
import json
import MySQLdb

# encoding: utf-8
db = MySQLdb.connect(host='127.0.0.1',user='root', passwd='a15737321920',db ='userInfor')
# 使用cursor()方法获取操作游标 
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 插入语句
            sql = "INSERT INTO userInfo(username,userpasswd,usersex) \
                VALUES ('%s', '%s', '%s'  )" % \
                (username, userpasswd, usersex)  
            registerresultStr = ''
            registerfailReason = ''          
            try:
                # 执行sql语句
                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:
                #执行sql语句
                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:
                                #执行sql语句
                                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 插入语句
            sql = "select userpasswd, log_date \
            from userInfo where username=\'" + username + "\'"      
            loginresultStr = ''
            loginfailReason = ''
            try:
                # 执行sql语句
                cursor.execute(sql)                         
                alldata = cursor.fetchall()
                # 如果有数据返回,就循环输出, alldata是有个二维的列表,只包含一个数据,

                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 插入语句
            sql = "select userpasswd, log_date \
            from userInfo where username=\'" + username + "\'"      
            logoutresultStr = ''
            logoutfailReason = ''
            try:
                # 执行sql语句
                cursor.execute(sql)                         
                alldata = cursor.fetchall()
                # 如果有数据返回,就循环输出, alldata是有个二维的列表,只包含一个数据,

                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, "创建线程")

#key : (host,port)
#value:(socket, (host,port))
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)#获取客户端的(host+port),并确保是否真的存在
        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 
}


*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值