Welcome to Yumao′s Blog.
最近經常聼的一個網絡電臺換了網路
導致直連一直聼的頓頓的
連玩游戯的心情都失去了
後來就在想 既然我有這麽多閒置的服務器
爲什麼不用一個網路好點的國外服務器做轉發
嗯 想到了這方面就蠢蠢欲動了
因爲毛毛我還是對java語言最熟悉
所以還是想著用最基本的servlet寫寫試試好了
以前是有做過http訪問方面的
所以向上游訪問就用HttpClient擔任了
總體思路就是使用httpClient獲取stream
然後服務器進行stream的轉發
或者copy下發(暫無需求 所以就沒做)
成果代碼如下
只用了HttpClient的庫
以及一個jsp文件而已(算是很偷懶了)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <%@ page language= "java" import = "java.io.*" %> <%@ page language= "java" import = "org.apache.http.client.HttpClient" %> <%@ page language= "java" import = "org.apache.http.HttpEntity" %> <%@ page language= "java" import = "org.apache.http.HttpResponse" %> <%@ page language= "java" import = "org.apache.http.client.methods.HttpGet" %> <%@ page language= "java" import = "org.apache.http.impl.client.DefaultHttpClient" %> <% HttpClient httpClient = new DefaultHttpClient(); HttpResponse repon = httpClient.execute(get); HttpEntity entity = repon.getEntity(); if (entity != null ) { InputStream instream = entity.getContent(); int bytesRead = 0 ; OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); while ((bytesRead = instream.read())!=- 1 ) { toClient.write(bytesRead); toClient.flush(); } toClient.close(); } get.abort(); %> |
此轉發也可以用作網頁等任何http數據轉發喔
當然你要想辦法繞過偉大的功夫網而已
一個要點是:
本來我最初的代碼是將stream先用byte數組處理
然後一個包一個包的發
最後發現這樣處理之後
音頻流經常出現斷幀噪音
所以流媒體還是直接轉發就好
畢竟原本就是小包多傳保證實時效果
你將其攔截封了發肯定出問題的呀
當然web的轉發就是可以封了發哦
順帶給出我原來的錯誤方法(可以適用於web)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | HttpClient httpClient = new DefaultHttpClient(); BASE64Decoder bASE64Decoder = new BASE64Decoder(); HttpGet get = new HttpGet( new String(bASE64Decoder.decodeBuffer(request.getParameter( "url" )))); HttpResponse repon = httpClient.execute(get); HttpEntity entity = repon.getEntity(); if (entity != null ) { InputStream instream = entity.getContent(); int bytesRead = 0 ; byte [] buffer = new byte [ 8 ]; OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); while ((bytesRead = instream.read(buffer, 0 , 8 )) != - 1 ) { toClient.write(buffer); toClient.flush(); } toClient.close(); } get.abort(); |
當時還調整了很多次byte數組的容量
最後發現不妥 做不到完美
so…..
思考東西總是繞路的我
哈~