大佬快来帮帮我C# socket

weixin_57430610 2021-04-24 04:05:27
我用c# socket获取百度网页,但是总是有各种问题比如do
{ sl = ss.Receive(res, off, 1024, 0);
off += sl;

} while (sl==1024);
和do
{ sl = ss.Receive(res, off, 1024, 0);
off += sl;

} while (ss.Available>0);
获取不到完整网页,大概能读到2880字节就返回了, do
{ sl = ss.Receive(res, off, 1024, 0);
off += sl;

} while (sl>0); 这样可以获取到完整网页但是有一分钟延时,应该怎么弄才行?谢谢各位大佬。
...全文
1273 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
对于Http早期的基本协议来说,如果是短链接的,那么你可以等到 Stream 的 Read 状态被关闭时才开始解析收到的字节。而不是用什么固定长度值去判断是否接收完毕。 但是现在Http 协议已经进入到支持长连接的时代,那么就要根据 RFC 更高级的协议来实际解析 Http 消息。例如第一行文本(以换行作为结束)就可以判断是不是 Post、Get等等类型的消息。对于 Post 消息,那么第一次遇到的“连续两个行结束”就是消息头内容的结束,然后再一次遇到“行结束”则作为消息体的结束。 也就是说,你不能用什么1024来判断页面内容是否结束,而要不断地接收字节,并且随时“根据高层次的协议”来判断一个消息是否遇到了结束标志位置。
  • 打赏
  • 举报
回复
一般来说,Stream的Receive返回的是本地缓冲区里字节个数。例如远端正在传来100万字节,那么你要求一次读取2000字节,这个 Receive函数即可能返回2000,也可能只返回1999甚至199。你不能说“传完了”,这是逻辑错误。
hhsacsb 2021-05-09
  • 打赏
  • 举报
回复
看了半天,原来都是大神在玩底层架构。。。。。那就不打扰了
weixin_57430610 2021-04-27
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380的回复:
[quote=引用 7 楼 weixin_57430610 的回复:][quote=引用 5 楼 大西瓜大降价一块一斤的回复:]楼上说的好别人造车拿现成的合成一下就好了,你还在造轮子 最简单的获取数据方法

            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            string result= wc.DownloadString("http://www.baidu.com");
谢谢,其实我是想知道socket如何接收完数据,我用过c#里面的webclient,它可以很快的获取网页,图片等内容,但我不知道底层怎么实现的,应该也是用socket吧[/quote] 额,也就是说,你就是特地去玩轮子的。 这样我的先去让看书了,嘿嘿,有些人认为让人看书就是鄙视新人。 不过有些东西你不先看书,我们没办法去说后面的东西 比如http协议是个文本协议,分头部head部分和正文部分两块 大多数情况下头部部分有长度,你判定是否接收完毕的判定依据就是这个长度 少数情况下头部不标长度,使用chunked方式,无法确定正文长度,此时通常已服务器断开连接为标准 相关说明 https://blog.csdn.net/yankai0219/article/details/8269922 所以如果这些玩意你不先去瞅瞅http协议头,http封包等基础资料,我们无法向下说明[/quote] 谢谢,我去深入了解一下
  • 打赏
  • 举报
回复
楼上说的好别人造车拿现成的合成一下就好了,你还在造轮子 最简单的获取数据方法

            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            string result= wc.DownloadString("http://www.baidu.com");
小贵子88 2021-04-25
  • 打赏
  • 举报
回复
顶一下,好久没来过了
ziqi0716 2021-04-25
  • 打赏
  • 举报
回复
读网页你用socket的操作呢,就相当于,你要去1000公里外的目的地,而你选择自己造交通工具去。而不是使用现成的公共交通,高铁,飞机等。 或者说,你要建房子,正常应该买砖买水泥就行了,而你这个相当于先要建造砖厂,水泥厂等。 你可以先看看socket,tcp,http这些概念,然后再看看httpclient对象。
wanghui0380 2021-04-25
  • 打赏
  • 举报
回复
当然作为一个网页来说,你这样写是不够的。 因为网页按http协议完成,你单纯把他当字节读不是合理写法,你的按http协议去解码 所以我们建议,如果不不是想研究啥是http协议,如果你不是想和博客园学习什么自己造轮子(所谓不造轮子,就不是好程序员系列读物) 请直接使用httpclient
weixin_57430610 2021-04-25
  • 打赏
  • 举报
回复
谢谢,我去深入了解一下
wanghui0380 2021-04-25
  • 打赏
  • 举报
回复
ss.Receive(res, off, 1024, 0) 如果你能理解他的意思,自己写 他的意思是给了1024的buffer,最大能读1024,最小在0到1024之间 也就是如果有8个苹果,每次取3个,问你啥时候取完 当然是取到不够3个时候就取完 所以你的判定条件是 do while(小于1024)
X-i-n 2021-04-25
  • 打赏
  • 举报
回复
网页处理为什么想不开要用socket?HttpWebRequest、WebClient都比那个强得多啊
  • 打赏
  • 举报
回复
底层就是对协议的处理,解释,析构等,原理不复杂,但实现过程是很复杂的,数据块,链表,缓冲池,各类算法...比你造个车可能还复杂。
wanghui0380 2021-04-25
  • 打赏
  • 举报
回复
w3c http1.1 RFC https://www.w3.org/Protocols/rfc2616/rfc2616.html
wanghui0380 2021-04-25
  • 打赏
  • 举报
回复
你看到了,chunked方式下还的继续分keeplive和不keeplive 所以总体上如果你想自己折腾,还有的一搞。最起码你的先把http1.1(w3c http1.1 RFC)协议内容整个通读一遍才能开始动手
wanghui0380 2021-04-25
  • 打赏
  • 举报
