写入 TcpClient 和 NetworkStream

2024-03-18

我对如何在 .net 中使用 tcp 流有点困惑。 现在,当我想写40字节时,我将其写入内存流,然后调用ToArray()并将内存流写入网络流+刷新。

在服务器端,我使用 Read(buf, 0, len) 并检查长度是否完全符合我的预期。我这样做是不是很愚蠢?我可以根据需要写入尽可能小的字节,然后在准备好读取时刷新吗?

当我 Read() 时,我总是能得到我期望的长度吗? (假设应用程序正确并且没有发生错误)它会阻塞直到我的尺寸准备好吗?我不需要循环读取并构建我的缓冲区,是吗?假设我期望像 10k 或更高这样的大尺寸,那么我需要构建我的缓冲区吗?


我知道之前的两个答案都在告诉你这一点,但我会重复它们并添加我的一些内容:如果后续发送之间有足够的时间,它将按照您的预期工作,这可能会让您相信它确实有效那样。但事实并非如此。

TCP 很容易被想象成一根水管,在它的一端装满水杯。添加新的一杯水并不能告诉你它的大小,只是向管道中添加了更多的水。

因此,您需要在流中实现您自己的“消息传递”或“打包”。

然而,情况并没有那么糟糕。流是鲁棒的,所以如果你用数据的长度作为前缀,你就能够让它工作——只需在接收端创建某种“数据包收集机制”——有一些缓冲区来保存部分数据包数据,直到你得到你需要的一切。

EDIT:

解决你的问题:

  • Flush()在这里无关紧要。
  • 您将不会得到您期望的尺寸。您将获得 0 到运输途中剩余的任何东西
  • 在您的尺寸准备好之前它不会阻塞。它会给你尽可能多的东西(0是可能的)-我认为这种行为可以改变,但它不再有任何字节数Write()n 在另一端
  • 你需要建立你的缓冲区
  • 是的,您确实需要手动构建缓冲区,方法是在数据前面加上其长度前缀

在这里,您对如何读取缓冲区有了一些想法:.NET 阻塞套接字读取直到 X 字节可用? https://stackoverflow.com/questions/6793234/net-blocking-socket-read-until-x-bytes-are-available

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

写入 TcpClient 和 NetworkStream 的相关文章

  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • 如何根据给定的点生成热图

    我想生成 Windows 形式的热图 我有一组点作为输入 如何以最简单的方式做到这一点 谢谢 基于此处已有的答案 此方法允许您指定Colors您希望用作最大和最小颜色 private Color HeatMapColor double va
  • HttpWebRequest/HttpResponse:如何在响应中发送数据?

    我有一个客户端和一个服务器 在客户端我有 HttpWebRequest request HttpWebRequest WebRequest Create http localhost fa Default aspx request Meth
  • 防止重入并确保某些操作获取锁的正确方法是什么?

    我正在设计一个基类 当继承该基类时 它将针对多线程环境中的上下文提供业务功能 每个实例可能都有长时间运行的初始化操作 所以我想让这些对象可重用 为此 我需要能够 为这些对象之一分配上下文以允许其完成工作 防止对象在已有上下文的情况下被分配新
  • 为什么 C# 不支持类构造函数中的隐式泛型类型?

    如果编译器可以推断出泛型类型参数 C 并不要求您指定它 例如 List
  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 尝试对无法访问的主机进行套接字操作

    一位客户在连接到我们的服务器服务的 WCF 客户端上报告了此错误 消息 尝试对无法访问的主机进行套接字操作 类型 System Net Sockets SocketException 从这个链接http msdn microsoft com
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创

