iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何用Python做一个聊天程序(1)(没废话,超实用!)
  • 939
分享到

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

python数据库服务器Poweredby金山文档 2023-09-23 17:09:41 939人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

以前我用过编程猫的Coco编辑器做过一个聊天App,但感觉不是很爽,处处都要受到限制。于是我按照我在编程猫上的思路,用python制作了一个聊天程序。 思路 下载一个Mysql数据库,并做好处理。这个数据库相当于整个程序的服务端。 客

以前我用过编程猫的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

--结束END--

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

本文链接: https://www.lsjlt.com/news/416550.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何用Python做一个聊天程序(1)(没废话,超实用!)
    以前我用过编程猫的Coco编辑器做过一个聊天App,但感觉不是很爽,处处都要受到限制。于是我按照我在编程猫上的思路,用Python制作了一个聊天程序。 思路 下载一个MySQL数据库,并做好处理。这个数据库相当于整个程序的服务端。 客...
    99+
    2023-09-23
    python 数据库 服务器 Powered by 金山文档
  • 如何用Python做一个智能聊天机器人
    这期内容当中小编将会给大家带来有关如何用Python做一个智能聊天机器人,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。伴随着自然语言技术和机器学习技术的发展,越来越多的有意思的自然语言小项目呈现在大家的眼...
    99+
    2023-06-16
  • 如何利用C++实现一个简单的聊天室程序?
    如何利用C++实现一个简单的聊天室程序?在信息时代,人们越来越注重网络交流。而聊天室作为一种常见的沟通工具,具有实时性和交互性的特点,被广泛应用于各个领域。本文将介绍如何利用C++语言实现一个简单的聊天室程序。首先,我们需要建立一个基于客户...
    99+
    2023-11-04
    C++ 实现 聊天室程序
  • 如何用Python代码做一个换脸程序
    如何用Python代码做一个换脸程序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。简介在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的...
    99+
    2023-06-17
  • 如何利用Python打造一个多人聊天室
    这篇文章主要介绍如何利用Python打造一个多人聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、实验名称建立聊天工具二、实验目的掌握Socket编程中流套接字的技术,实现多台电脑之间的聊天。三、实验内容和要求...
    99+
    2023-06-22
  • 如何用Python写一个每天的定时程序
    1.计算生日是星期几当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~比如girl friend 的生日假设是 gf_birthday='...
    99+
    2023-01-31
    如何用 程序 Python
  • 怎么在android中利用Socket实现一个聊天小程序
    本篇文章为大家展示了怎么在android中利用Socket实现一个聊天小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体内容如下服务器端:package org.hwq.echo; impo...
    99+
    2023-05-31
    android socket roi
  • 如何在Android中利用RecyclerView实现一个聊天界面
    这篇文章给大家介绍如何在Android中利用RecyclerView实现一个聊天界面,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体内容如下首先在app/build.gradle(注意有两个build.gradle,...
    99+
    2023-05-30
    android recyclerview
  • 如何用PHP实现微信小程序的实时聊天功能?
    如何用PHP实现微信小程序的实时聊天功能?随着移动互联网的发展,微信小程序成为了很多开发者的首选平台。而实时聊天功能作为一种关键的社交功能,很多用户都希望在自己的小程序中实现。本文将介绍如何使用PHP来实现微信小程序的实时聊天功能,并提供具...
    99+
    2023-10-27
    PHP 微信小程序 实时聊天
  • 如何使用MySQL和Java实现一个简单的聊天室功能
    要使用MySQL和Java实现一个简单的聊天室功能,你需要进行以下步骤:1. 创建数据库和表:使用MySQL创建一个数据库,并在该数...
    99+
    2023-10-10
    MySQL
  • 【一分钟学会】用python做一个语音对话ChatGPT的程序——打造私人语音助手
            本项目灵感来源是我的一个专业课程设计,当时耗时近四天在网上都没找到十分有用的信息。         以下是本项目完整的步骤流程,算是对自己工作的一个阶段性总结。希望同感兴趣的小伙伴们相互探讨、交流和学习。 一、准备工作  ...
    99+
    2023-09-05
    python chatgpt 开发语言
  • 如何使用HTML和CSS实现一个简单的聊天页面布局
    随着现代科技的发展,人们越来越依赖于互联网来进行沟通和交流。而在网页中,聊天页面是一种非常常见的布局需求。本文将向大家介绍如何使用HTML和CSS来实现一个简单的聊天页面布局,并给出具体的代码示例。首先,我们需要创建一个HTML文件,可以使...
    99+
    2023-10-21
    CSS样式 HTML布局 聊天页面
  • 如何使用MySQL和JavaScript实现一个简单的即时聊天功能
    如何使用MySQL和JavaScript实现一个简单的即时聊天功能随着社交媒体的普及,即时聊天已经成为了人们日常生活中必不可少的一部分。在这篇文章中,我们将介绍如何使用MySQL和JavaScript来实现一个简单的即时聊天功能。首先,我们...
    99+
    2023-10-22
    MySQL JavaScript 即时聊天
  • 如何用tensorflow来实现一个helloworld程序
    这篇文章将为大家详细讲解有关如何用tensorflow来实现一个helloworld程序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面介绍如何用tensorflow来实现一个hellow...
    99+
    2023-06-19
  • 【干货+福利】如何1天开发一个实用的「欧洲杯赛事H5」
    引言:快速开发一个2021欧洲杯赛事H5 2021欧洲杯赛事即将开始,相信又有很多球迷加入"夜猫子"的队伍中。为了让球迷们能更好的了解赛事讯息,今天我来给大家介绍下如何快速开发一个「欧洲杯赛事」应用。 移动端在线预览...
    99+
    2024-04-02
  • 如何使用Python创建第一个CGI程序
    本文小编为大家详细介绍“如何使用Python创建第一个CGI程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Python创建第一个CGI程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。第一个CGI程...
    99+
    2023-06-08
  • 如何利用微信小程序和php实现即时通讯聊天功能
    目录一、PHP7安装Swoole扩展1、自定义安装2、宝塔面板安装PHP swoole扩展二、配置nginx反向代理三、微信小程序socket合法域名配置四、效果演示和代码1、小程序...
    99+
    2024-04-02
  • 用python编写一个小程序,如何用python编写软件
    大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1、python可以写手机应用程序吗? 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是说用手机敲写py...
    99+
    2023-10-22
    python
  • 如何用Python编写一个私人助理程序
    今天就跟大家聊聊有关如何用Python编写一个私人助理程序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在你的工作中是否有一些你自己经常做重复的任务这就是编程的乐趣所在。通过一些思考...
    99+
    2023-06-16
  • 如何用Python内置库创建一个命令行应用程序
    这篇文章主要介绍“如何用Python内置库创建一个命令行应用程序”,在日常操作中,相信很多人在如何用Python内置库创建一个命令行应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python内置...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作