c# - socket c Sharp 上的大文件

标签 c# sockets network-programming byte

我已经阅读了周围,我听到了关于此的混合信息。您是否必须将文件拆分为 block 才能通过流发送?还是操作系统会为您做到这一点?

我有一个大约 320,000 个值的字节数组,我需要通过网络获取它。我可以得到前几千,但之后的任何东西,它都设置为 0。

我正在使用 NetworkStream 类,创建一个 TcpListener/TcpClient,一旦连接就从监听器获取流并将数组写入流然后刷新。没有成功。

任何帮助,将不胜感激。

干杯,

最佳答案

使用 TCP 套接字时,发送 1024 字节可能会也可能不会被操作系统分成 block 。我们级别的这种行为应该被认为是未定义的,并且接收者应该能够处理这样的情况。大多数协议(protocol)所做的是指定某个(已知)消息大小,其中包含诸如文件大小、应读取的数据范围等信息。服务器构造的每条消息都将具有此 header 。作为程序员,您可以指定您的 block 大小,并且必须在接收器级别重建每个 block 。

这是一个演练:

  • 服务器向客户端发送一个带有文件信息的命令,例如总大小、文件名等。
  • 客户端知道命令有多大是基于预先编程的标题大小协议(protocol)。如果命令是 512 字节,那么客户端将继续接收数据,直到填满 512 字节的缓冲区。在幕后,操作系统可能会以多个 block 的形式提取这些数据,但这不应该让您担心。毕竟,您只关心准确读取 512 个字节。
  • 服务器开始发送更多命令,将文件逐 block 流式传输到客户端(一次 512 个字节)。
  • 客户端接收这些 block 并在连接过程中构建文件。
  • 由于客户端知道文件有多大,它不再读取该套接字。
  • 服务器终止连接。

  • 这个例子很基础,但它是沟通如何工作的一个很好的基础。

    关于c# - socket c Sharp 上的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246354/

    相关文章:

    c# - 如果表单应用程序关闭 C#,如何防止发生 Timer Elapsed 事件

    c# - Gmail API : forcing the authorization to reprompt the user

    c - 获取网关以用于 ANSI C 中的给定 ip

    c++ - QTcpSocket的write()方法为什么不能发送数据?

    c# - 将特殊字符从 MS-Word 或 Open Office writer 转换为记事本

    c# - 参数化查询

    sockets - 套接字发送给特定用户

    java - 客户端如何使用 EC2 连接到服务器

    c++ - C/C++中的并发UDP连接限制

    python - 使用 SSH 进行安全的 Python 聊天——如何?