仓库地址
客户端:jeanhua/alphab-client: 简洁美观的匿名加密聊天程序(客户端) safe-chat plus (github.com)
服务端:jeanhua/alphab-server: 匿名加密聊天程序(服务器) (github.com)
电脑端截图
手机端截图
分为以下几个方面
- flutter
- C#
- 加密
- 其他
一、flutter
既然是聊天软件,聊天列表是少不了的,这里我还是常规的用Listview,但是这个会遇到以下几个问题
自动滑动问题
当收到消息或者发送消息时,一般要将列表滑动到底部,即使用下面的代码
1 | scrollController_scoll.jumpTo(scrollController_scoll.position.maxScrollExtent); |
但是当消息长一点就滑动不全,就是划不到底部,网上的解决办法是延迟一秒钟再调用这个代码,但是这个观感就不好,有时候要显示的东西多了也任然无法解决
- 实际这个本质就是页面没渲染完成就滑动了,此时的
maxScrollExtent
不是底部,所以我们改成这行代码就行了
1 | SchedulerBinding.instance.addPostFrameCallback((_) { |
这行是等待页面刷新完成后执行对应代码,就会滑动到底部了
Listview滑动卡顿问题
因为是类似于QQ的聊天界面,我的listview的item是函数返回的行,可能是图片或者文字,然后就出现一个问题,当有图片时滑动会卡一下,网上也没有找到原因,经过多番研究后明白了
由于Listview会自动绘制看见的项目,看不见的会销毁,然后图片,因为图片大小不一,我只指定了宽度,然后高度会自动按比例缩放,就会导致绘制图片的时候卡一下,解决办法也很简单,在外层包一个组件然后指定高度为图片高度就行
二、C#
我服务器端是用C#做的,遇到以下几个问题
json
由于C#是强类型语言,一般将json反序列化是要写一个类,比较麻烦,这里有个简单的办法,就是将消息发送的json都用String:String的格式,然后直接反序列化为Dictionary<String,String>
就好了,简单快捷
三、加密
对于加密我是先用RSA非对称加密传输AES密钥然后后面用AES对称加密的(为什么不直接用RSA,因为非对称加密速度非常慢然后性能消耗比较大),然后一般传的是base64编码的内容
然后flutter和C#加密又有不同,flutter默认的填充方式和C#有点区别,这个不注意看半天不知道问题出在哪里
四、其他
网络传输
我刚开始是用socket传数据的,本来没啥问题,后面传图片的时候遇到问题了,一直json反序列化失败,要么就是无法解密base64,看了好久,发现问题处在socket的传输机制上,由于socket是流式传输,数据过长时会导致分包,就是你C#那边接收一次完成收到的数据不是完整的,就会导致解密失败
解密办法就是自己手动把数据分开,然后在里面编一个序号,服务端再重组,当然有一个最简单的办法,换成websocket,这个是应用层的,已经把分包和重组封装完毕了,直接暴力传就行,C#推荐fleck包