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

Python怎么实现在线聊天室私聊

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Python怎么实现在线聊天室私聊

本篇内容主要讲解“Python怎么实现在线聊天室私聊”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现在线聊天室私聊”吧!

实现思路

对于私聊,我觉得应该有如下两点需要实现

  • 私聊列表更新
    每个人都需要有一个私聊的列表,并且需要准实时的更新,这样这个人才能知道当前谁准备和自己私聊,以及自己正在私聊的人。

  • 私聊聊天室
    对于私聊的聊天室,其实可以复用群聊的聊天室实现,只不过这个聊天室里只有两个人而已。同时对于消息的传递,同样可以复用群聊中实现的功能。

前端布局

那么既然思路有了,首先就开始布局。这一点对于一个半残前端来说,太楠楠楠了,搞了好久了,只整出这么个布局,略丑,但是也没办法了。

Python怎么实现在线聊天室私聊


对于不会调样式的我来说,这能对原有的 CSS 代码做些简单的修改了

在原来所有用户列表旁增加一个私聊

<div class="chat_pleft"> <ul class="puser_list" title="" id="pchat"> <li class="fn-clear selected"><em id="pall">所有私聊</em></li> <li class="fn-clear" data-id="112" id="private"><span></span><em>暂时没有任何私聊</em></li> </ul> </div>

然后再通过调整控件的宽度,来使得新增的 div 显示在聊天框旁边,而不是在下边

.chat_left{ padding:20px; width:-moz-calc(100% - 440px); }.chat_right{ width:199px; }.chat_pleft{ width:199px; }

好了,页面布局就说这么多,说多了都是泪。

私聊聊天室

现在开始编写后端逻辑,首先我们要先有一个私聊的聊天室,那么先来改造下 create_room 函数,创建私聊

@main.route('/createroom/', methods=["GET", 'POST'])@login_requireddef create_room(chatwith=None): if chatwith: rname = chatwith if r.exists("pchat-" + rname + '-' + current_user.username) is False: r.zadd("pchat-" + rname + '-' + current_user.username, current_user.username, 1) r.zadd("pchat-" + rname + '-' + current_user.username, rname, 2)...

当前函数可以接收一个 chatwith 的参数,如果该参数不为 None 则在 redis 中创建 pchat 数据,即为私聊聊天室。

接下来创建私聊页面视图函数,这里在后面可以完善成需要某些权限才可以发起私聊

@main.route('/privatechat/', methods=['GET', 'POST'])@login_requireddef private_chat(): # 后面可以增加私聊权限 user_right = True if user_right: uname = request.args.get('to', "") create_room(chatwith=uname) ulist = r.zrange("pchat-" + uname + '-' + current_user.username, 0, -1) messages = r.zrange("pmsg-" + uname + '-' + current_user.username, 0, -1, withscores=True) msg_list = [] for i in messages: msg_list.append([json.loads(i[0]), time.strftime("%Y/%m/%d %p%H:%M:%S", time.localtime(i[1]))]) return render_template('privatechat.html', rname=uname, user_list=ulist, msg_list=msg_list) else: pass

下面还需要一个返回私聊列表的函数

# 获取个人私聊信息@main.route('/api/pchat/<user>', methods=['GET', 'POST'])def pchat_info(user): pchat = r.keys(pattern='pchat-*') pchatlist = [] for i in pchat: i_str = str(i) user1 = i_str.split('-', 2)[1] if user in i_str: pchatlist.append({user1: i_str}) html = [] for i in pchatlist: html.append(f'<li class="fn-clear"><em id="{list(i.keys())[0]}" onclick="pchat(this.id)">{list(i.values())[0]}</em></li>') return json.dumps(html)

这里直接拼接了 HTML 代码并返回,之所以这么做是因为 JavaScript 代码能力过弱,在 Python 侧做了。

在写这块代码时,我是深刻的体会到了 Vue 等前端框架的好处,不仅仅是快速搭建 UI,在处理数据等方面也是爽的一米。

最后就是改造发送消息的函数 send_chat

... rtype = request.form.get("rtype", "") if rtype and rtype == 'p': ulist = r.zrange("pchat-" + rname + '-' + current_user.username, 0, -1) if current_user.username in ulist: body = {"username": current_user.username, "msg": info} r.zadd("pmsg-" + rname + '-' + current_user.username, json.dumps(body), time.time()) socket_send(info, current_user.username) data = json.dumps({'code': 200, 'msg': info}) return data else: data = json.dumps({'code': 403, 'msg': 'You are not in this room'}) return data...

前端需要在 URL 参数中传递 rtype 参数来标识该请求是私聊发出的,其他代码基本复用原来的。

前端改造

首先就是要定时刷新私聊列表