回复
引用 7 楼 weixin_57430610 的回复:
[quote=引用 5 楼 大西瓜大降价一块一斤的回复:]楼上说的好别人造车拿现成的合成一下就好了,你还在造轮子 最简单的获取数据方法

            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            string result= wc.DownloadString("http://www.baidu.com");
谢谢,其实我是想知道socket如何接收完数据,我用过c#里面的webclient,它可以很快的获取网页,图片等内容,但我不知道底层怎么实现的,应该也是用socket吧[/quote] 额,也就是说,你就是特地去玩轮子的。 这样我的先去让看书了,嘿嘿,有些人认为让人看书就是鄙视新人。 不过有些东西你不先看书,我们没办法去说后面的东西 比如http协议是个文本协议,分头部head部分和正文部分两块 大多数情况下头部部分有长度,你判定是否接收完毕的判定依据就是这个长度 少数情况下头部不标长度,使用chunked方式,无法确定正文长度,此时通常已服务器断开连接为标准 相关说明 https://blog.csdn.net/yankai0219/article/details/8269922 所以如果这些玩意你不先去瞅瞅http协议头,http封包等基础资料,我们无法向下说明
weixin_57430610 2021-04-25
  • 打赏
  • 举报
回复
引用 5 楼 大西瓜大降价一块一斤的回复:
楼上说的好别人造车拿现成的合成一下就好了,你还在造轮子 最简单的获取数据方法

            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            string result= wc.DownloadString("http://www.baidu.com");
谢谢,其实我是想知道socket如何接收完数据,我用过c#里面的webclient,它可以很快的获取网页,图片等内容,但我不知道底层怎么实现的,应该也是用socket吧
six2me 2021-04-25
  • 打赏
  • 举报
回复
楼上正解
还可以这么用
WebClient wc = new WebClient();
string uri = "http://www.baidu.com";
Stream stream = wc.OpenRead(uri);
StreamReader sr = new StreamReader(stream);
string strLine = "";
while ((strLine = sr.ReadLine()) != null)
{
this.listBox1.Items.Add(strLine);
richTextBox1.AppendText(strLine);
}
sr.Close();
下载代码方式:https://pan.quark.cn/s/28492da20c79 依据所提供的文件资料,本资源将系统地探讨FPGA(即现场可编程门阵列)的核心概念、其在视频图像技术领域的入门及进阶知识要点,以及图像处理算法的实现方法。此外,还将对VIPBoardBig这一特定FPGA开发板的详细资料和使用途径进行深入剖析。 FPGA的入门与进阶学习主要涉及以下核心内容: 1. FPGA的基础概念:FPGA是一种能够通过编程进行配置的集成电路,主要目的是达成硬件逻辑的可重构特性。该类芯片由大量的可配置逻辑模块(CLB)、输入输出模块(IOB)以及可编程互连资源共同构成。 2. FPGA开发板与相关套件:FPGA开发板是一种用于FPGA芯片学习和测试的硬件平台,通常配备有基础的外设设备,例如LED指示灯、按键开关、LCD显示屏、串口通信接口等。套件则通常包含硬件板卡、技术文档、相关资源,以及可能的软件工具和示例代码集。VIPBoardBig即为本教程选用的FPGA开发板,拥有特定的硬件配置和功能特性。 3. FPGA的开发流程:FPGA开发一般涉及硬件描述语言(HDL)的设计与仿真阶段,常用语言为Verilog或VHDL。随后,借助综合工具将设计蓝图转化为FPGA内部的逻辑网络,最终通过编程设备将配置文件传输至FPGA芯片中,从而实现设计的预期功能。 4. 外设开发与设计工作:涵盖LED显示控制、键盘驱动、LCD显示驱动、UART串口设计等基础外设的开发任务。这部分知识将引导学习者掌握如何在FPGA平台上管理和运用这些基础外设。 5. VGA驱动显示与字符显示测试:VGA(Video Graphics Array)是一种视频传输接口标准,能够支持640x480...
内容概要:本文系统阐述了企业在搭建官方知识库后如何通过“7步锚定法”实现GEO(生成式引擎优化)的落地,重点在于从知识库走向内容矩阵的战略升级。文章指出知识库仅为起点,真正的核心是让大模型“信任并推荐”企业内容。为此提出“一个主战场+多个品牌布局”的策略,强调需根据行业特性选择高商业流量的大模型(如豆包、文心一言、通义千问等),而非工具性模型(如ChatGPT、Claude)。通过业务场景画像、大模型流量测绘、采信逻辑拆解、内容架构设计、语义关键词埋点、信源建设与效果迭代七步法,构建高质量、高可信度的内容体系,并警惕“全模型覆盖、内容堆砌、一套内容通用、忽视第三方平台”四大误区。最终指出GEO本质是一场认知战,比拼的是对大模型逻辑与客户需求的理解深度及长期主义投入。; 适合人群:已完成官方知识库搭建、希望提升AI引用率与获客效率的企业市场负责人、品牌运营、数字营销从业者及SEO/GEO优化相关人员。; 使用场景及目标:①指导企业科学选择主攻大模型并制定差异化内容策略;②构建符合大模型采信逻辑的高质量内容矩阵;③避免常见GEO落地误区,提升AI搜索下的品牌曝光与转化效果;④建立可持续优化的数据反馈闭环。; 阅读建议:建议结合自身行业特征与客户决策路径,逐步实践“7步法”,优先聚焦单一主战场打透,注重内容质量与第三方权威信源建设,坚持3-6个月持续投入以观察真实效果。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