这篇文章主要记录了自己学习python时学习到的使用python来实现类似qq群聊的功能,整个项目分为服务器端和客户端两个部分,具体的实现如下:

一、具体代码

1、服务器端(Server.py)

import os
import sys
import time
import uuid
from socket import *import pymysqlDATE_FORMAT_YYYY_MM_DD_HH_MM_SS = '%Y-%m-%d %H:%M:%S'# 子进程处理客户端请求
def do_login(s, user, name, addr):# 判断用户是否存在以及用户是否为管理员cursor.execute("select * from user where name = '" + name + "'")data = cursor.fetchone()if (data != None and data[3] == 'on') or name == '管理员':s.sendto('该用户已存在,请重新输入'.encode(), tuple(list((addr[0], int(addr[1])))))return# 用户成功登陆,返回成功信息s.sendto('OK'.encode(), tuple(list((addr[0], int(addr[1])))))cursor.execute("select user.name, t.date, t.msg from (select user_id, msg, date from message where date > (select join_date from user where name = '"+name+"')) as t join user on user.id = t.user_id order by t.date")data_list = cursor.fetchall()msg = ''index = 0for data_temp in data_list:if index == 0:msg += '%s 于 %s 发言:%s' % (data_temp[0], data_temp[1], data_temp[2])else:msg += '\n%s 于 %s 发言:%s' % (data_temp[0], data_temp[1], data_temp[2])index += 1s.sendto(msg.encode(), tuple(list((addr[0], int(addr[1])))))msg = '\n欢迎 %s 进入聊天室' % name# 通知所有人for i in user:s.sendto(msg.encode(), tuple(list((i[1], int(i[2])))))# 将用户插入字典if data != None and data[3] == 'off':cursor.execute("update user set status = 'on', ip = '"+addr[0]+"', port = '"+addr[1]+"' where name = '" + name + "'")else:cursor.execute("insert into user values('" + str(uuid.uuid1()) + "', '" + name + "', '" + get_date_str_from_format(DATE_FORMAT_YYYY_MM_DD_HH_MM_SS) + "', 'on', '" + addr[0] + "', " + addr[1] + ")")db.commit()return# 处理聊天请求
def do_chat(s, user, cmd):# cmd = ['C','zhang','I','love','China']name = cmd[1]ori_msg = ' '.join(cmd[2:])msg = '\n%s 于 %s 发言:%s' % (name, get_date_str_from_format(DATE_FORMAT_YYYY_MM_DD_HH_MM_SS), ori_msg)# 将信息发送给出了自己的所有人for i in user:if i[0] != cmd[1]:s.sendto(msg.encode(), tuple(list((i[1], int(i[2])))))cursor.execute("select id from user where name = '" + name + "'")data = cursor.fetchone()user_id = data[0]cursor.execute("insert into message values('" + str(uuid.uuid1()) + "', '" + user_id + "', '" + ori_msg + "', '" + get_date_str_from_format(DATE_FORMAT_YYYY_MM_DD_HH_MM_SS + "')"))db.commit()return# 处理用户离开聊天室请求
def do_quit(s, user, name):msg = '\n' + name + ' 离开了聊天室'for i in user:if i[0] != name:s.sendto(msg.encode(), tuple(list((i[1], int(i[2])))))cursor.execute("update user set status = 'off' where name = '"+name+"'")db.commit()return# 子进程处理客户端请求
def do_child(s):while True:msg, addr_temp = s.recvfrom(1024)msg = msg.decode()cmd = msg.split(' ')# 字典用来存储用户信息:{name:(ip,port)}cursor.execute("select name, ip, port from user where status = 'on'")user = cursor.fetchall()addr = list(addr_temp)addr[1] = str(addr[1])if cmd[0] == 'L':do_login(s, user, cmd[1], addr)elif cmd[0] == 'C':do_chat(s, user, cmd)elif cmd[0] == 'Q':do_quit(s, user, cmd[1])else:s.sendto('请求错误'.encode(), addr_temp)# 发送管理员消息
def do_parent(s, addr):while True:msg = input('管理员消息:')msg = 'C 管理员 ' + msgs.sendto(msg.encode(), tuple(list((addr[0], int(addr[1])))))s.close()sys.exit(0)# 获取指定格式的日期字符串
def get_date_str_from_format(format):return time.strftime(format, time.localtime(time.time()))if __name__ == '__main__':HOST = sys.argv[1]PORT = (int)(sys.argv[2])ADDR = (HOST, PORT)# 创建数据库连接db = pymysql.connect('ip_address', 'username', 'password', 'db_name', charset='utf8')# 创建游标对象cursor = db.cursor()# 使用数据报套接字s = socket(AF_INET, SOCK_DGRAM)s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)s.bind(ADDR)ADDR = list(ADDR)ADDR[1] = str(ADDR[1])# 将管理员加入群聊cursor.execute("select * from user where name = '管理员'")data = cursor.fetchone()if data == None:cursor.execute("insert into user values('" + str(uuid.uuid1()) + "', '管理员', '" + get_date_str_from_format(DATE_FORMAT_YYYY_MM_DD_HH_MM_SS) + "', 'on', '" + ADDR[0] + "', " + ADDR[1] + ")")db.commit()# 创建子进程
pid1 = os.fork()
if pid1 < 0:print('创建一级子进程失败')
elif pid1 == 0:# 创建二级子进程pid2 = os.fork()if pid2 < 0:print('创建二级子进程失败')elif pid2 == 0:do_child(s)else:# 一级子进程退出,使二级子进程成为孤儿os._exit(0)
else:# 等待一级子进程退出os.wait()do_parent(s, ADDR)# 释放资源
cursor.close()
db.close()

