Android Socke通信缓冲堆积导致write阻塞问题分析

本文探讨了socket通信中write()阻塞的问题,分析了发送端与接收端速度不匹配导致缓冲区堆积的原因,并提供了检查发送缓冲区大小的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一个项目中使用socket通信传输数据,发现write()阻塞问题,经过调查是因为缓冲区堆积导致的,那么缓冲区为什么会堆积呢?

在我的代码中原因是:发送端发送数据的速度 > 接收端接收数据的速度。随着时间推移,导致发送端的数据量远远大于接收端数据量,导致了缓冲区堆积。

代码如下:
//连接socket服务端
private static Socket mSocket;
private static OutputStream mOutputStream;
private static InputStream mInputStream;
mSocket = new Socket(“10.10.10.5”, 6001);
mOutputStream = mSocket.getOutputStream();
mInputStream = mSocket.getInputStream();

//发送端写数据,速度快
mOutputStream.write(buffer);

//接收端读数据,速度慢
readSize = mInputStream.read(buffer);

当发送的数据量很大,接收端又没有及时的去读出数据,缓冲区就会堆积,最后造成write阻塞。

查看发送缓冲区大小:
cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304

发送端:已经发送到网络的数据需要暂存在send buffer中,只有收到接收端的ack后,系统内核才从send buffer中清除读走的这一部分数据,为后续的发送数据腾出空间。

接收端:接收端将收到的数据暂存在receive buffer中,自动进行确认,但如果socket所在的进程不及时将数据从receive buffer中取出,最终将导致receive buffer填满,由于TCP的滑动窗口和拥塞控制,接收端会阻止发送端向其发送数据。

对于应用程序app,如果继续发送数据,最终将导致send buffer填满,write阻塞。

结论:接收端程序读取数据的速度跟不上发送端发送数据的速度,最终将导致write调用阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值