我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用Python做一个聊天程序(1)(没废话,超实用!)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用Python做一个聊天程序(1)(没废话,超实用!)

以前我用过编程猫的Coco编辑器做过一个聊天App,但感觉不是很爽,处处都要受到限制。于是我按照我在编程猫上的思路,用Python制作了一个聊天程序。

思路

  1. 下载一个MySQL数据库,并做好处理。这个数据库相当于整个程序的服务端。

  1. 客户端使用tkinter的GUI制作,主要功能包括:收信息,发信息。收发信息的数据储存在MySQL的信息收发数据库。

  1. 同时需要在MySQL里创建一个账户管理的数据库,用来储存账号信息,包括账号名,密码,昵称等等。

服务端

MySQL的配置

  1. 首先在MySQL官网下载一个MySQL(小白推荐阅读:(70条消息) MySQL安装配置教程(超级详细、保姆级)_SoloVersion的博客-CSDN博客_mysql安装配置)。推荐下载5.7版本,同时建议下载一个Navicat,管理数据的时候更加可视化。

  1. 配置完成后在MySQL上开放权限。(“%”表示任何主机均可连接你的数据库)

(提示:Windows用户该权限放开后无法连接大概率是防火墙问题,在防火墙的入站规则中将你的MySQL端口(默认3306)设为通过)。

(Linux系统大概率是MySQL文件夹的my.cnf的bind_address的值为127.0.0.1,首先将MySQL服务关闭,然后将127.0.0.1改为0.0.0.0,启动,但这样会有非常大的风险,有可能会导致数据库无法启动,不建议操作!)。

grant all privileges on *.* to root@'%' identified by '你的密码' with grant option;flush privileges;
  1. 创建数据库。(先将数据库,表,以及行改为utf-8,否则无法插入中文)

create database 你的数据库名;

创建表

