使用套接字传输二进制数据
本文关键字:二进制 数据 传输 套接字 | 更新日期: 2023-09-27 17:57:23
我正在考虑制作一个服务器/客户端应用程序来执行此操作:客户端将连接到服务器,服务器将发回客户端能够流式传输或下载的文件夹列表(可能是音乐或视频)。我将为此制作一个 GUI,这样它就不会是一个纯文本界面。我希望当客户端连接到服务器并获取有关可以流式传输/下载的媒体文件的信息时,客户端将在类似资源管理器的界面中显示文件夹/文件(文件夹将显示文件夹图标,视频将显示视频图标等)
这对我来说似乎真的很大,但我真的很想更多地了解使用 C# 进行套接字编程,并觉得弄脏我的手是最好的方法。可以想象,我对如何开始这项工作以及我需要做什么来完成这项工作有很多困惑。
我问题的第一部分是:如果我想让客户端接收文件/文件夹列表并能够下载/流式传输它们,我是否需要使用套接字传输二进制数据或我完全错了?如果我错了,我是否需要使用其他东西,例如文件阅读器并以某种方式通过套接字使用它们?
我问题的第二部分是:当我将此信息传输给客户端时,如何使客户端显示视频、文件夹、mp3 等的相应图标?我在想,如果我必须传输二进制数据,我将不得不使用该数据以某种方式使用正确的图标/数据填充客户端 GUI。我被困在如何处理这个问题上。是否有某些方法/类可用于解析该数据并执行我想用它执行的操作?同样,我不知道我需要传输二进制数据是否错了,但无论哪种方式,我都对处理这个问题的必要性感到困惑。
如果我的任何术语有误,我深表歉意。我显然还不是C#方面的专家;)
机器之间(或进程之间)发送数据时,你已经在谈论二进制数据(你可以争辩说一切都是二进制数据,但是当它作为OO模型使用时,感觉不像)。这里的重点是,您需要做的就是序列化您的消息。有无数的序列化框架 - 一些旨在方便,一些旨在功能范围,som可以使用针对性能(最小带宽等)。
即使是内置的也可以工作 - 例如,您可以使用XmlSerializer
等写入Stream
(例如通常与套接字一起使用的NetworkStream
)。但是请 - 不要BinaryFormatter
(老实说,这会伤害你)。就个人而言,我会使用一些不那么冗长的东西,例如protobuf-net,但是由于我写了它,所以我有些偏见;p
但是,请注意,在使用套接字时,通常会在会话过程中发送多个(单独的)消息。为了使每一端正确方便地从流中读取每条消息的正确数据,通常在每个消息前面加上长度(字节数) - 例如,作为采用固定 4 个字节的小端序int
。所以阅读过程是:
- 读取 4 字节
- 将其解释为
int
,假设n
- 读取
n
字节
通过 - 反序列化程序运行该数据,也许通过
MemoryStream
- 处理消息
发送过程可能是:
- 序列化消息,也许序列化为
MemoryStream
- 查询长度并形成 4 字节前缀
- 写入前缀
- 写入数据
你不必像 Socket 那样低级,除非你只是想学习。
我建议使用 WCF。它将完全满足您的要求,非常灵活,您不必直接处理插座。
WCF 是一个很大的框架,但您可以快速学习如何使用它。
周转基金简介
在这里,您可以找到如何在Windows中检索和显示文件图标。
如果您的客户端由Windows托管,则无需传输图标,只需按文件名/扩展名在客户端上检索图像即可。