我删了又写,写了又删。呵呵。 我来仔细了解下multipart/x-mixed-replace先,再讨论。另外,我的看法是,你的这个项目,我觉得应该从客户端开始考虑。 你做的是直播,而不是点播,如果视频老是停顿肯定效果不好。 所以,我认为你们应该采用流媒体格式从目前web的层面看,flash media server,windows media server都可以考虑。 即将你们采集的视频数据,编码成上述两种格式中的一种,然后余下的事情就水道渠成了。web中播放flash就是一段html标记而已,其中如果在wpf中嵌入一个webbroswer,就更省事了。我在02年经常玩过,一个摄像头采集数据,通过windows media server编码,然后通过浏览器就可以实现看到现场
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框架下,是否还有可用开源方案推荐?
例如httpnetworksniffer或者smsniff下载网址http://www.nirsoft.net/utils/smsniff.html
http://www.nirsoft.net/utils/http_network_sniffer.html
可能我表述的不够清楚,我直接上代码:
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包中的编码方式不同导致长度不一?二,是不是我写到文件中去的时候会因回车换行操作符等导致长度不同? 不是很明白,麻烦给我解释下哈。
可能我表述的不够清楚,我直接上代码:
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包中的编码方式不同导致长度不一?二,是不是我写到文件中去的时候会因回车换行操作符等导致长度不同? 不是很明白,麻烦给我解释下哈。
比如你请求一个html页面,那么你获得的仅是该页面的html文本,该页面可能还引入了一些图片、css文件等,这些资源都不会自动下载的,需要你重新发送请求到相应url获取。
这个我也明白,现在项目要求编写客户端模拟http请求,发出命令,然后服务器端收到请求后返回请求数据。也就是说,客户端一个命令,对应的,服务端可能会发送回好几种contenttype的数据,这些可能在一个http包里,也可能分割成好几个http包传输。那么对于我客户端,该以什么样的方式进行处理呢?getresponsestream是不是会将所有数据一次性返回,我又该如何从中界定出不同数据呢? 说白了,一是不明白我用httpwebrequest这个类库能不能满足项目需求,二是不懂getresponsestream工作原理。麻烦给我点提示啊被这个问题困扰几天了
有若干种请求方式,如get,post,head
get,post都有完整的响应头及响应正文返回你的问题response.GetResponseStream
即可以从这个stream中取得响应头也可以取得响应的内容。说实在的,我工作也有N年了,但是今天是第一天看到返回的mime是
multipart /x-mixed-replace
这种情况的楼主是不是可以介绍一下详细的需求情况,我总是有一种感觉,你们技术选项存在错误,或有其它更好的方法解决。
请求头其实是和响应内容在一次通讯中返回的。
看来楼主比较熟悉socket,但http通讯是有区别的
浏览器发起socket通讯,服务器将头和内容一起返回后,就断开socket了。我似乎明白了一点,你们似乎是在使用socket的定义协议的经验去开发http应用。我可以这样理解,定义这个文档的人,熟悉socket但不是熟悉http我的看法是可以使用xml
将图片的base64编码保存到xml中,然后在网络中传输。
示例:
<root>
<item type='jpg'>
<data>图片的base编码</data>
</item>
</roo>
不过,这样数据量比较大
如flash,windows media player等等
另外html5另外定义了几种标准格式从你上面的需求来说,我猜你无法使用上述几种,因为这些完全由你们自行开发,那么是不是在web浏览器上你们还要开发浏览器视频播放插件???
我来仔细了解下multipart/x-mixed-replace先,再讨论。另外,我的看法是,你的这个项目,我觉得应该从客户端开始考虑。
你做的是直播,而不是点播,如果视频老是停顿肯定效果不好。
所以,我认为你们应该采用流媒体格式从目前web的层面看,flash media server,windows media server都可以考虑。
即将你们采集的视频数据,编码成上述两种格式中的一种,然后余下的事情就水道渠成了。web中播放flash就是一段html标记而已,其中如果在wpf中嵌入一个webbroswer,就更省事了。我在02年经常玩过,一个摄像头采集数据,通过windows media server编码,然后通过浏览器就可以实现看到现场
只是特定浏览器的实现,而不是html规范中的一部分。也就是可能在ie中或chrome中无法使用。我大概的了解了下,这个的目的就是为了保持一个长链接,类似于socket,连接后就可以持续的接收数据。这里也说到了websocket,我的看法是如果使用这种技术,不如使用websocket.这个就是为了在web中实现socket功能而对http协议的一个升级版本。这就的话,你们就可以使用websocket协议来传输视频流了。
话说回来,你们自己的视频数据格式,在客户端还要开发插件才行啊。
websocket属于HTML5中的新技术吧,之前有想过用HTML5的,不过后来因为各种原因上面明确放弃使用HTML5,所以。。往往没法选择最合适的技术,这也是一种无奈,我只能在需求框架下找个最合适的方案了。
我们这个项目会很大,整个视频采集压缩编解码所有都得自己来,但是有关技术上面做了限定,比如所有的传输都是基于http协议,视频编解码采用directshow,等等。。我觉得我目前需要做的就是从服务器返回的数据中,分类提取中音频图像数据,然后送给directshow处理,进而利用WPF进行播放显示。
服务器在响应请求时,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能否满足我的需求?
multipart/x-mixed-replace
的相关情况,我看到一篇博文介绍的满不错的,
http://blog.csdn.net/gmstart/article/details/7064034
那我现在最关心的问题是,假设所有的数据你都可以正常接收,
在web浏览器中这些视频怎么播放?
类型数据,现有.net框架下有什么开源解决方案么?即要能处理http协议相关的类库,对此,httpwebrequest能满足要求么?
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>
哥们用短消息给我下个email。
感谢你为我提供了web访问的一种方案,不过,我现在更迫切的想知道当前.net框架下有什么方案解析服务器端推送来的multipart/x-mixed-replace类型数据。httpwebrequest可行么?
哥们,在什么地方发财啊?
已经将模拟文本的代码发你邮箱了
to:fckkfc
已经给你发了邮件了,你查收下。再发不出不不上csdn了
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>
言之有理,我一直就在怀疑getresponsestream会不会因为需要等服务端将请求的所有信息一次性返回,而导致阻塞,还有一个就是你说的服务端逻辑应该先于客户端开发,确实如此,我现在很难模拟出服务端返回multipart/x-mixed-replace 类型数据,但是对于我们这个项目,服务端开发会异常复杂,我现在只能说是根据服务端可能返回数据类型预作一些技术调查。依你之见,眼下.net框架下的这个httpwebrequest是不是对长连接无计可施了?
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框架下,是否还有可用开源方案推荐?