C# NetworkStream.Read 奇怪之处

2024-05-11

谁能指出这段代码中的缺陷吗?我正在使用 TcpClient 检索一些 HTML。与 IIS 服务器通信时,NetworkStream.Read() 似乎永远不会完成。如果我改用 Fiddler 代理,它可以正常工作,但是当直接与目标服务器对话时,.read() 循环不会退出,直到连接异常并出现“远程服务器已关闭连接”之类的错误。

internal TcpClient Client { get; set; }

/// bunch of other code here...

try
{

NetworkStream ns = Client.GetStream();
StreamWriter sw = new StreamWriter(ns);

sw.Write(request);
sw.Flush();

byte[] buffer = new byte[1024];

int read=0;

try
{
    while ((read = ns.Read(buffer, 0, buffer.Length)) > 0)
    {
        response.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, read));
    }
}
catch //(SocketException se)
{

}
finally
{
    Close();
}

Update

在调试器中,我可以看到整个响应立即并附加到我的 StringBuilder (响应)。当服务器完成发送响应时,连接似乎没有关闭,或者我的代码没有检测到它。

结论正如这里所说,最好利用协议提供的功能(在 HTTP 的情况下,是 Content-Length 标头)来确定事务何时完成。但是,我发现并非所有页面都设置了内容长度。所以,我现在使用混合解决方案:

  1. 对于所有交易,设置请求的Connection标头设置为“close”,这样服务器就不会保持套接字打开。这提高了服务器在响应您的请求时关闭连接的机会。

  2. If Content-Length设置后,用它来确定请求何时完成。

  3. 否则,将 NetworkStream 的 RequestTimeout 属性设置为一个较大但合理的值,例如 1 秒。然后,循环播放NetworkStream.Read()直到 a) 发生超时,或 b) 您读取的字节数少于您要求的字节数。

感谢大家出色而详细的答复。


与文档相反网络流.读取 http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx意味着,从a获得的流TcpClient does not当没有可用数据时,只需返回 0 作为读取的字节数 - 它会阻塞。

如果你看一下的文档TcpClient http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx,你会看到这一行:

TcpClient 类提供了通过网络连接、发送和接收流数据的简单方法同步阻塞模式.

现在我的猜测是,如果你Read调用被阻塞,这是因为服务器决定不发回任何数据。这可能是因为初始请求未正确通过。

我的第一个建议是消除StreamWriter作为可能的原因(即缓冲/编码的细微差别),并使用NetworkStream.Write方法。如果有效,请确保您使用了正确的参数StreamWriter.

我的第二个建议是不要依赖于结果Read调用以打破循环。这NetworkStream类有一个DataAvailable为此而设计的财产。编写接收循环的正确方法是:

