2011-08-31 69 views
1

我有一个服务器应用程序,用于侦听端口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. 

} 

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

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


编辑

确定,所以根据您的回答,我可以例如发送到客户端,我刨发送的字节数。一旦客户端收到很多字节就意味着它完成了。但我的问题是如果这是有效的。我的意思是做类似

在服务器上:

写入数据“发送文件长度”

读取数据“检查,看看是否客户端收到的长度”(期待一个字符串OK为例)

写入数据“电话客户端文件的名称”

读取数据“检查,看看是否客户端recived的文件名”

写入数据“开始发送文件的chuncks”

读取数据“等到客户用字符串OK例如回复”

+4

我错过了什么吗? stream.Write调用将被阻塞,所以它一直等到它完成。 http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.write.aspx – Tejs

+0

我不认为是这样,因为在我用来告诉客户端的文件之前,该文件已经发送的是通过调用该方法。 stream.Write(“”.toByteArray,...)以及我发送文件的时候显然发送的字符串。但是有时候这个字符串在之前被接收到,之后会被接收到...... –

+0

换句话说,客户端接收文件的应用程序,我每次检查是否发送了一个长度为x的字符串,如果等于“”,则关闭文件,但有时候“”是在其他文件之前发送的部分文件导致文件不完整.. –

回答

5

写操作完成行

stream.Write(chunk, \\other params) 

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

+0

这样就可以解释一切,这就是为什么客户端可能会收到“”字符串与文件块结合在一起的原因吗? –

+0

spender带一个数据,然后可能更多{长度,数据}对,然后关闭套接字。看看我的编辑,这意味着我将不得不做一些类似于我的编辑的事情,这是正确的方式吗?我相信,发送数据加快速度会更有效率,但正如您所说的,没有办法确定该块是否被客户端收到... –

3

Stream.Write是同步的,所以它会一直阻塞你的线程直到写入完成。