『壹』 如何用httpRequest,WebRequest等类获取网页文件信息并且下载文件呢
首先 得购买空间:服务商会给你一个FTP地址和用户名 密码
其次:找一个FTP软件 flashfxp 输入服内务商提供的FTP地址容 用户名 密码登陆 上传
或直接打开浏览器 输入FTP地址 输入用户名 密码 把做好的网页 复制 粘贴上去主OK了
『贰』 使用HttpWebRequest下载Zip文件并解压到相应文件夹
string persistentDataPath_ = Application.persistentDataPath;
string resourcePath_ = Path.Combine(persistentDataPath_, "151515");
//设置存储位置
string zipPath_ = (resourcePath_ + ".zip").Replace(@"\", "/");
if (Directory.Exists(resourcePath_))
Directory.Delete(resourcePath_, true);
if (File.Exists(zipPath_))
File.Delete(zipPath_);
String filePath = @"您的url地址";//本地路径不行,必须是http或者https或者www才可以
//写入流
FileStream stream = File.Open(zipPath_, FileMode.OpenOrCreate);
//创建httpwebrequest请求
HttpWebRequest downloadRequest = (HttpWebRequest)WebRequest.Create(filePath);
downloadRequest.Method = "GET";
using (HttpTools downloader_ = new HttpTools(downloadRequest, null, stream))
{
yield return downloader_;
bool updateResult = false;
//清空数据流关闭
stream.Flush();
stream.Close();
bool decompressFinish_ = false;
if (downloader_.Exception == null)
{
// 解压资源包
AsyncExtra(zipPath_, persistentDataPath_, delegate(bool b)
{
updateResult = b;
decompressFinish_ = true;
});
// 等待压缩完成
while (!decompressFinish_) yield return null;
}
else
{
//ReportManager.Inst.ReportException(this.downloader_.Exception);
decompressFinish_ = true;
}
if (updateResult)
{
LoadPrint("更新完成");
}
else
{
LoadPrint("更新失败");
}
}
//第二部分
/// <summary>
/// 将指定的zip文件解压缩到指定目录
/// </summary>
/// <param name="path_"></param>
/// <param name="targetDir"></param>
void AsyncExtra(string path_, string targetDir, Action<bool> cb)
{
Thread t = new Thread(delegate()
{
try
{
if (!Directory.Exists(targetDir) && !string.IsNullOrEmpty(targetDir))
Directory.CreateDirectory(targetDir);
using (ZipInputStream zipStream = new ZipInputStream(File.OpenRead(path_)))
{
//this.state_ = ResourceUpdateState.Decompression;
ZipEntry entry;
while ((entry = zipStream.GetNextEntry()) != null)
ExtraZipEntry(zipStream, entry, targetDir);
}
cb(true);
}
catch (Exception e)
{
//ReportManager.Inst.ReportException(e);
cb(false);
}
});
t.Start();
}
//第三部分
void ExtraZipEntry(ZipInputStream zipStream, ZipEntry entry, string outputDir)
{
int bufferSize_ = 8192;
byte[] buffer = new byte[bufferSize_];
int readSize_ = 0;
string directroyName = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
string absDirectory = Path.Combine(outputDir, directroyName);
string absFile = Path.Combine(absDirectory, fileName);
Debug.Log("解压信息:" + directroyName + " " + fileName + " " + absDirectory + " " + absFile);
if (!string.IsNullOrEmpty(directroyName))
Directory.CreateDirectory(absDirectory);
int size = (int)entry.Size;
using (FileStream fileStream = File.Create(absFile))
{
while (readSize_ < size)
{
int rd = zipStream.Read(buffer, 0, Math.Min(size - readSize_, bufferSize_));
fileStream.Write(buffer, 0, rd);
readSize_ += rd;
}
}
}
『叁』 HttpRequest 和HttpWebRequest的区别
System.Web.HttpRequest是封装浏览器对服务器的请求的,主要用在ASP.NET中,其中包括浏览器请求的网址,查询字符串数据或表单数据等等
而System.Net.HttpWebRequest则是用来简化网络请求的过程,从服务器上获取文件/结果的,譬如你可以在代码中用这个类冒充浏览器(设置一个UserAgent)来发请求,处理回应
第一:他们不是父子关系。
第二:Syste.Net.HttpWebRequest 类是System.Net.WebRequest抽象类的一个子类,它是
.NET Framework 的用于访问 Internet
数据的请求/响应模型的抽象基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet
请求数据。在这种方式下,应用程序处理 WebRequest 类的实例,而协议特定的子类则执行请求的具体细节。
System.Net.HttpWebRequest 类和System.Net.FileWebRequest都继承了WebRequest
1、FileWebRequest 类为使用 file:// 方案来请求本地文件的 URI 实现 WebRequest 抽象基类。
2、HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
第三:System.Web.HttpRequest 类使 ASP.NET 能够读取客户端在 Web
请求期间发送的 HTTP 值。HttpRequest 类的方法和属性通过
HttpApplication、HttpContext、Page 和 UserControl 类的 Request
属性公开。
所以使用System.Web.HttpRequest类的时候其实都是利用HttpApplication、HttpContext、Page
和 UserControl 类的 Request
属性。而使用System.Net.HttpWebRequest类时是为了获得一个Uri资源。自己创建。
System.Web 命名空间提供使得可以进行浏览器与服务器通信的类和接口。此命名空间包括 HttpRequest 类(用于提供有关当前
HTTP 请求的广泛信息)、HttpResponse 类(用于管理对客户端的 HTTP 输出)以及 HttpServerUtility
类(用于提供对服务器端实用工具与进程的访问)。System.Web 还包括用于 Cookie 操作、文件传输、异常信息和输出缓存控制的类。
System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口。WebRequest 和 WebResponse
类形成了所谓的可插接式协议的基础,可插接式协议是网络服务的一种实现,它使您能够开发出使用 Internet
资源的应用程序,而不必考虑各种不同协议的具体细节。
『肆』 谁知道C#使用HttpWebRequest的POST方法发送大量数据的方法
不想一点一点写了,粘贴给你吧
使用 HttpWebRequest 向网站提交数据
HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互。
HttpWebRequest 对 HTTP 协议进行了完整的封装,对 HTTP 协议中的 Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。
程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成,下面对这两种方式进行一下说明:
1. GET 方式。 GET 方式通过在网络地址附加参数来完成数据的提交,比如在地址 中,前面部分 表示数据提交的网址,后面部分 hl=zh-CN 表示附加的参数,其中 hl 表示一个键(key), zh-CN 表示这个键对应的值(value)。程序代码如下:
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
//在这里对接收到的页面内容进行处理
}
2. POST 方式。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,参数的格式和 GET 方式一样,是类似于 hl=zh-CN&newwindow=1 这样的结构。程序代码如下:
string param = "hl=zh-CN&newwindow=1";
byte[] bs = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = bs.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
//在这里对接收到的页面内容进行处理
}
在上面的代码中,我们访问了 的网址,分别以 GET 和 POST 方式提交了数据,并接收了返回的页面内容。然而,如果提交的参数中含有中文,那么这样的处理是不够的,需要对其进行编码,让对方网站能够识别。
3. 使用 GET 方式提交中文数据。 GET 方式通过在网络地址中附加参数来完成数据提交,对于中文的编码,常用的有 gb2312 和 utf8 两种,用 gb2312 方式编码访问的程序代码如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "" + HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
//在这里对接收到的页面内容进行处理
}
在上面的程序代码中,我们以 GET 方式访问了网址 ,传递了参数“参数一=值一”,由于无法告知对方提交数据的编码类型,所以编码方式要以对方的网站为标准。常见的网站中, (网络)的编码方式是 gb2312, (谷歌)的编码方式是 utf8。
4. 使用 POST 方式提交中文数据。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,由于提交的参数中可以说明使用的编码方式,所以理论上能获得更大的兼容性。用 gb2312 方式编码访问的程序代码如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param = HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding) + "&" + HttpUtility.UrlEncode("参数二", myEncoding) + "=" + HttpUtility.UrlEncode("值二", myEncoding);
byte[] postBytes = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
//在这里对接收到的页面内容进行处理
}
从上面的代码可以看出, POST 中文数据的时候,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。
以上列出了客户端程序使用 HTTP 协议与服务器交互的情况,常用的是 GET 和 POST 方式。现在流行的 WebService 也是通过 HTTP 协议来交互的,使用的是 POST 方法。与以上稍有所不同的是, WebService 提交的数据内容和接收到的数据内容都是使用了 XML 方式编码。所以, HttpWebRequest 也可以使用在调用 WebService 的情况下。
『伍』 C# HttpWebRequest上传大文件(200M)提示远程主机强迫关闭了一个现有的连接
好明显就是超时导致,把写超时时间设置长一点
『陆』 httpWebRequest.GetResponse() 基础连接已关闭 发送时发生错误
这个不是超时问题,在XP下只要超过125M以上一提交接就报错,WIN7下只要服务器支持超时时间范围内,就算1G的文件传一天也不会超时,因为.NET框架底层的WebRequest是用IE的wininet.dll来进行网络请求的,所以跟不同系统环境下的IE内核有关,要解决此问题只有一个办法,就是自己用SOCKET来进行HTTP请求
『柒』 我用C#开发一个下载功能,用HttpWebRequest类来访问下载,但是发现最大的下载速度是128kbs
下载速度不仅仅是由你的带宽决定的,估计你是两台电脑间测试,目前国内的宽带多数是上下行不对等的,一般电信20M以下的宽带的上行速度不超过70KB/s,而20M的大概就是你说的128KB/s
,一般对称宽带是专线
『捌』 HttpWebRequest怎么长连接
HTTP是无状态的
也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。
所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接
短连接:比如
http
的,只是连接、请求、关闭,过程时间较短
,
服务器若是一段时间内没有收到请求即可关
闭连接。
长连接:有些服务需要长时间连接到服务器,比如
CMPP
,一般需要自己做在线维持。
最近在看
“
服务器推送技术
”
,在
B/S
结构中,通过某种
magic
使得客户端不需要通过轮询即可以得到服务
端的最新信息(比如股票价格)
,这样可
以节省大量的带宽。
传统的轮询技术对服务器的压力很大,
并且造成带宽的极大浪费。如果改用
ajax
轮询,可以降低带宽的负荷
(因为服务器返回的不是完整页面)
,
但是对服务器
的压力并不会有明显的减少。
而推技术(
push
)可以改善这种情况。但因为
HTTP
连接
的特性(短暂,必须由客户端发起)
,使得推技术的实现比较困难,常见的做法是通过延长
http
连接的寿
命
,
来实现
push
。
接下来自然该讨论如何延长
http
连接的寿命
,
最简单的自然是死循环法
:
【
servlet
代
码
片
段
】
public
void
doGet(Request
req,
Response
res)
{
PrintWriter
out
=
res.getWriter();
……
正
常
输
出
页
面
……
『玖』 为什么HttpWebRequest多线程并发访问总是会被阻塞
应用服务器的性能分析是复杂的,关注点很多。比如典型场景Web服务器+数据库,底层网络链路和网络硬件性能姑且不论,单看:Web服务器对静态文件的读写与磁盘和文件系统IO性能紧密相关;对数据的处理和数据库性能相关;而高并发访问则关系到操作系统的线程、网络套接字以及异步网络模型的效率。
在数据量大的情况下,数据库的性能成为一个至关重要的因素,随之带来Web服务器等待数据库的时间。在此基础上如果有大量的用户同时访问,那么会对Web服务器带来什么样的影响?以下主要讨论这个问题。
对于并发访问的处理,一般有两种处理机制:异步非阻塞机制、多线程阻塞机制(介绍略)。在测试选择上,前者使用基于Python的Tornado服务器,而后者使用基于Java的Tomcat服务器。注意:本文并非讨论开发语言的优劣,事实上,新版本的Java也支持异步机制,甚至高性能的epoll等。
测试工具:变态级的http_load
测试方法:使用该工具模拟1、10、100、1000个客户端并发访问以下场景,每次测试时间1分钟,得到服务器端每秒的总响应数。注意:由于Tomcat最大线程的限制(下面有提到)以及操作系统对端口数量的限制,1000个并发已经能够得到明显的结论了。
测试场景:
静态文件的读写。一个html文件和一大一小两个图片,大小分别为676k、1.6M和12k,使用http_load工具随机读取。静态文件读写的耗时可以忽略不计的。
模拟一个耗时操作,比如数据库操作。注意:耗时操作并不占用Web服务器本身的资源,它更多地体现的是Web服务器对并发访问处理的“合理”性。
『拾』 怎么样使用HttpWebRequest和正则表达式提取网页中的链接
用HttpWebRequest和正则表达式提取网页中的链接
用HttpWebRequest取得网页源代码
Dim url As String=" http://www.sina.com "
Dim httpReq As System.Net.HttpWebRequest
Dim httpResp As System.Net.HttpWebResponse
Dim httpURL As New System.Uri(url)
httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
httpReq.Method = "GET"
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
httpReq.KeepAlive = False \' 获取或设置一个值,该值指示是否与 Internet 资源建立持久连接。
Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
Dim respHTML As String = reader.ReadToEnd() \'respHTML就是网页源代码
用正则表达式取得链接地址
Dim strRegex As String = "//([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?" \'这就是表达式
Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count - 1
form1.DefInstance.ListBox1.Items.Add(m(i).Value) \'form1.DefInstance是form1的共享属性和实例
Next i
form1.DefInstance.ListBox.Visible = True \' 设置ListBox为可见
form1.DefInstance.ListBox.Sorted = True \' 对ListBox各元素进行排序
form1.DefInstance.ListBox1.Items.Add(m(i).Value) \'form1.DefInstance是form1的共享属性和实例, 共享成员如果是方法或属性,我们不用创建实例就可以直接用‘类名 .共享成员\'的方法进行调用。设置方法如下:
Private Shared m_vb6FormDefInstance As form1
Public Shared Property DefInstance() As form1
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then \'判断窗体实例是否存在
m_vb6FormDefInstance = New form1
End If
DefInstance = m_vb6FormDefInstance
End Get
Set(ByVal Value As form1)
m_vb6FormDefInstance = Value
End Set
End Property
去除重复地址
Dim countForms As Integer \'以下代码去除重复地址
Dim lstForms() As String
Dim CurId As Integer
With formBrow.DefInstance.ListBox1
ReDim Preserve lstForms(0)
lstForms(0) = .Items(0) \'新数组的第一项和list的第一项相同
For countForms = 1 To .Items.Count - 1 \'items.count得到list1中的项目数
CurId = UBound(lstForms) \'curid为newlist中有项目数
If .Items(countForms) <> lstForms(CurId) Then \'如果旧表第二项不等于新表最大项
ReDim Preserve lstForms(CurId + 1) \'定位到新表第二项
lstForms(CurId + 1) = .Items(countForms) \'新表第二项等于旧表第二项
End If
Next countForms
.Items.Clear() \'删除旧表所有项
For countForms = 0 To UBound(lstForms) \'把新表写入旧表
.Items.Add(lstForms(countForms))
Next countForms
End With
把地址导出为XML
可扩展标记语言 (XML) 是一种提供数据描述格式的标记语言。该语言使跨越多个平台进行更准确的内容声明和获得更有意义的搜索结果变得更加容易。此外,XML 实现了表示与数据的分离。例如,在 HTML 中,使用标记来告诉浏览器将数据显示为粗体或斜体;而在 XML 中,标记只用于描述数据,例如城市名、温度和大气压。在 XML 中,使用样式表(例如,可扩展样式表语言 (XSL) 和层叠样式表 (CSS))在浏览器中显示数据。XML 使数据与表示及处理分离开来,通过应用不同的样式表和应用程序,使您能够根据需要显示和处理数据。
XmlTextWriter 是 XmlWriter 类的实现,该类提供将 XML 写入文件、流或 TextWriter 的 API。该类有许多验证和检查规则,以确保所编写的 XML 的格式正确。当与某些规则发生冲突时,将会引发异常,并且这些异常应该被捕获。XmlTextWriter 有不同的构造函数,每个函数指定写入 XML 数据的不同类型的位置。下面代码使用的是将 XML 写入文件的构造函数。
首先使用 Formatting 属性指定正被编写的 XML 数据的格式。通过将此属性设置为 Indented,编写器使用 Indentation 和 IndentChar 属性缩进子元素。
代码显示了与每个 XML 节点类型相对应的 XML 编写方法。例如,编写一个元素将调用 WriteElementString 方法,编写一个属性将调用 WriteAttributeString 方法。对于嵌套级别,可以使用 WriteStartElement/WriteEndElement 对;如果要创建较复杂的属性,则可以使用 WriteStartAttribute/WriteEndAttribute 对。
请注意代码如何使用 WriteStartDocument 方法编写带版本号“1.0”的 XML 声明。如果要让编写器检查该文档的格式是否正确(先是 XML 声明,序言中的 DOCTYPE,只有一个根级别元素,等等),您必须在调用任何其他编写方法之前,调用此可选的 WriteStartDocument 方法。接着,此代码调用 WriteDocType 方法编写名为“urls”的文档类型。WriteDocType 调用中的第三个参数指定编写器将编写 SYSTEM“urls.dtd”。编写完成后,XML 文件指示有一个要根据其进行验证的外部 DTD。
最后,代码调用 Flush 方法将 XML 数据保存到文件,然后才调用 Close 方法。(虽然此示例确实只需要 Close 方法,但是也存在这样的情况,即需要保存所生成的 XML,并且需要重复使用编写器。)
要检查 XmlTextWriter 的输出,可通过用 XmlTextReader 读取生成的文件来执行往返测试,以验证 XML 的格式是正确的。
Private Sub saveXml()
Dim saveFileDialog1 As New SaveFileDialog
saveFileDialog1.Filter = "xml|*.xml"
saveFileDialog1.Title = "Save a xml File"
saveFileDialog1.ShowDialog()
If saveFileDialog1.FileName <> "" Then\'如果文件名不等于空白
Dim fileName As String = saveFileDialog1.FileName
If Not System.IO.File.Exists(fileName) Then \'如果不存在同名文件
Dim myXmlTextWriter As XmlTextWriter = New XmlTextWriter(fileName, Nothing)
myXmlTextWriter.Formatting = System.Xml.Formatting.Indented\'设置缩进
myXmlTextWriter.WriteStartDocument(False)
myXmlTextWriter.WriteDocType("urls", Nothing, "urls.dtd", Nothing)
myXmlTextWriter.WriteComment("This file save the Urls")\'注释
myXmlTextWriter.WriteStartElement("urls")\'开始元素
myXmlTextWriter.WriteStartElement("url1", Nothing)\'开始元素
myXmlTextWriter.WriteAttributeString("now", Now)\'在属性里记录时间
For countAll As Integer = 0 To ListBox1.Items.Count - 1
Dim title As String = Strings.Right(ListBox1.Items.Item(countAll), 3)\'取URL后三字
Dim body As String = lstMuLu.Items.Item(countAll)
myXmlTextWriter.WriteElementString(title, Nothing, body)
Next
myXmlTextWriter.WriteEndElement()
myXmlTextWriter.WriteEndElement()
\'Write the XML to file and close the myXmlTextWriter
myXmlTextWriter.Flush()
myXmlTextWriter.Close()
End If
End If
End Sub