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

C# 使用套接字传输二进制数据?,c#,visual-studio-2010,sockets,tcp,network-programming,C#,Visual Studio 2010,Sockets,Tcp,Network Programming,我正在考虑制作一个服务器/客户端应用程序来实现这一点:客户端将连接到服务器,服务器将发回一个文件夹列表(可能是音乐或视频),客户端将能够流式传输或下载这些文件夹。我将为此制作一个GUI,这样它就不会是一个纯文本界面。我希望这样,当客户端连接到服务器并获取有关可流式传输/下载的媒体文件的信息时,客户端将在类似浏览器的界面中显示文件夹/文件(文件夹将显示文件夹图标,视频将显示视频图标等) 这对我来说真的很重要,但我真的很想学习更多关于C#的socket编程的知识,并且觉得把手弄脏是最好的方法。正如你

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

这对我来说真的很重要,但我真的很想学习更多关于C#的socket编程的知识,并且觉得把手弄脏是最好的方法。正如你所能想象的,我对如何开始这项工作以及我需要做些什么才能使这项工作成功感到困惑

我问题的第一部分是:如果我想让客户机接收文件/文件夹列表,并能够下载/流式传输它们,我是否需要使用套接字传输二进制数据,或者我完全错了?如果我错了,我是否需要使用其他东西,比如文件读取器,并通过套接字使用它们

我的问题的第二部分是:当我将这些信息传递给客户时,如何让客户显示视频、文件夹、MP3等的相应图标。?我在想,如果我必须传输二进制数据,我必须使用这些数据以某种方式用正确的图标/数据填充客户端GUI。我被困在如何处理这件事上。是否有某些方法/类可用于解析数据并执行我想对其执行的操作?同样,我不知道我是否错误地认为需要传输二进制数据,但无论哪种方式,我都不知道处理这个问题需要什么


如果我的术语有任何错误,我道歉。我显然还不是C语言方面的专家。)

当然,除非你只想学习,否则你不必像Socket那样进入低级

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

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

您可以找到如何在Windows中检索和显示文件图标。

如果您的客户端由Windows托管,则无需传输图标,只需按文件名/扩展名检索客户端上的图像。

任何时候在计算机之间(或进程之间)发送数据时,您已经在谈论二进制数据了(你可能会争辩说,所有东西都是二进制数据,但当将其作为OO模型使用时,感觉不是这样的)。这里的要点是,你所需要做的就是序列化消息。有无数序列化框架——一些是为了方便,一些是为了一系列功能,而som可以使用这些框架来提高性能(最小带宽等)

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

但是,请注意,在使用套接字时,您通常会在会话中发送多条(单独的)消息。为了使每一端都能正确方便地从流中读取每条消息的正确数据,通常会在每条消息前面加上长度(字节数)作为前缀-例如,作为一个固定的4字节的小endian
int
。因此读取过程是:

  • 读取4个字节
  • 将其解释为
    int
    ,比如
    n
  • 读取
    n
    字节
  • 通过反序列化程序运行该数据,可能通过
    MemoryStream
  • 处理消息
发送过程可能是:

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

获取文件图标:哇,谢谢!我想我应该多探索一下.NET framework…不客气。这一点,以及探索StackOverflow-如果有一个常见的编程问题需要解决,它可能已经在这里了-享受吧!谢谢你的推荐。我想可能会选择WCF,但我想我还是喜欢我有在套接字级别工作的知识和经验。我可能会接受你的建议,选择WCF,但我仍然很难理解所有这类东西在网络上是如何工作的。所有这些不同类型的数据、协议和结构都让我困惑。我没有做太多的公关工作对通过internet工作的项目进行编程…@Aaron-Socket并不困难,尤其是在使用TCP时。它只是在客户端和服务器之间来回发送原始字节。然而,更困难的是格式化和解析数据,确保正确重新发送/重新连接,以及许多其他低级问题。WCF为您解决了这些问题你,你可以专注于业务逻辑和需求,而不是重新发明轮子。我明白了。WCF通常是现在的标准吗?在C#中使用套接字被认为是“旧的”还是“不推荐的”现在?@Aaron-WCF是一种标准。它允许你从对等方之间传输数据的方式中抽象出你的业务逻辑。你可以设置WCF通过SOAP、MSMQ或网络tcp传输数据,而无需更改代码,只需更改设置文件。如果你使用网络tcp绑定,它将使用下面的套接字。但是,你不能这么说WCF取代了套接字。有合法的情况可以使用套接字,但这绝对不是你的情况。@Aaron-我只是想说:有很多op