// 定时更新私聊列表 setInterval(function() { $.get("http://127.0.0.1:8889/api/pchat/" + "{{ current_user.username }}",//GET请求的url地址 function(data,status){ var roomlist = JSON.parse(data); for (var i =0; i<roomlist.length; i++) { li_html += roomlist[i]; } console.log(li_html); $("#pchat").html(li_html);//更新列表内容 }); }, 5000); //定时刷新界面(0.5秒)

这里有一些硬编码,请忽略

接下来就是发起私聊的入口了,这里我设置到了双击某个用户,即可发起私聊

// 用户列表操作var fromname = $('#fromname').val();var to_uid = 0; // 默认为0,表示发送给所有用户var to_uname = '';$('.user_list > li').dblclick(function(){to_uname = $(this).find('em').text();to_uid = $(this).attr('data-id'); var redirect_url = 'http://' + document.domain + ':' + location.port + '/privatechat/?to=' + to_uname;if(to_uname == fromname){ alert('您不能和自己聊天!');return false;}if(to_uname == '所有用户'){ $("#toname").val('');$('#chat_type').text('群聊');}else{ // 新开窗口私聊 window.open(redirect_url);}$(this).addClass('selected').siblings().removeClass('selected');});

当然,用户也可以单击私聊列表来进入私聊聊天室,因为在后端返回时已经给 em 标签设置了 onclick 事件,这里直接实现事件函数即可

function pchat(id){ var to_user = id; var redirect_url = 'http://' + document.domain + ':' + location.port + '/privatechat/?to=' + to_user; window.open(redirect_url); }

这样,基本改造完成,可以愉快的私聊喽!

私聊效果

Python怎么实现在线聊天室私聊

到此,相信大家对“Python怎么实现在线聊天室私聊”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

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

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

Python怎么实现在线聊天室私聊

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

下载Word文档

猜你喜欢

Python怎么实现在线聊天室私聊

本篇内容主要讲解“Python怎么实现在线聊天室私聊”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现在线聊天室私聊”吧!实现思路对于私聊,我觉得应该有如下两点需要实现私聊列表更
2023-06-02

AngularJS+Node.js实现在线聊天室

不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍,对于基本的使用依然有很多说不清道不明的疑惑,于是决定通过做一个在线聊天室帮助理解。DEMO可
2022-06-04

Node.js怎么实现在线实时多人聊天室

本篇内容介绍了“Node.js怎么实现在线实时多人聊天室”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!文件结构如下:前端部分:登录页面Log
2023-07-04

Python实现web聊天室

使用Python模块中的select模块实现web聊天室功能select模块Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持sel
2023-01-31

python socket实现聊天室

本文实例为大家分享了python socket实现聊天室的具体代码,供大家参考,具体内容如下 server端import socket import json,struct from concurrent.futures import Th
2022-06-02

使用socket实现网络聊天室和私聊功能

使用socket技术实现网络聊天室和私聊功能,具体内容如下话不多说先上图:1、聊天室群聊页面在线用户的联系人列表socket连接页面私聊页面项目介绍与服务端实现socket连接:每个客户端连接到服务器的时候,服务器会将每个连接的socket
2023-05-30

Node.js+express+socket怎么实现在线实时多人聊天室

本文小编为大家详细介绍“Node.js+express+socket怎么实现在线实时多人聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js+express+socket怎么实现在线实时多人聊天室”文章能帮助大家解决疑惑,下
2023-06-17

golang websocket聊天室怎么实现

要实现一个golang的websocket聊天室,可以遵循以下步骤:导入所需的包:import ("fmt""log""net/http""github.com/gorilla/websocket")定义一个websocket连接的upg
golang websocket聊天室怎么实现
2024-02-29

Java怎么实现NIO聊天室

这篇文章给大家分享的是有关Java怎么实现NIO聊天室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。功能介绍功能:群聊+私发+上线提醒+下线提醒+查询在线用户文件Utils需要用maven导入下面两个包
2023-06-15

uni-app小程序实现微信在线聊天功能(私聊/群聊)

这篇文章主要介绍了uni-app小程序实现微信在线聊天(私聊/群聊),今天记录一下项目核心功能的实现过程。页面UI以及功能逻辑全部来源于微信,即时聊天业务的实现使用socket.io,前端使用uni-app开发,后端服务器基于node实现,数据库选择mongoDB,需要的朋友可以参考下
2023-02-18

SpringBoot+WebSocket怎么实现在线聊天

本篇内容主要讲解“SpringBoot+WebSocket怎么实现在线聊天”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot+WebSocket怎么实现在线聊天”吧!在线聊天使用
2023-06-19

编程热搜

  • 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动态编译

目录