Python开发双工聊天软件

需求:

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

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

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

4、用三层架构开发

程序架构

各文件作用解析

- 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)服务端执行

2)客户端执行

3)服务端执行

4)客户端执行

5)服务端执行

6)客户端查看聊天记录

7)查看数据库表

时间: 2024-12-28 12:42:35

Python开发双工聊天软件的相关文章

用C/S技术开发语音聊天软件有什么特点?

上一期我们说过B/S技术开发聊天有什么优点,这一期我们就来简单的说说用C/S技术开发又有什么特点? 一.稳定性和灵活性:用C/S技术可以将应用和服务进行分离. 二.安全性:C/S对应是的是结构模式,一般只适用于局域网,所以安全性比较好. 三.速度快:客户端与服务器端是直接连接的,中间没有经过别的环节,所以响应速度非常快. 四.升级维护复杂:如果软件需要升级维护,那么每一台客户的机子都要进行相应的升级维护服务,那么这个过程肯定是比较繁琐的. 综上所述,对于不同的聊天室需要采用不同的开发技术,但是国

用VScode配置Python开发环境

引用:https://www.jianshu.com/p/506debe61423 前言 VScode是一个相当优秀的IDE,具备开源.跨平台.模块化.插件丰富.启动时间快.颜值高.可高度定制等等优秀的特质,不愧是微软爸爸的私生子. 所以用VScode来编写Python,也是相当的好用的. 所以,今天我们就来讲讲,怎么在VScode上配置Python开发环境. 软件准备 首先,我们必须先下载好Python的安装包和VScode的安装包. 下载地址如下: Python:https://www.py

python练习四—简单的聊天软件

python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用户的会话列表 * 维护一个已登录用户的字典,用户名和会话 * 监听端口,接受会话,并启动一个ChatSession处理 2. 会话线程 * 初始化一个接收数据缓冲区 * 处理用户输入的命令,并提醒用户先登录(也就是说目前指处理登陆命令) * 将用户输入的数据加入缓冲区 * 用户一次输入结束后,将缓冲

程序员带你十天快速入门Python,玩转电脑软件开发(二)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 上节课主要讲解了以下内容: 为什么学习Pyth

程序员带你十天快速入门Python,玩转电脑软件开发(三)

声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 这是高级程序员快速入门Python语言课程.助你快速学习Python语言.这是第三课. 程序员带你十天快速入门Python,玩转电脑软件开发(一) 程序员带你十天快速入门Python,玩转电脑软件开发(二) 因技术知识连贯性,还没有学习前两课的同学,建议点

Ruby与Python开发的环境IDE配置(附软件的百度云链接)

Ruby开发环境配置 1.Aptana_RadRails(提示功能不好,开发Ruby不推荐) 链接:http://pan.baidu.com/s/1i5q96K1 密码:yt04 2.Aptana Studio3(非常非常好,Ruby和Python开发首选,,和Eclipse使用基本完全一样,提示功能完爆Eclipse,而且界面非常漂亮) 链接:http://pan.baidu.com/s/1cFQr2u 密码:vfc4 教程地址:http://www.cnblogs.com/lsgwr/p/5

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com

程序员带你十天快速入门Python,玩转电脑软件开发(一)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言的你.有梦想的你,立志做全栈攻城狮. 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 目录: 为什么学习Python? Pyt

高仿QQ即时聊天软件开发系列之二登录窗口界面

继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因为我没玩过WPF所以难,因为感觉做出来之后也就那样 整体布局 整体是上下分,下面是左中右分 1 <Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="27"><!--用于放窗口右上角关闭.最