用GetResponseStream()从服务器得到一个http响应数据流,假设这个数据流包含了三张图片和三段文本,基于http协议。请问该如何解析,分别得到三张图片和文本呢?

解决方案 »

  1.   

    一个url对应一个网络上的资源,三张图片、1个html、2个css文件、2个js文件,分别对应8个不同的url,需要请求8次。
      

  2.   

    如楼上所说你也可以下载一个抓包的软件看下
    例如httpnetworksniffer或者smsniff下载网址http://www.nirsoft.net/utils/smsniff.html
    http://www.nirsoft.net/utils/http_network_sniffer.html
      

  3.   


    可能我表述的不够清楚,我直接上代码:
    HttpWebRequest request=(HttpWebRequest)WebRequest.Create(url);
    request.Method="GET";
    HttpWebResponse response=(HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
    StreamReader loResponseStream = new StreamReader(responseStream, enc);
    string FinalResponse = loResponseStream.ReadToEnd();
    StreamWriter sw = new StreamWriter("test.txt", true, Encoding.UTF8);
    sw.Write(FinalResponse);
    sw.Close();
    loResponseStream.Close();
    response.Close();
    问题如下:
    1.我请求的资源,可能会在一次getresponsestream中返回一系列数据,比方我上述所说的三张图片和三段文本,我想问的正是如何从这个返回的stream中精确的分别提取出上述数据。另外,我用抓包软件分析过,当返回的数据过多时,会以多个http包的形式返回,但是在程序中,似乎getresponsestream会一次返回所有数据,而不是我所设想的程序中应该会出现多个http头部以及body,求解释。
    2.为什么我抓包分析出来的contentlength与上述FinalResponse的长度不一样呢?而且FinalResponse的长度与我写到文件中的长度又不一样,很奇怪,程序里我按照相同的编码方式操作的啊,对此我有两个猜测,一,是不是我编码方式与其在http包中的编码方式不同导致长度不一?二,是不是我写到文件中去的时候会因回车换行操作符等导致长度不同?  不是很明白,麻烦给我解释下哈。
      

  4.   


    可能我表述的不够清楚,我直接上代码:
    HttpWebRequest request=(HttpWebRequest)WebRequest.Create(url);
    request.Method="GET";
    HttpWebResponse response=(HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
    StreamReader loResponseStream = new StreamReader(responseStream, enc);
    string FinalResponse = loResponseStream.ReadToEnd();
    StreamWriter sw = new StreamWriter("test.txt", true, Encoding.UTF8);
    sw.Write(FinalResponse);
    sw.Close();
    loResponseStream.Close();
    response.Close();
    问题如下:
    1.我请求的资源,可能会在一次getresponsestream中返回一系列数据,比方我上述所说的三张图片和三段文本,我想问的正是如何从这个返回的stream中精确的分别提取出上述数据。另外,我用抓包软件分析过,当返回的数据过多时,会以多个http包的形式返回,但是在程序中,似乎getresponsestream会一次返回所有数据,而不是我所设想的程序中应该会出现多个http头部以及body,求解释。
    2.为什么我抓包分析出来的contentlength与上述FinalResponse的长度不一样呢?而且FinalResponse的长度与我写到文件中的长度又不一样,很奇怪,程序里我按照相同的编码方式操作的啊,对此我有两个猜测,一,是不是我编码方式与其在http包中的编码方式不同导致长度不一?二,是不是我写到文件中去的时候会因回车换行操作符等导致长度不同? 不是很明白,麻烦给我解释下哈。
      

  5.   

    你用浏览器访问,同用httpwebrequest请求,抓包工具里显示的是不同的。httpwebrequest每次获取一个资源。
    比如你请求一个html页面,那么你获得的仅是该页面的html文本,该页面可能还引入了一些图片、css文件等,这些资源都不会自动下载的,需要你重新发送请求到相应url获取。
      

  6.   


    这个我也明白,现在项目要求编写客户端模拟http请求,发出命令,然后服务器端收到请求后返回请求数据。也就是说,客户端一个命令,对应的,服务端可能会发送回好几种contenttype的数据,这些可能在一个http包里,也可能分割成好几个http包传输。那么对于我客户端,该以什么样的方式进行处理呢?getresponsestream是不是会将所有数据一次性返回,我又该如何从中界定出不同数据呢?  说白了,一是不明白我用httpwebrequest这个类库能不能满足项目需求,二是不懂getresponsestream工作原理。麻烦给我点提示啊被这个问题困扰几天了
      

  7.   

    你输入一个网址(只执行一次操作)看到图片和动画及文本,就会主观认为是你发起了一个请求,其实不然,其它相关的图片,及css,js都由浏览器去做了。你使用httpwebrequest来做,其实就是要模拟浏览器的所有行为。包括cookie在客户端及服务器的来回传递。(题外话)所以,你拿到response stream后,读出所有的文本,然后再分析其中是不是有<img src="" />这样的标签,如果有,则还要对这 些img的src再次创建httpwebrequest请求。
      

  8.   

    对的,你说的很对,其实我就是在模拟浏览器的行为,只不过我这边其实需求有点特殊。比方说我客户端建立一个请求之后,服务端对此请求解析,然后调用一些服务逻辑,获取到所需数据(比方说请求的是视频流),那么服务器会返回客户端http封装的一帧帧连续的图像,也就是说图像数据是直接内嵌在http包中,而不是返回带有<img src="" />这样的标签的html。
      

  9.   

    不好意思啊,可能是我表述的不够清楚;本身解析服务器返回的httpresponse是打算用socket编程解决的,但是上面要求尽量使用.net 类库处理,我搜索再三觉得httpwebrequest这个类貌似可以做这些事情,简而言之,我客户端发送一个带命令的请求,经过服务端处理之后可能返回multipart /x-mixed-replace类型的数据,即返回的包可能包含多种数据,而我就想知道通过Stream responseStream = response.GetResponseStream();从中能获取到什么,是去除http头部以后的所请求数据呢还是(在返回多个包的情况下)完整的http包?
      

  10.   

    其实,服务器返回什么样的响应,也取决于你发起的请求。
    有若干种请求方式,如get,post,head
    get,post都有完整的响应头及响应正文返回你的问题response.GetResponseStream
    即可以从这个stream中取得响应头也可以取得响应的内容。说实在的,我工作也有N年了,但是今天是第一天看到返回的mime是
    multipart /x-mixed-replace
    这种情况的楼主是不是可以介绍一下详细的需求情况,我总是有一种感觉,你们技术选项存在错误,或有其它更好的方法解决。
      

  11.   

    我写了个测试程序,从GetResponse返回的内容可以取得响应头信息,随后的GetResponseStream返回请求内容,我好奇一点,当http返回内容以好几个包的形式返回时,我没有在GetResponseStream中获取到多个包头信息,很疑惑;另外,公司方面给我们一份文档,文档里面显示,对于某个特定的http get请求,服务器将会返回一个mime类型为multipart的http头部,接下来的数据是各种头类型以及对于的数据流,比方说image类型然后其后跟着此类数据流,jpeg类型然后其后跟着此类数据流,诸如此类。。所以我不明白,是需求有问题?还是我自己理解偏颇?还是选择的技术不适宜解决此类需求?
      

  12.   

    你的疑惑我真的看不明白。
    请求头其实是和响应内容在一次通讯中返回的。
    看来楼主比较熟悉socket,但http通讯是有区别的
    浏览器发起socket通讯,服务器将头和内容一起返回后,就断开socket了。我似乎明白了一点,你们似乎是在使用socket的定义协议的经验去开发http应用。我可以这样理解,定义这个文档的人,熟悉socket但不是熟悉http我的看法是可以使用xml
    将图片的base64编码保存到xml中,然后在网络中传输。
    示例:
    <root>
    <item type='jpg'>
    <data>图片的base编码</data>
    </item>
    </roo>
    不过,这样数据量比较大
      

  13.   

    确实啊。。其实这个问题用socket编程反而更好解决,你给的方案也很不错,但是我的解决方案被限定在了使用现有类库。我们这个是监控项目,其中一基本需求---播放视频:即客户端发送请求,服务端接收后进行相关处理,调用某个视频监控设备,获取其视频流,然后传送回请求的客户端。因为视频流往往包含音频跟图像数据,所以才会有我说的返回的http包是multipart类型,客户端需要分别解析出图像以及音频数据,然后经过处理播放。对此,兄台可有别的推荐方案?十分感谢你一直以来的帮助哈。心中很是安慰。
      

  14.   

    客户端就是pc机,预计两种访问模式:一种是web浏览器访问,一种是客户端应用程序(即封装http请求,模拟浏览器)
      

  15.   

    web浏览器本身不能播放视频,都是通过插件来实现的
    如flash,windows media player等等
    另外html5另外定义了几种标准格式从你上面的需求来说,我猜你无法使用上述几种,因为这些完全由你们自行开发,那么是不是在web浏览器上你们还要开发浏览器视频播放插件???
      

  16.   

    对于客户端应用程序,打算通过WPF然后调用DirectShow进行视频播放,浏览器播放的话,还不是很清楚,因为感觉未必现有的浏览器能符合需求,HTML5之前也考虑过,不过后来因为高层否决了,基本情况就是如此
      

  17.   

    我删了又写,写了又删。呵呵。
    我来仔细了解下multipart/x-mixed-replace先,再讨论。另外,我的看法是,你的这个项目,我觉得应该从客户端开始考虑。
    你做的是直播,而不是点播,如果视频老是停顿肯定效果不好。
    所以,我认为你们应该采用流媒体格式从目前web的层面看,flash media server,windows media server都可以考虑。
    即将你们采集的视频数据,编码成上述两种格式中的一种,然后余下的事情就水道渠成了。web中播放flash就是一段html标记而已,其中如果在wpf中嵌入一个webbroswer,就更省事了。我在02年经常玩过,一个摄像头采集数据,通过windows media server编码,然后通过浏览器就可以实现看到现场
      

  18.   

    根据http://cnodejs.org/blog/?p=2126这里的描述,似乎multipart/x-mixed-replace
    只是特定浏览器的实现,而不是html规范中的一部分。也就是可能在ie中或chrome中无法使用。我大概的了解了下,这个的目的就是为了保持一个长链接,类似于socket,连接后就可以持续的接收数据。这里也说到了websocket,我的看法是如果使用这种技术,不如使用websocket.这个就是为了在web中实现socket功能而对http协议的一个升级版本。这就的话,你们就可以使用websocket协议来传输视频流了。
    话说回来,你们自己的视频数据格式,在客户端还要开发插件才行啊。
      

  19.   

    哈哈,我也一直在F5等你的回帖,每次总能从你的回复中汲取到新的知识。
    websocket属于HTML5中的新技术吧,之前有想过用HTML5的,不过后来因为各种原因上面明确放弃使用HTML5,所以。。往往没法选择最合适的技术,这也是一种无奈,我只能在需求框架下找个最合适的方案了。
    我们这个项目会很大,整个视频采集压缩编解码所有都得自己来,但是有关技术上面做了限定,比如所有的传输都是基于http协议,视频编解码采用directshow,等等。。我觉得我目前需要做的就是从服务器返回的数据中,分类提取中音频图像数据,然后送给directshow处理,进而利用WPF进行播放显示。
      

  20.   


    服务器在响应请求时,HTTP使用MIME报文格式来封装数据。通常一个HTTP响应只能包含一个数据块。但MIME有一种机制可用一个报文(或HTTP响应)表示将多个数据块,这种机制就是成为“multipart/mixed”的标准MIME类型。multipart/mixed报文大体格式如下: 
    Content-type:multipart/mixed;boundary=ThisRandomString 
    --ThisRandomString 
    Content-type:text/plain 
    第一个对象的数据。 
    --ThisRandomString 
    Content-type:text/plain 
    第二个对象的数据。 
    --ThisRandomString-- 上述报文包括两上数据块,二者的类型都是“text/plain”。最后一个“ThisRandomString”后的两条短线(--)表示报文结束,后面没有数据。 
    以上是我查阅的相关信息,我想知道的是,对于此种情况,我采用httpwebrequest能否满足我的需求?
      

  21.   

    另外关于
    multipart/x-mixed-replace
    的相关情况,我看到一篇博文介绍的满不错的,
    http://blog.csdn.net/gmstart/article/details/7064034
      

  22.   

    好,假设文档已经定义好了,你不能修改。
    那我现在最关心的问题是,假设所有的数据你都可以正常接收,
    在web浏览器中这些视频怎么播放?
      

  23.   

    HTTP封装的文件数据,应该是base64字符串吧
      

  24.   

    说详细点呢?我想不管什么编码不管压缩与否,http头部都会有显示的吧,客户端接收到后进行相应的操作还原数据不就行了么?
      

  25.   

    我这么问吧,目前这种情况下,针对服务器端推送来的multipart/x-mixed-replace
    类型数据,现有.net框架下有什么开源解决方案么?即要能处理http协议相关的类库,对此,httpwebrequest能满足要求么?
      

  26.   

    急切寻求帮助,希望知道的能给我点提示。。真心求help。。客户端发送http请求,服务端返回如下httpresponse(某些字段值我没填写)  HTTP/1.1 200 OK
      Connection: 
      Server: 
      Content-Type: multipart/x-mixed-replace; boundary=--myboundary
      --myboundary  Content-Type: image/jpeg   <image binary data>  --myboundary  Content-Type: image/jpeg   <image binary data>  --myboundary  Content-Type: image/jpeg   <image binary data>问题如下:HttpWebRequest request=(HttpWebRequest)WebRequest.Create(url);
    request.Method="GET";
    HttpWebResponse response=(HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
    StreamReader loResponseStream = new StreamReader(responseStream, enc);
    string FinalResponse = loResponseStream.ReadToEnd();
    StreamWriter sw = new StreamWriter("test.txt", true, Encoding.UTF8);
    sw.Write(FinalResponse);
    sw.Close();
    loResponseStream.Close();
    response.Close();
     Q1. 通过以上程序,我该如何解析返回的httpresponse,或者说我该如何获得其上述原有的形式?
     Q2. GetResponseStream 能返回什么数据?如何获取返回的下述body并进行解析呢?
      
      --myboundary  Content-Type: image/jpeg   <image binary data>  --myboundary  Content-Type: image/jpeg   <image binary data>  --myboundary  Content-Type: image/jpeg   <image binary data> 
      

  27.   

    我用纯文本格式做了一个演示,可以实现在web中winform中接收不断发来的数据。
    哥们用短消息给我下个email。
      

  28.   

    哥们,我email发给你啦,耽误你这么多时间,真不好意思哈。
    感谢你为我提供了web访问的一种方案,不过,我现在更迫切的想知道当前.net框架下有什么方案解析服务器端推送来的multipart/x-mixed-replace类型数据。httpwebrequest可行么?
      

  29.   

    已经给你发了email了,你查收一下。有问题再讨论。
      

  30.   

    已经给你发了email,请查收。
    哥们,在什么地方发财啊?
      

  31.   

    csdn有问题,发了几次发不出。已经给你发了email.哥们,在哪里发财啊。
      

  32.   

    to:fckkfc
    已经将模拟文本的代码发你邮箱了
      

  33.   

    楼主需要把返回的HTML协文内容的文本贴出来,才好帮你写解析的代码呀
      

  34.   

    我的消息老是发不出,郁闷。
    to:fckkfc
    已经给你发了邮件了,你查收下。再发不出不不上csdn了
      

  35.   

    我网上找了个程序,自己改了改,可以实现单帧图片获取,但是对于视频数据,还没有实践,主要存在以下困难:
    1.找不到合适的网址,可以使返回的http包中包含ContentType:multipart/x-mixed-replace,因此写的程序也没法实践。
    2.我其实不确定对于multipart/x-mixed-replace类型的数据,getresponsestream是否要等待服务器数据发送结束才会返回,如果是这样的话,那当实时请求的视频很大的话就会出问题了(不懂浏览器对此的处理原理,应该是边收边播放吧,但是不懂采用的什么技术)
    3.另外我想知道,如何能获取到如下所示这样的完整返回信息呢?
     HTTP/1.1 200 OK
      Connection:  
      Server:  
      Content-Type: multipart/x-mixed-replace; boundary=--myboundary
      --myboundary  Content-Type: image/jpeg  <image binary data>  --myboundary  Content-Type: image/jpeg  <image binary data>  --myboundary  Content-Type: image/jpeg  <image binary data>
      

  36.   

    是我的错,昨天没有仔细体味,我想问个问题,begingetresponse是不是会一直在等待服务器端返回数据?我可不可以这样理解,对于特定url的http请求,如果返回多个http包,那么begingetresponse会以异步方式逐步接收所有的包然后进行处理?
      

  37.   

    客气了,哥们。一般的web页面,无论是哪种编程语言写的,服务端逻辑执行完成后,生成html返回给客户端,整个页面请求的生命周期就完了。但是 multipart/x-mixed-replace 的出现,就是为了保持客户的持续连接。。从而实现服务器端主动推消息。我们一般使用的是请求(客户端)-响应(服务端)所以,如果你用你在30楼写的代码,就会发现你的执行线程一直阻塞了,就是因为我有node.js写的那个简单的服务器,一直没有结束对于客户端此次请求的响应因为得不到响应,所以执行线程一直阻塞。。或许有第三方的或ms已经提供了对于 multipart/x-mixed-replace的完整解决方法,但是实在是这个不太常用,所以我们平时关注也并不多。可以试着找一下第三方对于 multipart/x-mixed-replace提供的现成的库。
      

  38.   


    言之有理,我一直就在怀疑getresponsestream会不会因为需要等服务端将请求的所有信息一次性返回,而导致阻塞,还有一个就是你说的服务端逻辑应该先于客户端开发,确实如此,我现在很难模拟出服务端返回multipart/x-mixed-replace 类型数据,但是对于我们这个项目,服务端开发会异常复杂,我现在只能说是根据服务端可能返回数据类型预作一些技术调查。依你之见,眼下.net框架下的这个httpwebrequest是不是对长连接无计可施了?
      

  39.   

    http://stackoverflow.com/questions/2060953/httpwebresponse-with-mjpeg-and-multipart-x-mixed-replace-boundary-myboundary
    http://curl.haxx.se/mail/lib-2004-11/0129.html以上网址所述问题跟我一样,对于multipart/x-mixed-replace类型的数据,因为是长连接,并且属于服务器推送数据,所以上面观点有提到可能需要监听tcp链接,读取所有数据,然后根据不同contenttype取出对应数据,大致意思如下:The stream of data that I receive has the form (with line numbers added 
    for reference purposes): 
    -------cut here-------------- 
    01: HTTP/1.1 200 OK\r\n 
    02: Content-Type: multipart/x-mixed-replace;boundary=--myboundary\r\n 
    03: --myboundary\r\n 
    04: Content-Type: <binary data type>\r\n 
    05: Time: 2003-01-06 Mon 21:00:05\r\n 
    06: \r\n 
    07: <binary data>\r\n 
    08: --myboundary\r\n 
    09: Content-Type: <binary data type>\r\n 
    10: Time: 2003-01-06 Mon 21:00:06\r\n 
    11: \r\n 
    12: <binary data>\r\n 
    13: --myboundary\r\n 
    14: Content-Type: <binary data type>\r\n 
    15: Time: 2003-01-06 Mon 21:00:07\r\n 
    16: ExtraHeader: Some extra data from the sensor\r\n 
    17: \r\n 
    18: <binary data>\r\n 
    19: --myboundary\r\n 
    ... 
    ----------end cut------------- 
    It would be really cool if cURL set up the following callbacks (or at 
    least something along these lines): 
        header_function 
           Does what the current header function does, e.g. traps line 2 
           Some part of cURL also detects the multipart header and 
              recognizes the boundary parameter 
        subheader_function 
           Does what header_function does, except it gets called when 
              there are headers in the multipart section 
           Traps lines 4, 5, 9, 10, 14, 15, 16 
        write_function 
           Instead of trapping lines 3-19 as one big chunk, it now 
              only returns lines 7, 12, and 18 
    BTW, great library you have here! After going through the tutorial, 
    it's pretty easy to use. 我也清楚从socket读取数据做解析是最靠谱的解决方案,但是我也有苦衷。我被要求寻找在.net框架下是否有开源类库专门处理http协议,我找了很多资料,发现httpwebrequest可能是个解决途径,但是遇到的问题是其方法getresponsestream不知道是否能返回如下所示这样的完整数据,另外也不确定是否会因为等待传输的数据量过大而导致阻塞。
     --myboundary  Content-Type: image/jpeg  <image binary data>  --myboundary  Content-Type: image/jpeg  <image binary data>  --myboundary  Content-Type: image/jpeg  <image binary data>
    因此,我的重点是想知道:
    1.httpwebrequest处理http协议时,当返回的类型为multipart/x-mixed-replace时,getresponsestream会否阻塞,或者能否有合理的异步解决方案?
    2.方案一若走不通,那在.net框架下,是否还有可用开源方案推荐?