需求:

1、用Socket开发双工聊天软件,服务端与客户端交互

2、聊天记录要记录到MySQL数据库

3、客户端可以查看聊天记录

4、用三层架构开发


程序架构

wKiom1e2ycryOFhWAAAplDAuF1E935.png-wh_50



各文件作用解析

- model              model层

  - dialogue.py        dialoue表

  - users.py          users表

- utility             公共层

  - sql_helper.py       公共配置文件  

- client.py         客户端文件

- conf.py             配置文件

- index.py            主程序文件

- server.py          服务器端文件



公共配置之sql_helper文件

#cat sql_helper.py
#!/usr/bin/env python
#coding:utf-8
import MySQLdb
import conf
class MySQLHelper(object):
    def __init__(self):
        self.__conn_dict = conf.conf_dict
        self.__t1_dict = conf.t1_dict
        
    #插入数据
    def Get_Dict(self,sql,params):
        conn = MySQLdb.connect(**self.__t1_dict) 
        cur = conn.cursor()  
        reCount = cur.execute(sql,params) 
        conn.commit()  
        cur.close()  
        conn.close()  
        #return reCount   
        
    #查询用户名和密码
    def Get_One(self,sql,params):
        conn = MySQLdb.connect(**self.__conn_dict)  
        cur = conn.cursor()
        reCounts = cur.execute(sql,params)
        data = cur.fetchone()
        cur.close()
        conn.close()
        return data  
         
    #查询聊天记录
    def Get_all(self,sql,params):
        conn = MySQLdb.connect(**self.__t1_dict)  
        cur = conn.cursor()
        reCounts = cur.execute(sql,params)
        data = cur.fetchall()
        cur.close()
        conn.close()
        return data


Model层之users表

#cat users.py
#!/usr/bin/env python
#coding:utf-8
from  utility.sql_helper import MySQLHelper  
class Users(object):

    def __init__(self):
        self.__helper = MySQLHelper()    
        
    #查询命令    
    def CheckValidate(self,username,password):
        sql = "select * from user where user = %s and password = %s"
        params = (username,password)
        return self.__helper.Get_One(sql,params)


Model层之dialogue表

#cat dialogue.py
#!/usr/bin/env python
#coding:utf-8
from  utility.sql_helper import MySQLHelper #把类导入进来
class Inserts(object):

    def __init__(self):
        self.__helper = MySQLHelper()    
        
    #插入数据SQL语句
    def CheckInsert(self,name,time,dialogue):
        sql = "insert into t1(name,time,dialogue) values(%s,%s,%s)"
        params = (name,time,dialogue)
        return self.__helper.Get_Dict(sql,params)
        
    #查询聊天记录SQL语句
    def ShowDialogue(self,name,names):
        sql = "select * from t1 where name = %s or name = %s"
        params = (name,names)
        return self.__helper.Get_all(sql,params)


配置文件

#cat conf.py
#!/usr/bin/env python
#coding:utf-8
conf_dict = dict(host='192.168.1.109',user='root',passwd='123456',db='mysql')
t1_dict = dict(host='192.168.1.109',user='root',passwd='123456',db='wsyht')


服务端文件

# cat server.py
#!/usr/bin/env python
#coding:utf-8
def StartSocket():
    from model.dialogue import Inserts
    import socket
    inserts = Inserts()
    sk = socket.socket()
    ip_port = ('127.0.0.1',9915)
    sk.bind(ip_port)
    sk.listen(5)     #阻塞数量
    
    while True:
        conn,address = sk.accept()
        conn.send('hello')
        print '新用户进入系统'
        print 'server:hello'
        flag = True
        
        while flag:
            import time
            data = conn.recv(1024)              
            if data == 'exit':
                flag = False
                print '对方已退出系统'
                break    
            print 'client:',data
            inp = raw_input('server:')
            conn.send(inp)
            
            name = 'server'
            time = time.strftime('%Y-%m-%d %H:%M:%S')
            result = inserts.CheckInsert(name,time,inp)
            
        conn.close()


客户端文件

#cat clieny.py
#!/usr/bin/env python
#coding:utf-8
import socket
client = socket.socket()
ip_port = ('127.0.0.1',9915)
client.connect(ip_port)
print "输入1可以查看聊天记录"

while True:
    from model.dialogue import Inserts
    import time
    inserts = Inserts()
    data = client.recv(1024)          
    print 'server:',data
    inp = raw_input('client:')
    client.send(inp)
    
    if inp == '1':
        print 'dn al'
        from model.dialogue import Inserts
        inserts = Inserts()
        result = inserts.ShowDialogue('server','client')
        print result
        
    import time
    name = 'client'
    time = time.strftime('%Y-%m-%d %H:%M:%S')
    result = inserts.CheckInsert(name,time,inp)
    if inp == 'exit':
        break


主程序文件

#!/usr/bin/env python
#coding:utf-8
from model.users import Users
import server

def main():
    user = raw_input('username:')
    pwd = raw_input('password:')
    users = Users()
    result = users.CheckValidate(user,pwd)
    if not result:
        print '你输入的用户名或密码有误'
    else:
        print '欢迎登陆后台管理页面'
        server.StartSocket()
        
if __name__ == '__main__':
    main()


执行测试:

1)服务端执行

wKioL1e20NfQ65FMAAA98y7Lmxs543.png-wh_50


2)客户端执行

wKioL1e20JSxmkDjAAA5ZzzI9BA773.png-wh_50


3)服务端执行

wKiom1e20J_QD43_AAA0ZBW2-ZM848.png-wh_50


4)客户端执行

wKioL1e20KuyeYxhAAAukMhpfSI759.png-wh_50


5)服务端执行

wKioL1e20TfyJChrAAAydcveLgM568.png-wh_50


6)客户端查看聊天记录

wKiom1e20c7ilMhPAACh95TS40s697.png-wh_50


7)查看数据库表

wKiom1e20g-T6yHCAAA1HStyyU8129.png-wh_50