【问题标题】:What is the best way to transfer data over the network with confirmation. .Net在确认后通过网络传输数据的最佳方式是什么。 。网
【发布时间】:2012-02-03 13:43:55
【问题描述】:

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

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

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

客户端:

  1. 连接到服务器;
  2. 准备结构列表;
  3. 在循环中使用 Stream.Write(...) 方法将它们作为字节数组发送到网络。然后 Flush();
  4. 等待服务器响应它可以节省多少数据。
  5. 从第 2 步开始重复所有操作。

服务器端:

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

问题是在服务器端我无法确定客户端发送的数据组的结尾。

如何做所有我想做的事?

【问题讨论】:

  • 你看过 C# Socket 编程吗?你想通过网络传输什么类型的数据。这会是 TCP/IP、命名管道、套接字、线程/多线程 ..etc.. 很好的问题,但您没有提供要传输的数据类型.. 谢谢
  • 我的原始数据是一堆结构。在发送之前,我将它们转换为字节数组并使用 NetworkStream 类进行传输。
  • Kraze 已经询问了一些关于数据的有趣事实。此外,您应该判断性能是否是一个问题。看起来一个简单的 WCF-Service 就足以满足您要完成的任务。
  • 我忘了说我不能使用 WCF,因为如果它使用比 2.0 更新的 .net,我应该在我的情况下使用。
  • 是的,性能很重要。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我现在不能尝试,但我会在不久的将来尝试。谢谢
  • @yurart 没有,没有删除的 cmets
【解决方案2】:

【讨论】:

  • 我想可能是我没听说过。我去看看,谢谢!
【解决方案3】:

编辑:OP 现在添加了他需要使用 pre .NET 3.0 的注释附带条件。

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

更具体地说,看看

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

【讨论】:

  • 我说过 WCF 更高。稍后我会看一下 MSMQ。谢谢
  • 升级到 .NET 4 或许可以为自己节省大量的开发和调试时间?
  • 我明白,但据我所知,我们的软件必须在装有 windows 2000 且不接受 .net 3.0 的旧机器上工作
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多