2、客户端(Client.py)

import os
import signal
import sys
from socket import *# 子进程发送信息
def do_child(s, name, addr):while True:text = input(name + ' 发言(输入quit退出):')# 用户退出if text == 'quit':msg = 'Q ' + names.sendto(msg.encode(), addr)os.kill(os.getppid(), signal.SIGKILL)sys.exit('退出聊天室')# 正常聊天else:msg = 'C %s %s'%(name, text)s.sendto(msg.encode(), addr)# 父进程接收消息
def do_parent(s, name):while True:msg, addr = s.recvfrom(1024)print(msg.decode() + '\n' + name + ' 发言(输入quit退出):', end="")if __name__ == '__main__':HOST = sys.argv[1]PORT = (int)(sys.argv[2])ADDR = (HOST, PORT)# 使用数据报套接字s = socket(AF_INET, SOCK_DGRAM)while True:name = input('请输入姓名:')msg = 'L ' + names.sendto(msg.encode(), ADDR)data, addr = s.recvfrom(1024)if data.decode() == 'OK':data, addr = s.recvfrom(1024)if data.decode() != '':print(data.decode())breakelse:print(data.decode())pid = os.fork()if pid < 0:print('创建子进程失败')elif pid == 0:do_child(s, name, ADDR)else:do_parent(s, name)

二、使用方法:

1、服务端:

服务端需要通过脚本传入两个参数,一个是服务器的ip地址,另一个是服务器端的端口号

python3 Server.py 127.0.0.1 8888

2、客户端:

客户端和服务端一样,同样需要通过脚本传入两个参数,一个是服务器的ip地址,另一个是服务器端的端口号

python3 Client.py 127.0.0.1 8888

