【问题标题】:How does tcp socket's read method work?tcp socket 的 read 方法是如何工作的?
【发布时间】:2016-12-26 22:31:39
【问题描述】:

目前我遇到一种情况,我想将输入流读取到一个只包含一个字节的字节数组中。我重复这样做一定次数,以确保我得到相应的字节长度。例如,40 个字节读取 40 次。但是在这个套接字的另一端,它在每个写入方法中写入 512 个字节。(实际上在大多数情况下读取缓冲区是 512 个字节,只是在某种情况下我一次读取一个字节)。我想知道在这种情况下,发送套接字是否仍然每次通过网络写入 512 个字节,而接收套接字接收所有这些字节并将它们存储在本地字节数组中,并且 read 方法每次从本地数组中读取一个字节或发送套接字每次也只写入 1 个字节?这个问题可能听起来有点困惑,希望我说清楚了。非常感谢任何帮助!

【问题讨论】:

    标签: java sockets tcp


    【解决方案1】:

    它会一直阻塞,直到内核的套接字接收缓冲区中有一些数据可用,然后传输尽可能多的可用字节。

    【讨论】:

    • 这是否意味着即使read方法每次只填充一个字节数组,接收socket可能已经收到512字节,调用read方法40次不会触发40次write方法被在发送套接字中调用?
    • "然后传输尽可能多的可用字节。"对我来说听起来有点困惑。您的意思是,无论读取方法向字节数组填充多少字节,内核的接收缓冲区都会为新的输入流数据重置?
    • @user1870797 (1) 调用读取方法不会“触发写入方法”。发送应用程序调用 write 方法。 (2) 混淆的是“无论读取方法填充多少字节到字节数组,都为新的输入流数据重置”的措辞。我不知道你在说什么,从“重置”这个词开始。
    • 抱歉我的表述不准确。我的英语不是很好。 “重置”有点像在这里分配一个新的接收缓冲区。所以每次调用 read 时,无论你读了多少字节,接收缓冲区都会被清除并分配一个新的空数组。
    • 我想以前我误解了你的答案。今天我写了一个测试应用程序,它让我发现接收到的所有字节似乎都存储在接收缓冲区中。并且 read 方法与您所说的发送套接字写入多少字节无关。所以频繁调用read填充单字节数组不会造成频繁的网络通信。它只是读取本地接收缓冲区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多