持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
TCP特性-缓冲区
之前一直有个疑惑,假设服务端向客户端不断的发送大量数据,而客户端处理不过来怎么办?现在终于也有了答案。
TCP 缓冲区
TCP的缓冲区分为两个部分
-
用户缓冲区 (接收发送的缓冲区,可以通过
setSendBufferSize修改) -
TCP低层缓冲区 (操作系统TCP模块的缓冲区,各系统下变现会不同,无法修改)
TCP通信模块流程复杂,但这些复杂的流程不需要上层软件去操心,这是系统底层TCP模块的事情,我们只需要将数据丢入缓冲区。
由于TCP是可靠的协议,当网络很差时,数据发送失败时,tcp socket程序会报错。 但是有一种情况,当网络通道遭到破坏时,无法立即给出报错提示。这种场景包括:
-
客户端断开网络连接,但依然有网络连接时(拔网线,路由器电源还在)
-
服务端断开网络,客户端向服务器发送数据。
大家可以用一些即使通信的软件去试试,服务端拔不了网线,就用拔自家的网线吧。
如何解决这一痛点,那就是使用心跳包 + 确认包确认收到的协议。
又扯远了,回到正题。。
TCP发送消息时阻塞
笔者之前有个误区,我认为:
TCP发送端在发送数据时,一直往缓冲区里一直放,底层的TCP模块就会一直发送给接收端,无论接收端是否能处理过来
实际上,当发送端的缓冲区满了之后,就会一直阻塞,当接收端取了数据之后,发送端缓冲区空出来了,发送端才可以继续往缓冲区中放。
所以... 文章引言部分的问题压根就不存在!
因为不可能存在处理不过来的情况,而作为安卓客户端接收的话,唯一的做法就是在接收到数据之后,加个线程去处理数据,接收线程继续接收。