使用套接字传输二进制数据?

时间:2011-05-22 03:57:22

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

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

这对我来说真的很大,但我真的想要了解更多关于使用C#进行套接字编程的信息,并且觉得让我的手真的很脏是最好的方法。你可以想象,我对如何开始这个以及我需要做些什么才能使这个工作有很多困惑。

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

我的问题的第二部分是:当我将此信息传输到客户端时,如何让客户端显示视频,文件夹,mp3等的相应图标?我想如果我必须传输二进制数据,我将不得不使用该数据以某种方式用正确的图标/数据填充客户端GUI。我坚持如何处理它。是否有某些方法/类可用于解析数据并执行我想要的操作?同样,我不知道我是否错误地需要传输二进制数据,但无论哪种方式,我都对处理这个问题的必要性感到困惑。

如果我的任何术语出错,我道歉。我显然不是C#专家;)

2 个答案:

答案 0 :(得分:3)

无论何时你在机器之间(或进程之间)发送数据,你都在谈论二进制数据(你可以说所有是二进制数据,但是当它作为OO模型使用它时不喜欢它)。这里的要点是,您需要做的就是序列化您的消息。有无数的序列化框架 - 一些旨在方便,一些旨在功能范围,而som可以用于性能(最小带宽等)。

即使内置的也可以使用 - 例如,您可以使用XmlSerializer等来写入Stream(例如通常与套接字一起使用的NetworkStream)。但请 - 不是BinaryFormatter(这会伤害你,诚实)。就个人而言,我会使用一些不那么冗长的东西,例如protobuf-net,但是自从我写这篇文章后我有点偏颇; p

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

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

,发送过程可能是:

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

答案 1 :(得分:2)

除非您只是想学习,否则您不必像Socket一样低级别。

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

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

Introduction to WCF

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