记录2025-3-9
到2025-3-23
这两周的生活。
工作&生活
今天有时间对年初上班到现在的工作进行总结。
这一个多月基本上每天都处于深度脑力工作状态,因为我这边的负责的项目需要在2026年底进入现场调试,整个软件系统的工作量很大,所以从年初上班开始,我就一直在忙着做这件事情。
整个总控的开发工作应该是从去年9月分项目评审通过后开始的,花了大概3个月的时间对系统的总体框架、技术选型等做了梳理,包括在后期对部分功能进行了一些探索性、测试性的开发。最后得出了一个算是比较成熟的框架。
今年上班,就着手开发。截至今天(3-21),初步完成了web客户端、web服务端、中间件、接收机、MCU、txy模块的开发。整个过程中也是在不断的迭代优化,提升系统的稳定性和可用性。
有信心,按时完成项目开发。💪
整个开发过程中,也让我对系统级层面的开发有了更深入的理解,让我对觉知此事须躬行
这句话有了更深刻的体会,即使在前期想的感觉一个很简单的功能,当实现起来的时候,可能需要很多的细节考虑,不要轻易的认为这么简单的功能,谁都能做到。
犹记得以前有老师说过一句话,“一瓶子不满,半瓶子咣当”;始终怀着一颗学徒的心,谦逊严谨。
突发奇想
刚才看到一个新闻,某V偷税漏税被罚。你永远不知道隔着屏幕,在你对面的是一个什么样的人。
这句话的含金量还在上升。屏幕上的你,人模狗样,说的比唱的还好;现实中,却干着一些见不得人的勾当,像一群躲在臭水沟中的老鼠。
还有当一个人的物质条件和他所处的环境不匹配时,就要注意了,他很可能做了某些不道德的事情。记住,能量守恒定律,一个人他从太阳下获得能量是透明的,但是他的外在物质条件表现能力却远远高于他的能量储备,那么他一定从其它地方获得了额外的能量,他为什么能获得这些不该属于他的能量呢?学过物理的人都知道,他一定是付出了某些东西,才获得了能量,那么这些东西是什么呢?显而易见,这部分东西它是不能见光的,至此,懂了吗?
TCP粘包问题
tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。粘包可能发生在发送端也可发生在接收端。
- 由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法。简单来说就是当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。
- 接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据。
出现粘包的关键在于接收方不确定将要传输的数据包的大小,因此可以对数据包进行封包和拆包的操作。
- 封包:给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了。包头部分的长度是固定的,并且它存储了包体的长度,根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包。比如可以自定义一个协议,数据包的前4个字节为包头,里面存储的是发送数据的长度。
- 拆包:接收方收到数据后,根据自定义的协议,将数据拆解为包头和包体。根据包头中的包体长度,就可以正确解析出一个完整的数据包。比如可以自定义一个协议,数据包的前4个字节为包头,里面存储的是发送数据的长度。接收方收到数据后,根据包头的长度,就可以正确的拆分出一个完整的数据包。
关于TCP发和收数据时的精度丢失问题
TCP协议以流模式进行数据传输,在发送数据前,通常需要先进行序列化,建议使用gob
对数据进行序列化。给出部分示例代码:
// 序列化
func serialize(s interface{}) ([]byte, error) {
// 遇到形如:Error encoding data: gob: type not registered for interface: main.D
// 解决方法:先注册类型,再序列化
gob.Register(D{}) // struct s 中有 D 类型,需要先注册
var buffer bytes.Buffer
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(s)
if err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
// 反序列化
func deserialize(data []byte, ms *MyStruct) error {
// ms 必须是指针类型,需要和序列化时类型一致
// 序列化中注册的类型也需要在反序列化时注册
gob.Register(D{})
buffer := bytes.NewBuffer(data)
decoder := gob.NewDecoder(buffer)
err := decoder.Decode(ms)
if err != nil {
return err
}
return nil
}
链接
- AI去除水印
- Server-Sent Events,一种通信方式,客户端连接到服务端后,服务端可以主动推送数据到客户端。该文介绍其在AI中的应用。
- 免费制作封面