我有一个服务器应用程序,用于侦听端口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例如回复”
我错过了什么吗? stream.Write调用将被阻塞,所以它一直等到它完成。 http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.write.aspx – Tejs
我不认为是这样,因为在我用来告诉客户端的文件之前,该文件已经发送的是通过调用该方法。 stream.Write(“”.toByteArray,...)以及我发送文件的时候显然发送的字符串。但是有时候这个字符串在之前被接收到,之后会被接收到...... –
换句话说,客户端接收文件的应用程序,我每次检查是否发送了一个长度为x的字符串,如果等于“”,则关闭文件,但有时候“”是在其他文件之前发送的部分文件导致文件不完整.. –