Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

仓库地址

客户端: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
2
3
SchedulerBinding.instance.addPostFrameCallback((_) {
scrollController_scoll.jumpTo(scrollController_scoll.position.maxScrollExtent);
});

这行是等待页面刷新完成后执行对应代码,就会滑动到底部了

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包

其他的还有好多坑,时间过得太久忘了……

评论