通过确认在网络上传输数据的最佳方法是什么。 。净

时间:2012-02-03 13:43:55

标签: c# .net client-server transfer confirmation

我编写了一个客户端 - 服务器应用程序。我有一些数据结构,我想通过网络从客户端发送到服务器。我将它们呈现为确定大小的字节数组。服务器和客户端都知道这种结构。

我的目标是发送一组结构并等待服务器确认它们已被接收并妥善保存在其一侧..

我的想法是创建一个简单的代码。

客户方:

  1. 连接到服务器;
  2. 准备一份结构清单;
  3. 在循环中使用Stream.Write(...)方法将它们作为字节数组发送到网络。然后Flush();
  4. 等待服务器响应可以保存多少数据。
  5. 重复步骤2中的所有内容。
  6. 服务器端:

    1. 接受客户连接;
    2. 接收数据直到结束(Stream.Read()不想确定数据的结尾可能因为连接仍然存在);
    3. 将所有数据保存到磁盘;
    4. 使用用于从客户端获取数据的相同客户端连接向客户端发送有关已保存数据量的响应。
    5. 问题是在服务器端我无法确定客户端发送的数据组的结束。

      如何做我想要的所有怀疑?

4 个答案:

答案 0 :(得分:2)

对我来说,问题是Flush()没有做任何事情 - 这实际上是NetworkStream.Flush()的记录行为:

  

Flush方法实现了Stream.Flush方法;但是,由于NetworkStream没有缓冲,因此对网络流没有影响。调用Flush方法不会抛出异常。

绕过这个;我会将您的套接字配置为立即发送 (将NoDelay设置为true),然后为了避免数据包大小问题,我会将NetworkStream包装在一个BufferedStream(注意单个缓冲流仅适用于 读取写入,但不能同时写入两者)。然后:

  • 写入,写入,写入等BufferedStream
    • 只要它已满,它就会写入网络,立即发送
  • 刷新BufferedStream
    • 将写入网络,立即发送

这将允许发送消息的结尾而不会卡在输出缓冲区中,并且不需要您关闭流。

答案 1 :(得分:0)

编辑:OP现在添加了他需要使用.NET 3.0之前的评论条件。

如果连接的两端都是.NET,WCF应该拥有控制数据传输所需的所有工具。

更具体地说,看看

此外,如果您需要切换到异步数据传输,则可以更改为queued transport like MSMQ

答案 2 :(得分:0)

答案 3 :(得分:0)

我使用.Net Remoting来执行数据传输任务。所以,问题解决了(如果没有其他人会出现:))