我有2个节目。 1台服务器和1台客户端。
在客户端,它是这样的:
while(statement)
{
networkstream.write(data);
}
在服务器中它是这样的:
while(statement)
{
while(statement)
{
ReceiveData;
}
Do other stuff;
}
因此,虽然客户端可以非常快速地写入网络流,但服务器仍然必须先处理数据才能阅读更多数据。
当客户端已经进行了包含写入的4圈循环时会发生什么,而服务器仍然只读取了1次。
有没有办法让客户知道何时可以再写一次? 还有当客户制作几个“.write”时会发生什么?服务器是否保留所有内容并将其全部读取,或者已发送的数据是否被覆盖?
希望你能理解我的问题。如果您愿意,可以编辑问题标题。
答案 0 :(得分:3)
您的.write
和实际电线之间有一大堆图层。这些层可以执行各种操作,从纠错到确保您的网络流量不会与其他人发生冲突等。至少,它们为您提供缓冲和阻止(如果您发送的太多或 - 在接收方 - 还没有数据)。
要回答你的问题,沿线的某个地方将是一个缓冲区(一块内存),用于写入字节。直到他们被送到下一站,它将阻止(等待/挂起...)。这些呼叫将沿着堆栈向上移动,在接收侧向上移动,然后向下移动到另一侧并再次向上移动。因此,当您的write
返回时,您可以合理地确定一切正常,除非您找回错误代码,异常或错误处理工作。
如果服务器在处理您的请求时速度很慢,它将无法快速到达read
,因此您和它们之间的缓冲区将会填满,此时写入将停止。
在不同的层上也有很多不同的缓冲区,完整的答案会非常复杂。 https://en.wikipedia.org/wiki/OSI_model