我们直接用群聊举例说明:
前提: 每台安卓手机自己生成一个服务器局域网其他手机都可访问,且暂时不考虑被冻结杀死的情况,假设设备一直运行中,wifi也一直稳定连接。
现在群里有三个人:张三的ip为103,李四为104,王五为105.
1.张三向群聊发文字消息
张三群发:
{
type; "text",
from: "192.168.0.103",
content: "大家好"
}
此时,所有人能够根据type值判断这是一个文本消息,并直接显示。这很简单。
2.张三向群聊发图片消息,发的是本地的一张刘德华的海报。
张三群发:
{
type; "image", //如果是视频,这里是video
from: "192.168.0.103",
path: "/local/usr/haibao.png", //如果是视频,这里是视频的相对地址
}
现在,李四和王五都收到了type="image"的图片消息,为了简化先不考虑预览,我们先用一个设计图素材表示这是个图片消息,现在重点来了。假设张三一直在线,李四只要点这个图片其实是能看到图片的,假设张三不在线了,李四王五就不能查看这个图片了。这肯定体验不好,而且我可以很简单的解决这个问题,如下:
张三发了图片后(注意上面的设计,from相当于是服务器基础地址,path是相对地址,很重要),李四立马查看这个图片,李四应该这样查看图片:
let url = "http://" + from + path, 这样可以得到一个完整的图片的地址。
这个和ios开发的图片查看,甚至是微信聊天其实是同一个道理,我之前专门研究过这个,他们的内部实现是这样的,微信聊天发了一个图片,这个图片上传到了微信服务器。用户点击这个图片的时候,先下载到本地,然后查看的是本地的图片。
很明显,李四的ip是104,李四在查看图片的时候应该先检查下本地是否已经下载了这张图片:
let self_ip = "192.168.0.104"
let url = "http://" + self_ip + path, 检查这个图片如果在,都在本地了直接访问本地的即可,如果不在,先download下来,成功了再查看,查看的一定是本地的这个文件。
这样其他的查看的文件全部是自己下载到本地的文件,而且这个下载过程可以用第三方框架直接下载(我估计可以,因为是http协议)
1. 群聊发文件全部转化为文字文本消息聊天了
2. 发视频,图片消息也可以瞬间到达,因为还是文本聊天。
3. 如果李四点了图片消息才检查并下载,如果他一直不点,就不用帮他下载,只有要查看的时候才下载。到此,文件消息全部转化为文本聊天。而且文件传输,也转化为1对1的文件下载了(和群聊群发没什么关联),而且这个下载应该是可以使用第三方框架一键完成实现的。
4. 就算要发excel文件,同样的思路。
感觉所有问题难点,全部解决了呢。