java中receive功能,Socket.Receive什么时候返回数据?

handler.Receive(bytes)什么时候返回?

文档:

如果没有可用于读取的数据,则接收方法将阻塞,直到数据可用,除非使用Socket.ReceiveTimeout设置超时值 . 如果超出超时值,则Receive调用将抛出SocketException . 如果您处于非阻塞模式,并且协议堆栈缓冲区中没有可用数据,则Receive方法将立即完成并抛出SocketException . 您可以使用Available属性来确定数据是否可供读取 . 当Available为非零时,重试接收操作 .

当它“溢出”并且接收到超过1024个字节时,它是否返回并存储int bytesRec中接收的字节数?

不,它总是返回已读取的字节数 . 如果没有,你怎么知道 bytes 的哪些部分包含有意义的数据,哪些部分仍未使用?

理解套接字通常是如何工作的是 very important :字节可能到达数据包,但就接收器而言,每个字节应该独立考虑 . 这意味着无法保证您将获取发件人发送的块中的字节,当然也无法保证有足够的数据来填充缓冲区 .

如果您只想处理1024字节块中的传入数据,那么继续调用 Receive 是您自己的责任,直到它总共释放了1024个字节为止 .

如果是这样,这可能听起来很愚蠢,如果更多字节到达会发生什么,因为它在变量中存储了1024个字节而没有监听可能在那时到达的更多字节?

让我们重申 Receive 将不会在缓冲区中存储1024个字节,因为它的大小为's the buffer' . 它将存储_2425613_ 1024字节 .

如果网络堆栈内部缓冲的数据多于缓冲区可以容纳的数据,则会将1024个字节返回给您,其余的将保留在网络堆栈的缓冲区中,直到再次调用 Receive 为止 . 如果 Receive 已经开始将数据复制到缓冲区,那时从网络接收到更多数据,那么很可能会发生的情况是这些将不得不等待下一次 Receive 呼叫 .

毕竟,在任何时候都没有人提供保证 Receive 会给你所有的数据(尽管当然这是可取的,这是大多数时候发生的事情) .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值