如何等待流写入完成

Ton*_*Nam 1 c# networking networkstream

我有一个服务器应用程序,它侦听端口8888上的连接.我也在创建客户端应用程序.这是一个简单的应用程序,唯一困难的是管理多个连接.所以我只需要在计算机之间发送文件,所以我这样做的方式,我不知道它是否是怀特,但它的工作原理也许你们可以纠正我.这是发送文件时的算法:

NetworkStream stream = \\ initialize it

while(someCondition)
{
  // first I open the file for reading and read chunks of it
  byte[] chunk = fileRead(file, indexStart, indexEnd) // I have a similar method this is just to illustate my point

  stream.Write(chunk, \\other params)

   // since I often send large files it will be nice if I can wait here 
   // until the stream.Write is done. when debuging this the while loop 
   // executes several times then it waits. 

}
Run Code Online (Sandbox Code Playgroud)

另一方面,我从该流中读取字节并将其写入文件.

我还需要等待,因为我发送了多个文件,我想确保在移动到下一个文件之前已经发送了第一个文件.我知道我可以通过在传输完成后使用stream.Read方法来解决这个问题.并从客户端发回数据.但有时我相信知道stream.write何时完成将会有所帮助.


编辑

好的,所以根据你的答案我可以例如发送给客户端我计划发送的字节数.一旦客户端收到那么多字节,就意味着它完成了.但我的问题是这是否有效.我的意思是做类似的事情

在服务器上:

写数据"发送文件长度"

读取数据"检查客户端是否收到了长度"(例如,期待字符串确定)

写数据"tel客户端文件的名称"

读取数据"检查客户端是否收到了文件的名称"

写数据"开始发送文件的块"

读取数据"等到客户端回复字符串确定例如"

spe*_*der 5

线路完成后写入完成

stream.Write(chunk, \\other params)
Run Code Online (Sandbox Code Playgroud)

完成.值得注意的是,这并不意味着另一端已收到任何东西.实际上,紧接在该行之后,数据很可能在发送机器的某个缓冲区中.这意味着它现在已经无法控制.如果您想要收据确认,远程端必须让您知道.