这周一就须要交android大实验做业,android大实验作了一个二手商城,可是功能太少了,android老师要求大实验要有一些特点。就想着实现一下实时聊天。而后就利用周日时间试了一下。android
实时聊天须要socket链接。普通的后台请求是http或者https请求,这表明着前台发出请求,后台响应请求,就结束了。而socket协议是一种长链接,一旦前台或者后台创建链接后,须要一方发出关闭链接才会断开。在链接中客户端和服务端能够随意的互相发送信息。这很是适用于实时聊天情景。若是实时聊天使用经常使用的http协议,不但会每发出一条消息就发出一个请求,这会占用大量服务器资源,而且服务端没法主动向接收客户端发送消息。git
聊天界面实质上也是一种列表,只要使用android经常使用的列表布局就能够,只须要判断一下一条消息是不是本人发出,若是是本人发出,须要在右边显示信息
具体实现能够从网上找一篇博客来实现。值得注意的是,每一个聊天气泡仍是颇有意思的,咱们看到的聊天气泡也是背景图片,可是是一种特殊格式的背景图片,他会随着内容的变化而拉伸,这一切都是android本身变化的,官方叫这种图片为点九图。咱们先看一下使用点九图与不使用点九图的差异github
点九图也是能够本身制做的,这里咱们理解一下他的大体原理
上边黑线表明水平拉伸时拉伸的区域,
左边黑线表明竖直拉伸的区域,
底部黑线和右边黑线表明内容的显示区域,
显示效果如图。
点九图须要被设置为背景图片而且已.9名字结尾。如background.9.png。
可能因为使用的场景很少,网上找不到现成的资源,我去github一个成品项目里找到了一个拿来直接使用。
给你们个本项目链接,不用再去找了https://github.com/zhaokaiqia...web
实现交互通讯参考了另外一篇博客。https://xlui.me/t/spring-boot...
大概原理就是两个客户端分别与服务端创建socket通讯,同时订阅一个地址的消息。固然这个地址带有本用户id。发送消息的时候,须要发送给另外一个地址,而且带有接收方的id,服务器负责接收发送数据而且经过接收方id发送给接收方所接收的数据。spring
具体实现方式能够参考上面的博客,博客里实现了广播,动态群组,点对点消息。也能够看本项目
https://github.com/zhaokaiqia... 只用到了点对点消息。数据库
有一个问题,在设计数据库的时候chat与user为多对多关系,可是chat里其实只有两个user,分别对应聊天的两我的A与B。对于A来讲,B是他的聊天对象,对于B来讲,A是他的聊天对象。这就须要对chat.users.get(0)与当前登陆用户id判断是否相等,来显示对方与本身的用户名和头像。
暂时没有想到好的解决办法。服务器
在实现的过程当中因为时间紧迫也作了不少妥协。可是写大实验,只要实现就行,老师根本不关心会不会有bug,你用了什么实现。感谢黄庭祥学长在我实现的时候给予的帮助websocket