当我们做networkstream.write()时会发生什么?

时间:2016-04-04 11:26:33

标签: c# networking networkstream

我有2个节目。 1台服务器和1台客户端。

在客户端,它是这样的:

while(statement)
{
    networkstream.write(data);
}

在服务器中它是这样的:

while(statement)
{
    while(statement)
    {
        ReceiveData;
    }

    Do other stuff;
}

因此,虽然客户端可以非常快速地写入网络流,但服务器仍然必须先处理数据才能阅读更多数据。

当客户端已经进行了包含写入的4圈循环时会发生什么,而服务器仍然只读取了1次。

有没有办法让客户知道何时可以再写一次? 还有当客户制作几个“.write”时会发生什么?服务器是否保留所有内容并将其全部读取,或者已发送的数据是否被覆盖?

希望你能理解我的问题。如果您愿意,可以编辑问题标题。

1 个答案:

答案 0 :(得分:3)

您的.write和实际电线之间有一大堆图层。这些层可以执行各种操作,从纠错到确保您的网络流量不会与其他人发生冲突等。至少,它们为您提供缓冲和阻止(如果您发送的太多或 - 在接收方 - 还没有数据)。

要回答你的问题,沿线的某个地方将是一个缓冲区(一块内存),用于写入字节。直到他们被送到下一站,它将阻止(等待/挂起...)。这些呼叫将沿着堆栈向上移动,在接收侧向上移动,然后向下移动到另一侧并再次向上移动。因此,当您的write返回时,您可以合理地确定一切正常,除非您找回错误代码,异常或错误处理工作。

如果服务器在处理您的请求时速度很慢,它将无法快速到达read,因此您和它们之间的缓冲区将会填满,此时写入将停止。

在不同的层上也有很多不同的缓冲区,完整的答案会非常复杂。 https://en.wikipedia.org/wiki/OSI_model