java二进制流压缩进行网络传输_socket传送二进制流的一些总结

第一次实质性的接触socket通信方面的工作,所以遇到的问题还真不少,写篇博客记录一下,提升下记忆。

需求是通过私有协议进行二进制数据的传输,必须保证数据包不能被丢失,所以选择tcp的socket进行通信。

1. 遇到的第一个问题是客户端与服务端的socket通信没有保持持续的连接状态

这个是一个想当然的错误。想当然的以为TCP是有连接的通信,但是你如果长时间不通信,服务端一直保持着通信,这对服务器资源是一种极大的浪费。客户端与服务端的连接是需要占用一定资源的,而服务端的资源是有限的。如果一直保持连接状态,那么你的服务器的性能肯定是有问题的。

解决这个问题的办法是保活。服务端发送心跳包,客户端接受到之后进行回应。客户端告诉服务器,还在线,不要断开连接。如果客户端长时间没有回应,服务器断开与此客户端的连接,减少资源占用。

2. 二进制文件的读写问题

第一次尝试读取二进制文件采取了分段读取的方式。测试过程中发现一个很大的问题:文件读取到部分就会中断读取。debug下,得出是读取到了空字符('\0')。这个直接导致一次读取到内容在发送前丢失,甚至有些情况下会有空字符,客户端接受时会产生崩溃现象。

既然分段不行,就干脆全部读取,然后在分段发送。boost.asio库支持对vector包装发送,分段发送时,把一块二进制流拷贝到vector中,然后整体发送。

3. 提高二进制流的传输效率

直接传输二进制流不是一个高效的行为,也不是一个安全的行为。直接发送一个二进制流很容易被截获,从而导致信息泄露。

提高二进制流传输效率的办法就是加密压缩再发送。服务器加密压缩&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种高级编程语言,具有广泛的应用领域。二进制是一种计算机数据的表示方式,它由0和1组成,常用于存储和传输数据。压缩是一种通过降低数据的体积来节省存储空间和传输带宽的技术。而zlib是一个在Java中用于数据压缩和解压缩的开源库。 使用Java进行二进制压缩可以借助zlib这个开源库。zlib提供了一系列的API,可以用于将数据压缩为zlib格式或解压缩zlib格式的数据。 在使用Java进行二进制压缩之前,需要先导入zlib库并确保其正确配置。然后,可以使用Java提供的输入输出类(如InputStream和OutputStream)来读取和写入数据。 首先,需要创建一个输入来读取待压缩二进制数据。可以使用Java提供的FileInputStream类来读取文件,或者使用ByteArrayInputStream类来读取内存中的数据。 接下来,需要创建一个输出来写入压缩后的数据。可以使用Java提供的FileOutputStream类来写入到文件,或者使用ByteArrayOutputStream类来写入到内存中。 然后,创建一个zlib压缩实例。可以使用Java提供的Deflater类来进行压缩操作,通过调用其相关方法设置参数,然后使用其方法进行实际的压缩。 将读取到的二进制数据传递给Deflater类的方法,进行压缩操作,并将压缩后的数据写入到输出中。 压缩完成后,关闭输入和输出,并进行必要的资源释放。 在需要解压缩的时候,可以使用Java提供的Inflater类来进行压缩操作,实现与上述类似的步骤。 总之,使用Java进行二进制压缩可以借助zlib库来实现,通过合理使用相关的类和方法,可以轻松地对二进制数据进行压缩和解压缩,从而节省存储空间和传输带宽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值