时间:2021-05-22
按思路来聊:
类似微信,点击用户可以进入一对一聊天页面;另有聊天框列表包含所有存在聊天记录的一对一聊天框,点击进入聊天页面。
【数据结构】
因为双方都有聊天记录,所以每一个聊天实际上得储存两份,设计的数据结构如下:
A :
user_a = {“id”:1,”name”:”A”}B :
user_b = {“id”:2,”name”:”B”}A的聊天记录:
chat_a = { “id”:1, “user”:1, “who”:2, “name”:”B”, “new”:0, msg:[]}B的聊天记录:
chat_b = { “id”:2, “user”:2, “who”:1, “name”:”A”, “new”:0, msg:[]}msg实际上是个list,结构如下:msg = { “user”:发送者id, “name”:发送者name, “date”:发送时间, “content”:消息内容 }
【业务逻辑】
当A点击好友列表中B的名字–>进入聊天框(根据双方id通过字段user、who找到对应chat_a,chat = coll.find_one({“user”:user_a[‘id'], “who”:user_b[‘id']});如果该chat不存在,则利用双方id创建chat_a)
发送消息(更新chat_a和chat_b,如果chat_b不存在则创建chat_b;如果chat_b不在线则更新chat_b[‘new'] = 1)
A删除聊天框(删除chat_a)
【记录客户端连接】
由于是多个一对一聊天,所以不能直接用教程里的set来记录连接。
最后的决定是用一个 dict,用双方用户id拼接的字符串作为key,用list存客户端连接。
...SocketHandler(...):
chats = dict()...def on_open(self): ... #通过双方id来生成一个独一无二的字符串 min = user_a['id'] max = user_b['id'] if min >max: max = user_a['id'] min = user_b['id'] key = str(user_a['id'])+"_"+str(user_b['id']) #判断当前会话是否存在,存在则添加当前用户 if key in chats: SocketHandler.chats[key].append(self) #不存在则创建会话,并将当前用户添加进去 else SocketHandler.chats[key] = [self]【发送消息】
从客户端调用send函数,在服务端on_message函数中接受参数后更新双方聊天记录。之后调用send_to_all(key, message)来更新聊天窗口。
【发通知/更新聊天窗口】
更新数据库里的聊天记录后还要在聊天窗口更新html,所以需要通知该会话的连接者。
根据我们记录连接者的方式,对应的通知函数如下:
def send_to_all(key,message): for user in SocketHandler.chats[key]: user.write_message(json.dumps(message))【关闭连接】
根据我们记录连接者的方式,对应的关闭函数如下:
def on_close(self): ... #用on_open函数中的方法构造key if key in SocketHandler.chats: SocketHandler.chats[key].remove(self)#删除当前连接 if len(SocketHandler.chats[key]) == 0: del SocketHandler.chats[key]#当会话无连接者则删除会话经过上面的改造,就实现多个一对一聊天功能
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Laravel5.1框架模型一对一关系实现与使用方法。分享给大家供大家参考,具体如下:这篇文章主要记录模型的一对一关系,关联关系是Model的一种
一、延迟加载 resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、colle
vue+django实现一对一聊天和消息推送的功能。主要是通过websocket,由于Django不支持websocket,所以我使用了django-chann
作为一个ORM框架,hibernate肯定也需要满足我们实现表与表之间进行关联的需要。hibernate在关联方法的实现很简单。下面我们先来看看一对一的做法:不
一对一查询在实际开发中,经常会遇到一对一查询,一对多查询等。这里我们先来看一对一查询。例如:每本书都有一个作者,作者都有自己的属性,根据这个,我来定义两个实体类