create table 账号管理(账号名 bigint, 密码 varchar(20), 昵称 varchar(20);
create table 主服务器(发送人账号 bigint, 发送人昵称 varchar(20), 发送内容 varchar(20000), 收件人账号 bigint, 已读未读 int(1));

这个时候服务器所在的局域网的所有主机都可以通过服务器所在的主机的IP地址连接上服务器,但这远远不够,我们需要全球任何一个角落的人都可以连接上这台服务器。

内网映射

这个时候我们需要下载一个叫“花生壳”的工具。

  1. 打开“花生壳”,注册账号。点击加号。

  1. 进入花生壳官网,填写数据。

应用名称

自定义,一般写个有含义的名称

应用图标

可以给对应的服务选择一个图标,方便区分

映射类型

选择TCP

外网域名

选择帐号下的壳域名作为外网访问地址

外网端口

选择动态端口

内网主机

填写服务器的局域网IP地址

内网端口

3306(若内网数据库为SqlServer则是1433)

带宽

默认根据帐号等级分配相应的带宽,也可根据实际需求额外付费购买

夜间带宽

18:00-次日8:00带宽速度提升100%,速度不低于5Mbps;带宽基数越大,夜间越快

点击“保存”即可。

完成后使用Navicat尝试连接。

这个时候天南海北的人都可以通过该IP连接数据库。

客户端

准备

  1. Python 3.x(推荐使用Pycharm)

  1. 配置好的MySQL数据库

  1. 导入库(在cmd中用pip导入)

pip install pymysqlpip install threading

GUI框架

这里使用Python自带的tkinter(作者也是初次接触,太复杂的GUI我也不会😶)

from tkinter import *def main():    win = Tk()    win.title('登录')    win.geometry('400x400')    win.resizable(False, False)    win.config(background='light gray')    Label(win, text='登录', bg='light gray', font=('楷体', 32), fg='black').pack()    Label(win, text='账号', bg='light gray', font=('微软雅黑', 15), fg='black').place(x=30, y=120)    Label(win, text='密码', bg='light gray', font=('微软雅黑', 15), fg='black').place(x=30, y=180)    e1 = Entry(win, width=35, relief=FLAT)    e2 = Entry(win, width=35, show='*', relief=FLAT)    e1.place(x=100, y=126)    e2.place(x=100, y=186)    def sign_in():        # 登录验证        pass    def sign_up():        # 注册账号        root = Tk()        root.title('注册')        root.geometry('400x400')        root.resizable(False, False)        root.config(background='light gray')        Label(root, text='注册', bg='light gray', font=('楷体', 32), fg='black').pack()        Label(root, text='账号', bg='light gray', font=('微软雅黑', 15), fg='black').place(x=30, y=120)        Label(root, text='密码', bg='light gray', font=('微软雅黑', 15), fg='black').place(x=30, y=180)        Label(root, text='昵称', bg='light gray', font=('微软雅黑', 15), fg='black').place(x=30, y=240)        e11 = Entry(root, width=35, relief=FLAT)        e22 = Entry(root, width=35, show='*', relief=FLAT)        e33 = Entry(root, width=35, relief=FLAT)        e11.place(x=100, y=126)        e22.place(x=100, y=186)        e33.place(x=100, y=246)        def signup():            # 注册详情            pass        Button(root, text='注册', bg='green', fg='white', command=signup, width=10, height=1, relief=RIDGE).pack(side='bottom', pady=60)    Button(win, text='点击注册', bg='light gray', fg='blue', command=sign_up, width=10, height=1, relief=FLAT).pack(side='bottom')    Button(win, text='登录', bg='green', fg='white', command=sign_in, width=10, height=1, relief=RIDGE).pack(side='bottom', pady=90)if __name__ == '__main__':    main()

客户端+服务器

我们使用Python的pymysql库,它可以很方便得连接MySQL数据库。

使用详情参考:(70条消息) pymysql的使用教程_Andy86666的博客-CSDN博客_pymysql

验证账号

验证账号的具体思路是:

  1. 连接服务器。

  1. 获取输入的手机号。

  1. 与数据库中现有的手机号进行比对,比对成功下一步,不成功直接弹窗“该账号不存在!”。

  1. 获取该账号的信息,如昵称,手机号,密码等。

  1. 对比输入密码与数据库存在密码,相同则成功登录,不同就弹窗“密码错误”。

具体代码如下:

def sign_in():        # 验证账号        try:            conn = pymysql.connect(host='刚刚映射的IP', port=刚刚映射的端口, user='用户名', password='你的MySQL密码', database='数据库名称')            cursor = conn.cursor()            try:                sql1 = 'select * from 账号 where 手机号=' + str(e1.get())                cursor.execute(sql1)                global all1                all1 = cursor.fetchone()                conn.close()                cursor.close()                if all1 == None:                    messagebox.showerror('学霸小鼠', '该账号不存在!')                else:                    passw = all1[2]                    if e2.get() == passw:                        messagebox.showinfo('学霸小鼠', '登录成功')                        win.destroy()                        # f2.start()(整体代码需要)                    else:                        messagebox.showerror('学霸小鼠', '密码错误!')            except:                messagebox.showerror('学霸小鼠', '请检查输入!')        except:            messagebox.showerror('学霸小鼠', '服务器未开放!')

注册账号

思路:

  1. 通过GUI的方式获取用户所要注册的账号,信息包括手机号,昵称,密码。

  1. 判断是否符合规则,例如:手机号是否符合MySQL的bigint(不符合就会报错),建立二次填写密码机制,防止填写错误。这里可以用try...except...语句。

  1. 判断完成后将数据上传至数据库储存,注册完毕。

代码如下:

try:    conn = pymysql.connect(host='xx.xx.xx.xx', port=xxxxx, user='xxxx', password='xxxxx',database='xxxxx')                cursor = conn.cursor()                cursor1 = conn.cursor()                try:                    sql2 = "select * from 账号 where 手机号=" + str(e11.get())                    cursor.execute(sql2)                    all2 = cursor.fetchone()                    if all2 == None and e22.get() == e44.get():                        sql3 = "insert into 账号 values('" + str(e33.get()) + "', " + str(e11.get()) + " ,'" + str(e22.get()) + "');"                        # print(sql3)                        cursor1.execute(sql3)                        conn.commit()                        messagebox.showinfo('学霸小鼠', '注册成功!')                        cursor1.close()                        cursor.close()                        conn.close()                        root.destroy()                    else:                        messagebox.showwarning('学霸小鼠', '错误!(该账号已注册或您两次输入的密码不一致!)')                except:                    messagebox.showerror('学霸小鼠', '请检查输入!')            except:                messagebox.showerror('学霸小鼠', '服务器未开放!')

运行

发送界面

大致框架
  1. 左边做一个Text收件箱,右边做一个Text发件箱。(左边只读,右边可改)

  1. 三个按钮:刷新、发送、清空聊天记录。

  1. 两个滑动块,一左一右。

发送端

思路:

  1. 获取GUI界面的输入信息,对比收件人账号与服务器账号,有此账号继续,无此账号禁止发送(防止垃圾信息过多,导致服务器臃肿)。

  1. 尝试将信息传输至服务器,成功则完成,不成功报错。传输内容如下:(我定义的已读未读中,0代表未读,1代表已读,发送时自动将信息标记为0)

def send():        try:            conn = pymysql.connect(host='xx.xx.xx.xx', port=xxxx, user='xxxx', password='xxxx', database='xxx')            cursor = conn.cursor()            sql5 = 'select * from 账号 where 手机号={}'.format(e4.get())            cursor.execute(sql5)            all2 = cursor.fetchone()            if all2 == None:                messagebox.showerror('学霸小鼠', '没有此收件人,请检查!')            else:                try:                    sql4 = "insert into 内容 values('{}', '{}', {}, {}, '{}', {})".format(e3.get('1.0', 'end'), all1[0], all1[1], e4.get(), time.ctime(), 0)                    cursor.execute(sql4)                    conn.commit()                    cursor.close()                    conn.close()                    messagebox.showinfo('学霸小鼠', '发送成功!')                except:                    messagebox.showerror('学霸小鼠', '发送失败!请检查信息!')        except:            messagebox.showerror('学霸小鼠', '未知错误!请联系管理员解决!')
接收端

思路:

  1. 实时比对当前手机号是否存在与发送数据库的“收件人账号”中,存在则输出。

  1. 输出的内容是一组元组,需要进行简单处理。

  1. 处理完毕后提取相关信息,插入到收件箱上。

  1. 将已读未读标记为1,防止下一轮循环中再次插入。

def receive():        try:            e5.configure(state='normal')            e5.delete('1.0', END)            # we = '{}的收信箱:\n\n'.format(all1[0])            # e5.insert(INSERT, we)            conn = pymysql.connect(host='', port=49657, user='root', password='zhang2008', database='mindchat')            cursor = conn.cursor()            sql6 = 'select * from 内容 where 收件人账号={}'.format(all1[1])            cursor.execute(sql6)            all8 = cursor.fetchall()            for t in all8:                e5.insert('end', '{}\n{}({})发送的内容\n{}\n\n\n'.format(t[4], t[1], t[2], t[0]))            sql11 = 'update 内容 set 已读未读=1 where 收件人账号={}'.format(all1[1])            cursor.execute(sql11)            conn.commit()            e5.configure(state='disabled')            conn.close()            cursor.close()        except:            messagebox.showerror('学霸小鼠', '未知错误!请检查数据或联系管理员!')

这可以与刷新按钮绑定,但无法实时刷新。

实时通讯

思路

  1. 写一个while循环,重复捕捉(同上),间隙为5秒(否则GUI会闪动十分严重)

  1. 插入。

def main3():    try:        while True:            e5.configure(state='normal')            # e5.delete('1.0', END)            conn = pymysql.connect(host='xxx', port=xx, user='xx', password='xxxx', database='xxxx')            cursor = conn.cursor()            sql6 = 'select * from 内容 where 收件人账号={} and 已读未读=0'.format(all1[1])            cursor.execute(sql6)            all2 = cursor.fetchall()            # print(all2)            for t in all2:                e5.insert('end', '{}\n{}({})发送的内容\n{}\n\n\n'.format(t[4], t[1], t[2], t[0]))            sql11 = 'update 内容 set 已读未读=1 where 收件人账号={}'.format(all1[1])            cursor.execute(sql11)            conn.commit()            e5.configure(state='disabled')            time.sleep(5)            conn.close()            cursor.close()            zh.update()    except:        pass

清理聊天记录

思路:

  1. 新建一个按钮,与接下来的程序绑定。

  1. 当点击按钮时,删除数据库中“收件人”=当前手机号的信息。

  1. 刷新即可。

def clear():        try:            conn = pymysql.connect(host='xx', port=xx, user='xxx', password='xxxxx', database='xxxxx')            cursor = conn.cursor()            sql9 = 'delete from 内容 where 收件人账号 = {}'.format(all1[1])            cursor.execute(sql9)            conn.commit()            messagebox.showinfo('学霸小鼠', '已清空您的聊天数据!')            cursor.close()            conn.close()        except:            messagebox.showerror('学霸小鼠', '服务器未开放!')

总结

我们利用Python+MySQL开发了一款实时聊天工具,喜欢的话可以加一下关注,以后我会继续发文更新,对程序进行进一步的完善。如果有什么建议可以在评论区输入你的想法。

再见!

来源地址:https://blog.csdn.net/m0_67727710/article/details/128807408

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用Python做一个聊天程序(1)(没废话,超实用!)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用Python做一个智能聊天机器人

这期内容当中小编将会给大家带来有关如何用Python做一个智能聊天机器人,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。伴随着自然语言技术和机器学习技术的发展,越来越多的有意思的自然语言小项目呈现在大家的眼
2023-06-16

如何利用C++实现一个简单的聊天室程序?

如何利用C++实现一个简单的聊天室程序?在信息时代,人们越来越注重网络交流。而聊天室作为一种常见的沟通工具,具有实时性和交互性的特点,被广泛应用于各个领域。本文将介绍如何利用C++语言实现一个简单的聊天室程序。首先,我们需要建立一个基于客户
如何利用C++实现一个简单的聊天室程序?
2023-11-04

如何用Python代码做一个换脸程序

如何用Python代码做一个换脸程序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简介在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的
2023-06-17

如何用Python写一个每天的定时程序

1.计算生日是星期几当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~比如girl friend 的生日假设是 gf_birthday='2
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录