【问题标题】:Transferring binary data using sockets?使用套接字传输二进制数据?
【发布时间】:2011-05-22 03:57:21
【问题描述】:

我正在考虑制作一个服务器/客户端应用程序来执行此操作:客户端将连接到服务器,服务器将发回客户端能够访问的文件夹列表(可能是音乐或视频)流式传输或下载。我将为此制作一个 GUI,这样它就不会是纯文本界面了。我想要它,这样当客户端连接到服务器并获取有关可以流式传输/下载的媒体文件的信息时,客户端将在类似资源管理器的界面中显示文件夹/文件(文件夹将显示一个文件夹图标,视频将显示一个视频图标等)

这对我来说似乎很重要,但我真的很想了解更多关于使用 C# 进行套接字编程的知识,并且觉得亲自动手是最好的方法。您可以想象,我对如何开始以及要完成这项工作需要做些什么感到很困惑。

我的问题的第一部分是:如果我想让客户端接收文件/文件夹列表并且还能够下载/流式传输它们,我是否需要使用套接字传输二进制数据?我完全错了吗?如果我错了,我是否需要使用文件阅读器之类的其他东西并以某种方式通过套接字使用它们?

我的问题的第二部分是:当我将此信息传输给客户端时,如何让客户端显示视频、文件夹、mp3 等的适当图标?我在想,如果我必须传输二进制数据,我将不得不使用该数据以某种方式使用正确的图标/数据填充客户端 GUI。我被困在如何处理这个问题上。是否有某些方法/类可以用来解析这些数据并做我想做的事情?同样,我不知道需要传输二进制数据是否错了,但无论哪种方式,我都对处理这个问题所必需的内容感到困惑。

如果我的任何术语有误,我深表歉意。我显然还不是 C# 专家;)

【问题讨论】:

  • 哇,谢谢!我想我应该多探索一下 .NET 框架......
  • 不客气。那,探索 StackOverflow - 如果有一个常见的编程问题需要解决,它可能已经在这里了 - 享受吧!

标签: c# visual-studio-2010 sockets tcp network-programming


【解决方案1】:

每当您在机器之间(或进程之间)发送数据时,您就已经在谈论二进制数据(您可能会争辩说 一切 都是二进制数据,但是当将其作为 OO 模型使用时不喜欢)。这里的重点是您需要做的就是序列化您的消息。有无数的序列化框架——有些是为了方便,有些是为了功能范围,还有一些可以针对性能(最小带宽等)使用。

即使是内置的也可以工作 - 例如,您可以使用XmlSerializer 等写入Stream(例如您通常与套接字一起使用的NetworkStream)。但请 - 不要BinaryFormatter(这会伤害你,老实说)。就我个人而言,我会使用一些不那么冗长的东西,比如 protobuf-net,但是自从我写了它之后,我就有些偏见了;p

但是,请注意,在使用套接字时,您通常会发送多个(单独的)消息作为对话的一部分。为了让每一端正确且方便地从流中读取正确的数据per-message,通常会在每条消息前加上长度(字节数) - 例如,作为一点 - endian int 占用固定的 4 个字节。所以阅读过程是:

  • 读取 4 个字节
  • 将其解释为int,假设为n
  • 读取n字节
  • 通过您的反序列化程序运行该数据,可能通过MemoryStream
  • 处理消息

发送过程可能是:

  • 序列化消息,可能是MemoryStream
  • 查询长度并形成4字节前缀
  • 写前缀
  • 写入数据

【讨论】:

  • 感谢 Marc,这回答了我的一些未解决的问题 :)
【解决方案2】:

你不必像Socket一样低级,除非你当然只是想学习。

我建议使用 WCF。它将完全满足您的要求,非常灵活,您不必直接处理套接字。

WCF 是一个很大的框架,但您可以快速了解如何使用它。

Introduction to WCF

Here您可以找到如何在 Windows 中检索和显示文件图标。
如果您的客户端是由 Windows 托管的,您不需要传输图标,您可以通过文件名/扩展名在客户端检索图像。

【讨论】:

  • 感谢您的推荐。我想也许会选择 WCF,但我认为我仍然希望了解套接字级别的工作原理和经验。我可能会接受您的建议并选择 WCF,但我仍然很难弄清楚所有这些东西如何通过网络工作。所有这些不同类型的数据、协议和结构都让我感到困惑。我没有对通过 Internet 工作的项目进行太多编程......
  • @Aaron - 套接字并不难,特别是如果您使用 TCP。它只是在客户端和服务器之间来回发送原始字节。然而,更困难的是格式化和解析数据,确保重新发送/重新连接正确,以及许多其他低级问题。 WCF 为您解决了这些问题,您可以专注于业务逻辑和需求,而不是重新发明轮子。
  • 我明白了。 WCF 现在普遍是标准吗?这些天在 C# 中使用套接字被认为是“旧”还是“弃用”?
  • @Aaron - WCF 是一种标准。它允许您从数据在对等点之间传输的方式中抽象出业务逻辑。您可以将 WCF 设置为通过 SOAP、MSMQ 或 net-tcp 在您的情况下传输数据,而无需更改代码,只需更改设置文件。如果您使用 net-tcp 绑定,它将在下面使用 Socket。但是,您不能说 WCF 取代了 Sockets。有使用 Socket 的合法案例,但这绝对不是你的情况。
  • @Aaron - 只是说:关于这个主题有很多意见。就个人而言,我很欣赏 WCF 方便,但代价是它相当臃肿 - 你会在数据上获得 大量 的开销。套接字仍然在使用中。两者都是有效的选择。
猜你喜欢
  • 2020-06-26
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多