随机推荐

  • 禁止 GCC 下的不兼容指针类型特定警告

    在 GCC 下的代码中 我收到了很多这两种类型的警告 warning passing argument 1 of foo from incompatible pointer type and warning assignment from
  • Android加载动画

    我正在寻找一些有关如何在 android 中创建加载动画的信息 是否可以创建这个动画 我可以在一个线程中调用这个动画并在另一个线程中结束 我正在寻找这个 尝试下面的代码 显示进度对话框 ProgressDialog mDialog new
  • .NET 泛型术语 - 开放/封闭、未绑定/构造

    NET 泛型术语有点含糊 更糟糕的是 它似乎在不同的来源中被模糊且不同地使用 基本上不清楚的是这 4 个术语之间的关系 与 类型 相关 open closed unbound 建 我明白那个List
  • 每个面有 K 个顶点的 3D 点的三角测量

    我正在使用 Three js 我有一个收藏3D点 x y z 和面的集合 一张脸是由K points 它可以是凸的 也可以是凹的 我在 Three js 文档中找不到任何可以帮助我的内容 一种解决方案可能是对这些形状进行三角测量 但到目前为
  • 如何在 swift 中检查两个实例是否具有相同的类/类型

    我知道我可以检查 Swift 中 var 的类型is if item is Movie movieCount 1 else if item is Song songCount 1 但我如何检查两个实例是否具有相同的类 以下不起作用 if i
  • Atlas 上的 Mongoose 与 ReplicaSet

    我在 MongoDB Atlas 上有一个副本集 这是我的 mongo shell 连接字符串 可以完美连接 mongo mongodb MY SERVER shard 00 00 clv3h mongodb net 27017 MY SE
  • 如何利用 .woff 字体的浏览器缓存?

    在 PageSpeed Insights 中 我不断看到利用浏览器缓存我正在使用的特定图标集 字体的消息 iconFont woff 2 天 我已将 htaccess 设置为 EXPIRES CACHING
  • 当我必须使用 Intents 时,createChooser 是什么?我可以用这个方法做什么?

    我一直在查看 stackoverflow 但我没有找到关于什么是 createChooser 的定义以及为什么我可以使用它以及在哪种情况下最好使用它 提前致谢 例如 您的应用程序中有一个共享图片选项 您定义这样的意图 Intent picM
  • 在 docker 微服务设置中运行 django rq 的正确方法

    我猜我的 docker 容器设置有问题 因为每次我从 django 运行任务时 我都会在 docker 容器输出中看到ps aux创建了新进程python mange py rqworker mail而不是使用现有的 请参阅截屏视频 htt
  • 如何根据php中的创建日期从目录中删除文件?

    我有一个存储 html 文件的缓存文件夹 它们会在需要时被覆盖 但很多时候 很少使用的页面也会缓存在其中 最终会占用空间 5 周后 驱动器已满 有超过 270 万个缓存文件 循环遍历包含数十万个文件的目录并删除超过 1 天的文件的最佳方法是
  • Android:处理下载数据时意外的互联网断开连接

    我这里有一个将数据从远程服务器下载到文件的功能 我对我的代码仍然没有信心 我的问题是 如果在读取流并将数据保存到文件时突然与互联网断开连接 下面的这些捕获异常是否真的可以捕获此类事件 如果没有 您能建议如何处理此类事件吗 注意 我在一个线程
  • XML 模式到 C++ 类 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我必须编写一个 C 应用程序 使用 GUI 的 Qt 框架 它可以编辑存储在 xsd 架构文件描述的
  • C++11:按值调用、移动语义和继承

    假设我有一个类 我计划直接将其公开为可实例化类 给程序员 class Base public Base std string text m text std move text private std string m text 到目前为止
  • 二维码数据格式的规范是什么?我在任何地方都找不到它

    我特别想问的是 规格是否以及是什么 设置 QR 码内文本的格式 不是如何生成代码 我可以做到 我需要将 hCard 数据放入 QR 码中 但是我不知道如何将 QR 码标记为 VCF 数据 相对于 URL 文本等 以便解码器知道该怎么做 我在
  • 在 iOS 10 中添加本地通知 - Swift 3

    所以我一直在尝试向新的 UNUserNotificationCenter 添加通知 但我似乎没有得到它 我的视图控制器有一个操作 IBAction func sendPressed sender AnyObject let content
  • 如何获取设备令牌

    安装完成后 我需要获取 deviceToken 以用于其他目的 这是我到目前为止所开发的 Parse initialize this qqd423WEfwWEF32FewferT434fs323rfRT g7Rre4g7gsGRwgGw45
  • 忽略特定列表排序器的排序

    我可以忽略 jquery 表排序插件中特定列的排序吗 因此 基本上 当页面加载时 我不希望在 搜索 列上进行任何排序 因为它包含图像并自行进行一些 JavaScript 处理 这会大大减慢我的排序速度 这是我的代码
  • window.parent.location.href 或 window.top.location 哪一种更好

    我正在一个项目中工作 在特定情况下我必须在错误页面上重定向 为此 我创建了 Error aspx 页面 现在我正在使用 window top location href Error aspx 并生成http localhost app we
  • 当没有行时 RecordNotFound 返回 false

    我有问题这个图书馆 https godoc org github com jinzhu gorm DB RecordNotFound因为即使给定的输入不在数据库中 该函数也会返回 false 而实际上它应该返回 true type User
  • 写入 TcpClient 和 NetworkStream

    我对如何在 net 中使用 tcp 流有点困惑 现在 当我想写40字节时 我将其写入内存流 然后调用ToArray 并将内存流写入网络流 刷新 在服务器端 我使用 Read buf 0 len 并检查长度是否完全符合我的预期 我这样做是不是