NetworkStream netStream = client.GetStream();
int read = 0;
byte[] buffer = new byte[1024];
StringBuilder response = new StringBuilder();
do
{
    read = netStream.Read(buffer, 0, buffer.Length);
    response.Append(Encoding.ASCII.GetString(buffer, 0, read));
}
while (netStream.DataAvailable);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# NetworkStream.Read 奇怪之处 的相关文章

  • 如何在自定义保存操作 WFFM 中获取 Sitecore.Current.Site 对象?

    我在用着面向营销人员的 Sitecore 网络表单 在里面save action我得到的表格Sitecore Context Site对象 但该对象没有返回正确的上下文 该值为 modules shell 有谁知道我如何才能获得正确的上下文
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 终止以 System.Diagnostic.Process.Start("FileName") 启动的进程

    我正在尝试创建一个将在特定时间执行操作的应用程序 很像 Windows 任务计划程序 我当前正在使用 Process Start 来启动任务所需的文件 或 exe 我通过调用文件 mp3 启动一个进程 该进程启动 WMP 因为它是默认应用程
  • 在 C++ 中从另一个数组初始化结构内的数组[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions struc
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • DLR 返回类型

    我需要 DLR 的帮助 我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期返回类型时遇到一些问题 我在元对象中覆盖 BindInvokeMember 我可以看到所有参数类型
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 创建 PING 程序时限制 ICMP 回显答复

    我正在编写一个多线程 ping 程序 我在每个线程 针对每个 IP 上创建了原始套接字 并使用 sendto 向每个线程发送了 ICMP Echo 请求 然后在每个线程中执行了 receivevfrom 我正在从各种套接字中的 IP 获取消
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 我使用 tm/mktime 是否错误,如果没有,有解决方法吗?

    我认为下面的程序应该输出从公元 1 年到 1970 年每年第一天到 1970 年的秒数 前面是time t在编译它的系统上 CHAR BIT是一个宏 所以我认为你不能只是复制编译后的可执行文件并假设它是正确的 尽管实际上一切都使用 8 位c
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • Razor 与 ASPX 语法的比较 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近 我开始研究 MVC3 和 Razor 并阅读了几篇有关这些主题的文章 以更好地理解这个概念 我一直在读Scott Guthrie 的博客文
  • 使用 c++20 范围删除最后一个元素的最佳方法是什么

    有没有比反转两次更好的方法来使用 c 20 范围删除容器中的最后一个元素 include
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 如果指定了多个存储库,install.packages 的行为是什么?

    从文档中并不清楚如果在 install packages 中指定了多个存储库会出现什么行为 我的直觉告诉我 它将尝试第一个存储库 如果找不到包 它将尝试第二个存储库 依此类推 不幸的是 情况似乎并非如此 我看到的是 只尝试了第一个 并返回错
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 仅使用 SQL 中的 MAX 函数更新重复行

    我有一张这样的桌子 假设为了举例 NAME是一个唯一的标识符 NAME AGE VALUE Jack Under 65 3 Jack 66 74 5 John 66 74 7 John Over 75 9 Gill 25 35 11 Som
  • SQLite3 中的“预准备”语句?

    在具有固定查询集的内存受限嵌入式系统中使用 SQLite 如果可以 预先准备 查询 则似乎可以节省代码和数据 也就是说 准备好的语句是由 相当于 sqlite3 prepare v2 在build运行时只需要调用 bind step 等 引
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • Python:在同一遍中计数和替换正则表达式?

    我可以全局替换正则表达式re sub 我可以计算匹配项 for match in re finditer count 有没有办法将这两者结合起来 以便我可以计算替换次数 而无需对源字符串进行两次传递 注意 我对替换是否匹配不感兴趣 我感兴趣
  • 如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

    如何删除除以下内容之外的所有内容 字符串中的字母 数字 空格 感叹号 问号 该方法支持国际语言 UTF 8 非常重要 您可以使用正则表达式 myString replace w s g 这将替换除单词字符 空格 感叹号或问题之外的所有内容
  • Javascript/jQuery 变量未给出预期值

    和我之前的其他人一样 我也在 Javascript 的范围内苦苦挣扎 那并试图阅读该死的东西 我已经检查了关于这个问题的一些先前的线程 但我似乎无法让它们正确地应用于我的问题 在下面的示例中 我想操纵中的值tagsArr数组 一旦数组已完全
  • 如何制作像图像中那样精确的 CSS3 线性渐变?

    For example this is gradient which I want to make in CSS3 我可以使用 1 px 图像剪切并在 x 轴上重复 就像我们之前所做的那样 但现在如果我想使用 CSS3 制作同样精确的渐变
  • 如何使用 Selenium Webdriver C# 替换 innerHTML 代码?

    HTML 代码
  • C++ 中的函数指针与仿函数

    使用函子和函数指针有什么区别 例如 Functor struct add x int x add x int y x y int operator int y return x y Function int func int x retur
  • Excel - 根据选择创建图表的宏

    我想就以下问题寻求您的帮助 因为我必须创建大量图表 所以我想要一个宏来根据我的选择插入图表 由于我对 VBA 没有任何了解 但现在需要它 至少现在 我真的应该自己学习使用它 我将感谢您的帮助 基本上 我需要知道如何调整我记录的代码 以便根据
  • 创建类路径资源中定义的名为“liquibase”的 bean 时出错.../config/DatabaseConfiguration.class

    在我的 jHipster 项目上启动嵌入式 Tomcat 时 我遇到了这个恼人的错误 花了很多时间试图解决它 但无法弄清楚为什么会发生 它是在主要代表更新项目后开始发生的 但我也实现了自定义存储库 堆栈跟踪 DEBUG uk co conf
  • SQLite 在使用之间不保存数据

    我制作了一个包含以下内容的模块 import sqlite3 as sq connection sq connect test db cursor connection cursor cursor execute DROP TABLE IF
  • #elif 定义时不带括号

    使用 VS2005 和 BLAH BLAH 定义以下预处理器条件为 false elif defined BLAH BLAH 但如果我把它改成 elif defined BLAH BLAH 是真的 为什么括号在这里会有所不同 它应该没有任何
  • 我如何在 Visual Studio 2012 中同时构建项目(dll 和 lib)

    我设法在 dll 模式和库模式下设置构建项目 但不能同时设置 对于构建在 dll 中 项目 gt 属性 gt 配置类型 动态库 dll 项目 gt 属性 gt 目标扩展名 dll 对于内置库 项目 gt 属性 gt 配置类型 静态库 lib
  • Sigar API for JAVA(需要指南)

    我已经下载了 Sigar API http support hyperic com display SIGAR Home http support hyperic com display SIGAR Home 并希望在项目中使用它来获取有关
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的
  • 什么是 C# 类 StreamContent?

    这可能在网络上的某个地方有解释 但我找不到它 StreamContent 到底是什么 我试图理解 C 但我无法正确理解一些 WebAPi 示例 因为我不明白 StreamContent 是什么 一个完整解释它的链接 而不是像 MSDN 那样
  • C# NetworkStream.Read 奇怪之处

    谁能指出这段代码中的缺陷吗 我正在使用 TcpClient 检索一些 HTML 与 IIS 服务器通信时 NetworkStream Read 似乎永远不会完成 如果我改用 Fiddler 代理 它可以正常工作 但是当直接与目标服务器对话时