关于解析服务器返回的http响应数据

fckkfc 2011-12-21 01:54:34
用GetResponseStream()从服务器得到一个http响应数据流,假设这个数据流包含了三张图片和三段文本,基于http协议。请问该如何解析,分别得到三张图片和文本呢?
...全文
2323 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
fckkfc 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 chromev8 的回复:]

客气了,哥们。

一般的web页面,无论是哪种编程语言写的,服务端逻辑执行完成后,生成html返回给客户端,整个页面请求的生命周期就完了。

但是 multipart/x-mixed-replace 的出现,就是为了保持客户的持续连接。。从而实现服务器端主动推消息。

我们一般使用的是请求(客户端)-响应(服务端)

所以,如果你用你在30楼写的代码,就会发现你的执行线程一直阻塞……
[/Quote]

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

我觉得你当前应该先完成服务器端的逻辑,并提供外部地址,然后才好写客户端代码测试 。
[/Quote]


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框架下,是否还有可用开源方案推荐?
  • 打赏
  • 举报
回复
我觉得你当前应该先完成服务器端的逻辑,并提供外部地址,然后才好写客户端代码测试 。
  • 打赏
  • 举报
回复
客气了,哥们。

一般的web页面,无论是哪种编程语言写的,服务端逻辑执行完成后,生成html返回给客户端,整个页面请求的生命周期就完了。

但是 multipart/x-mixed-replace 的出现,就是为了保持客户的持续连接。。从而实现服务器端主动推消息。

我们一般使用的是请求(客户端)-响应(服务端)

所以,如果你用你在30楼写的代码,就会发现你的执行线程一直阻塞了,就是因为我有node.js写的那个简单的服务器,一直没有结束对于客户端此次请求的响应。。。因为得不到响应,所以执行线程一直阻塞。。

或许有第三方的或ms已经提供了对于 multipart/x-mixed-replace的完整解决方法,但是实在是这个不太常用,所以我们平时关注也并不多。

可以试着找一下第三方对于 multipart/x-mixed-replace提供的现成的库。

fckkfc 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 chromev8 的回复:]

哥们,你没有看我给你的代码。
[/Quote]
谢谢你的指导,感觉离真相越来越近了~
fckkfc 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 chromev8 的回复:]

哥们,你没有看我给你的代码。
[/Quote]
是我的错,昨天没有仔细体味,我想问个问题,begingetresponse是不是会一直在等待服务器端返回数据?我可不可以这样理解,对于特定url的http请求,如果返回多个http包,那么begingetresponse会以异步方式逐步接收所有的包然后进行处理?
hui717 2011-12-28
  • 打赏
  • 举报
回复
楼主需要把返回的HTML协文内容的文本贴出来,才好帮你写解析的代码呀
  • 打赏
  • 举报
回复
to:fckkfc
已经将模拟文本的代码发你邮箱了
  • 打赏
  • 举报
回复
哥们,你没有看我给你的代码。
fckkfc 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 chromev8 的回复:]
我的消息老是发不出,郁闷。。。。
to:fckkfc
已经给你发了邮件了,你查收下。

再发不出不不上csdn了
[/Quote]
我网上找了个程序,自己改了改,可以实现单帧图片获取,但是对于视频数据,还没有实践,主要存在以下困难:
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>
  • 打赏
  • 举报
回复
我的消息老是发不出,郁闷。。。。
to:fckkfc
已经给你发了邮件了,你查收下。

再发不出不不上csdn了
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 chromev8 的回复:]
好,假设文档已经定义好了,你不能修改。
那我现在最关心的问题是,假设所有的数据你都可以正常接收,
在web浏览器中这些视频怎么播放?
[/Quote]
我这么问吧,目前这种情况下,针对服务器端推送来的multipart/x-mixed-replace
类型数据,现有.net框架下有什么开源解决方案么?即要能处理http协议相关的类库,对此,httpwebrequest能满足要求么?
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 jiezi316 的回复:]
HTTP封装的文件数据,应该是base64字符串吧
[/Quote]
说详细点呢?我想不管什么编码不管压缩与否,http头部都会有显示的吧,客户端接收到后进行相应的操作还原数据不就行了么?
jiezi316 2011-12-27
  • 打赏
  • 举报
回复
HTTP封装的文件数据,应该是base64字符串吧
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 chromev8 的回复:]
好,假设文档已经定义好了,你不能修改。
那我现在最关心的问题是,假设所有的数据你都可以正常接收,
在web浏览器中这些视频怎么播放?
[/Quote]
应该是通过第三方插件吧
  • 打赏
  • 举报
回复
好,假设文档已经定义好了,你不能修改。
那我现在最关心的问题是,假设所有的数据你都可以正常接收,
在web浏览器中这些视频怎么播放?
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 chromev8 的回复:]
我删了又写,写了又删。。。。呵呵。
我来仔细了解下multipart/x-mixed-replace先,再讨论。

另外,我的看法是,你的这个项目,我觉得应该从客户端开始考虑。
你做的是直播,而不是点播,如果视频老是停顿肯定效果不好。
所以,我认为你们应该采用流媒体格式

从目前web的层面看,flash media server,windows media server都可以考虑。……
[/Quote]
另外关于
multipart/x-mixed-replace
的相关情况,我看到一篇博文介绍的满不错的,
http://blog.csdn.net/gmstart/article/details/7064034
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 chromev8 的回复:]
根据http://cnodejs.org/blog/?p=2126这里的描述,似乎multipart/x-mixed-replace
只是特定浏览器的实现,而不是html规范中的一部分。

也就是可能在ie中或chrome中无法使用。

我大概的了解了下,这个的目的就是为了保持一个长链接,类似于socket,连接后就可以持续的接收数据。

这里也说到了websocket,我的看法是如……
[/Quote]

服务器在响应请求时,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能否满足我的需求?
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 chromev8 的回复:]
根据http://cnodejs.org/blog/?p=2126这里的描述,似乎multipart/x-mixed-replace
只是特定浏览器的实现,而不是html规范中的一部分。

也就是可能在ie中或chrome中无法使用。

我大概的了解了下,这个的目的就是为了保持一个长链接,类似于socket,连接后就可以持续的接收数据。

这里也说到了websocket,我的看法是如……
[/Quote]
哈哈,我也一直在F5等你的回帖,每次总能从你的回复中汲取到新的知识。
websocket属于HTML5中的新技术吧,之前有想过用HTML5的,不过后来因为各种原因上面明确放弃使用HTML5,所以。。往往没法选择最合适的技术,这也是一种无奈,我只能在需求框架下找个最合适的方案了。
我们这个项目会很大,整个视频采集压缩编解码所有都得自己来,但是有关技术上面做了限定,比如所有的传输都是基于http协议,视频编解码采用directshow,等等。。我觉得我目前需要做的就是从服务器返回的数据中,分类提取中音频图像数据,然后送给directshow处理,进而利用WPF进行播放显示。
fckkfc 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 chromev8 的回复:]
我用纯文本格式做了一个演示,可以实现在web中winform中接收不断发来的数据。
哥们用短消息给我下个email。
[/Quote]

朋友,有空帮我解决下客户端应用程序访问的这个情况啊
加载更多回复(34)

110,534

社区成员

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

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

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