为什么Netty的Channel.write()写数据不能超过1024byte?如何设置能超过1024byte?

陌上草 发布于 2012/04/16 16:12
阅读 8K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

最近在使用Netty做一个项目,Netty只能传输byte类型的数据,但是Channel每次写数据不会超过1024byte,如果超过1024byte,接收端需要接收多次才能接收完所有数据,请问怎样才能一次完成接收大于1024byte的数据呢?有什么参数能设置吗?

以下是问题补充:

@陌上草:其实我也没弄清楚是接收限制还是发送限制。。我写的那一段ChannelBuffer的大小可以超过1024byte,但一旦超过1024byte,接收端就得分多次接收,也就是messageRecieved()方法得执行多次。。 (2012/04/17 12:55)
加载中
0
JavaGG
JavaGG
你意思是netty接收还是发送出去的限制??????
陌上草
其实我也没弄清楚是接收限制还是发送限制。。我写的那一段ChannelBuffer的大小可以超过1024byte,但一旦超过1024byte,接收端就得分多次接收,也就是messageRecieved()方法得执行多次。。
0
osc_216276
osc_216276
我虽没用过netty,但我觉得应该和服务器端或客户端的byte缓存数组的设置有关系,若缓存数组的大小事1024的话,那当缓存满的时候就小先清空缓存,然后才能接着传输活接收。
0
osc_216276
osc_216276
应该都有,遵循木桶原理,哪个小就按照哪个来,我只是猜测一个可能性,具体的我不懂。
0
JavaGG
JavaGG

读的限制可以设置的,,你可以看看NioWorker这个类里312行

channel.getConfig().getReceiveBufferSizePredictor();他通过这个参数得到大小,再通过计算得到buffer大小

0
ashray
ashray
看下你两端电脑的MTU是多少
abcbuzhiming
abcbuzhiming
回复 @陌上草 : tcp传输基本原理,系统底层有一个缓冲区,这个缓冲区是各家系统根据tcp/ip协议自己实现的,大小不同,且你无法直接控制大小,一般情况下,这个缓冲区会在被填满时,且网络闲置时发送。这个大小从512KB到4MB不等,当你发送数据超过这个缓冲区大小的时候,就只能被该缓冲区拆成一段段的发,也因此你的接收端会一段段的收到数据,这就是tcp传输中粘包、断包问题的由来
ashray
ashray
回复 @陌上草 : mtu是最大传输单元 socket不是用来传输数据的麽
陌上草
我用的是socket通信,怎么会和MTU有关系呢?
0
ChangeZ
ChangeZ
我感觉你可能问的是这个LengthFieldBasedFrameDecoder, http://netty.io/3.9/api/index.html,可以在API里看一下介绍
0
whbYC
whbYC
该评论暂时无法显示,详情咨询 QQ 群:点此入群
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部