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