3、数据库脚本:

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 80015Source Host           : localhost:3306Source Schema         : chatroomTarget Server Type    : MySQLTarget Server Version : 80015File Encoding         : 65001Date: 02/03/2019 18:01:11
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for message
-- ----------------------------
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message` (`id` varchar(255) COLLATE utf8_bin NOT NULL,`user_id` varchar(255) COLLATE utf8_bin DEFAULT NULL,`msg` varchar(255) COLLATE utf8_bin DEFAULT NULL,`date` varchar(255) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;-- ----------------------------
-- Records of message
-- ----------------------------
BEGIN;
INSERT INTO `message` VALUES ('06989a8a-3cce-11e9-8b89-d0a637ea48d3', '561b4638-3cca-11e9-9ae6-d0a637ea48d3', 'hi', '2019-03-02 17:31:58');
INSERT INTO `message` VALUES ('06f25f28-3cd0-11e9-8d6a-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:46:17');
INSERT INTO `message` VALUES ('0b78ca64-3cd0-11e9-a12f-d0a637ea48d3', '561b4638-3cca-11e9-9ae6-d0a637ea48d3', 'hi', '2019-03-02 17:46:25');
INSERT INTO `message` VALUES ('0c0258d2-3ccc-11e9-99b8-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:17:48');
INSERT INTO `message` VALUES ('0cd50198-3cd0-11e9-a12f-d0a637ea48d3', 'b6989400-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:46:27');
INSERT INTO `message` VALUES ('0d52c082-3ccc-11e9-99b8-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:17:50');
INSERT INTO `message` VALUES ('0f1c73be-3cd0-11e9-8d6a-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:46:31');
INSERT INTO `message` VALUES ('108d953e-3cd0-11e9-a12f-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:46:34');
INSERT INTO `message` VALUES ('230fb1e4-3cce-11e9-8b89-d0a637ea48d3', '29665212-3ccb-11e9-b7e5-d0a637ea48d3', 'hi', '2019-03-02 17:32:46');
INSERT INTO `message` VALUES ('255f3faa-3cce-11e9-8b89-d0a637ea48d3', '29665212-3ccb-11e9-b7e5-d0a637ea48d3', 'hi', '2019-03-02 17:32:49');
INSERT INTO `message` VALUES ('443ff486-3ccf-11e9-807a-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:40:51');
INSERT INTO `message` VALUES ('46c77ecc-3ccf-11e9-807a-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:40:55');
INSERT INTO `message` VALUES ('4994ced4-3ccf-11e9-807a-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:41:00');
INSERT INTO `message` VALUES ('6bdee1c8-3cca-11e9-9ae6-d0a637ea48d3', '561b4638-3cca-11e9-9ae6-d0a637ea48d3', 'hi', '2019-03-02 17:06:10');
INSERT INTO `message` VALUES ('8ec4dcf4-3ccc-11e9-99d0-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:21:27');
INSERT INTO `message` VALUES ('9ecdc07a-3c18-11e9-9106-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-01 19:53:25');
INSERT INTO `message` VALUES ('a13f6cfa-3c18-11e9-9106-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', '你好', '2019-03-01 19:53:29');
INSERT INTO `message` VALUES ('a86a838e-3c18-11e9-9106-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-01 19:53:41');
INSERT INTO `message` VALUES ('b6817c2e-3ccd-11e9-8b89-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:29:43');
INSERT INTO `message` VALUES ('c1867d0a-3c18-11e9-9106-d0a637ea48d3', 'b6989400-3c18-11e9-9106-d0a637ea48d3', '大家好,我是d', '2019-03-01 19:54:23');
INSERT INTO `message` VALUES ('d4facb34-3c18-11e9-9106-d0a637ea48d3', '9070330a-3c18-11e9-9106-d0a637ea48d3', '大家好,我是管理员', '2019-03-01 19:54:56');
INSERT INTO `message` VALUES ('e18db12c-3ccc-11e9-a4d5-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:23:46');
INSERT INTO `message` VALUES ('e3915bea-3ccc-11e9-a4d5-d0a637ea48d3', '94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:23:50');
INSERT INTO `message` VALUES ('e71748e8-3ccb-11e9-99b8-d0a637ea48d3', 'dfe2a4fa-3ccb-11e9-99b8-d0a637ea48d3', 'hi', '2019-03-02 17:16:46');
INSERT INTO `message` VALUES ('e8ef9242-3ccb-11e9-99b8-d0a637ea48d3', 'dfe2a4fa-3ccb-11e9-99b8-d0a637ea48d3', 'hi', '2019-03-02 17:16:49');
INSERT INTO `message` VALUES ('f3cfad14-3ccb-11e9-99b8-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:17:07');
INSERT INTO `message` VALUES ('fe507e86-3ccf-11e9-8d6a-d0a637ea48d3', '92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'hi', '2019-03-02 17:46:03');
COMMIT;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,`join_date` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,`status` varchar(255) COLLATE utf8_bin DEFAULT NULL,`ip` varchar(255) COLLATE utf8_bin DEFAULT NULL,`port` int(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;-- ----------------------------
-- Records of user
-- ----------------------------
BEGIN;
INSERT INTO `user` VALUES ('29665212-3ccb-11e9-b7e5-d0a637ea48d3', 'e', '2019-03-02 17:11:28', 'off', '127.0.0.1', 62199);
INSERT INTO `user` VALUES ('561b4638-3cca-11e9-9ae6-d0a637ea48d3', 'c', '2019-03-02 17:05:33', 'off', '127.0.0.1', 65085);
INSERT INTO `user` VALUES ('6aee25d4-3ccb-11e9-a6e1-d0a637ea48d3', 'f', '2019-03-02 17:13:18', 'off', '127.0.0.1', 49177);
INSERT INTO `user` VALUES ('9070330a-3c18-11e9-9106-d0a637ea48d3', '管理员', '2019-03-01 19:53:01', 'off', '127.0.0.1', 8888);
INSERT INTO `user` VALUES ('92afe2b4-3c18-11e9-9106-d0a637ea48d3', 'a', '2019-03-01 19:53:04', 'off', '127.0.0.1', 65277);
INSERT INTO `user` VALUES ('94a3ccf2-3c18-11e9-9106-d0a637ea48d3', 'b', '2019-03-01 19:53:08', 'off', '127.0.0.1', 60116);
INSERT INTO `user` VALUES ('b6989400-3c18-11e9-9106-d0a637ea48d3', 'd', '2019-03-01 19:54:05', 'off', '127.0.0.1', 52335);
INSERT INTO `user` VALUES ('dfe2a4fa-3ccb-11e9-99b8-d0a637ea48d3', 'g', '2019-03-02 17:16:34', 'off', '127.0.0.1', 61773);
COMMIT;SET FOREIGN_KEY_CHECKS = 1;

基于python实现类似qq群聊功能相关推荐

  1. php仿qq群聊,用Python写一个类似qq群聊的聊天室

    用Python写一个聊天室 功能 : 类似qq群聊 1. 进入聊天室需要输入姓名,姓名不能重复 2. 有人进入聊天室会向其他人发送通知 xxx 进入了聊天室 3. 一个人发消息,其他人会收到消息 xx ...

  2. Java网络编程,模拟QQ群聊功能

    Java网络编程,模拟QQ群聊功能 一.网络编程知识点简介: 1.C/S架构:Client客户端/Server服务器: 涉及到的应用:桌面的应用软件,QQ,王者荣耀 涉及到的技术:Socket网络编程 ...

  3. html+css实现好友列表,类似QQ群聊成员列表

    html+css实现好友列表,类似QQ群聊成员列表. 1.最终效果图: 2.html部分: <body id="users"><div class="t ...

  4. Python实现群聊功能

    要实现群聊功能,你可以使用 Python 的网络编程库来构建一个简单的聊天服务器.下面是一个简单的例子: importsocket# 创建 socket 对象 s = socket.socket(so ...

  5. Java基于Socket实现聊天、群聊、敏感词汇过滤功能

    首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...

  6. iOS微信QQ聊天界面的UI框架以及Socket简单实现群聊功能

    7.1日更新 Python3 TCP Demo相关 https://blog.csdn.net/Deft_MKJing/article/details/80851879 2.2日更新,socket简易 ...

  7. 基于WebSocket实现一个简易的群聊功能

    本文主要来讲解如何使用WebSocket来实现一个简易的群聊功能 引入maven依赖 <dependency><groupId>org.springframework.boot ...

  8. 基于Vue+springboot+websocket实现的简短仿微信web聊天室(私聊和群聊功能)(可在线预览)

    写目录 一.界面展示 二.介绍 一.界面展示 之前闲着有空就给自己的个人博客搭了一些附加功能,聊天室也是其中之一,简单的实现了私聊.群聊功能,可以发送emoji表情和图片等,项目已经部署在www.tc ...

  9. QQ 群聊美少女语音AI(ChatGLM 本地化版本)

    QQ 群聊美少女语音AI(ChatGLM 本地化版本) ✨ 基于 go-cqhttp 以及 VITS-fast-fine-tuning + ChatGLM 实现 ✨ Combination of Ch ...

最新文章

  1. 统计简单学_常用统计图表
  2. Java8 HashMap实现原理探究
  3. [EffectiveC++]item17:以独立语句将newed对象置入智能指针
  4. 解决远程登陆Linux误按ctrl+s锁屏
  5. 闲谈“个人核心竞争力”与“危机感” !!!
  6. 单片机的 FIFO循环队列实现
  7. Java 文件操作二(重命名、设置只读、是否存在、指定目录中创建文件、获取文件修改日期、创建文件、文件路径比较)
  8. 一文读懂目前大热的AutoML与NAS!
  9. java混淆工具zelix比较_vscode,java环境
  10. 功能测试常用6种方法_云端功能测试:更好的12种方法
  11. matlab导入arcgis中国边界图,【干货】ArcGIS提取影像边界的几种方法
  12. deepin 相关
  13. GAMBIT、ICEM、HYPERMESH耦合面的处理方法
  14. H3C交换机端口镜像配置
  15. IEMS_11_课程信息相关的初始数据导入
  16. SFP光模块的多模和单模区别
  17. 病毒防治:清除***从它的寄生地开始
  18. 为什么说运维的未来必然是 AIOps?
  19. SpringCloud禁用Eureka自我保护模式
  20. 科技对金融业的告白信,有百融云创的落款

热门文章

  1. 对话连心医疗章桦:如何用AI云服务改变肿瘤治疗行业 | AI英雄
  2. MySQL自增从头开始
  3. iPhone iOS 设备如何 取消 信任此电脑
  4. 我的同学聚会-性格决定命运[转载]
  5. 【运动学】基于最小半径实现泊车仿真含Matlab源码
  6. 心型表白python代码
  7. php批号管理,批号_序列号编码规则
  8. B2B2C商城系统要多少钱?这些技巧需要知道
  9. 数据存储——手机内部文件存储
  10. 【编译报错】start value has mixed support, consider using flex-start instead