`
bk_lin
  • 浏览: 336520 次
社区版块
存档分类
最新评论

Android MediaPlayer与Http Proxy结合之基础篇

阅读更多

 

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!      

       最近半年都忙着Android TV项目,在春节假期才有时间写点东西。先在这里给大家拜个年,祝大家龙年快乐...

       直接进入主题:本文将会教大家如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 防盗链的媒体文件”,“边播放边保存”等的功能。

       本文的代码可以到这里下载:http://download.csdn.net/detail/hellogv/4047134,代码分为两个工程:

  1. J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:
  2. Android工程:本文重点,必须唠叨一下。MediaPlayer播放网络音频(http://blog.csdn.net/hellogv/article/details/6406732)与HttpGetProxy.java结合,通过代理服务器播放网络音频。

   接下来贴出HttpGetProxy.java的原理图:

 接下来贴出HttpGetProxy.java的源码:

通过RemoteSocket的out_remoteSocket可以访问防盗链资源,HttpGetProxy通过2个线程来实现转发,可以在两个线程内实现保存的功能。

  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.musicplayer;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. import java.net.InetAddress;  
  7. import java.net.InetSocketAddress;  
  8. import java.net.ServerSocket;  
  9. import java.net.Socket;  
  10. import java.net.SocketAddress;  
  11. import java.net.UnknownHostException;  
  12.   
  13. import android.util.Log;  
  14.   
  15. public class HttpGetProxy {  
  16.     final private String LOCAL_IP_ADDRESS = "127.0.0.1";  
  17.     final private int HTTP_PORT = 80;  
  18.   
  19.     private ServerSocket localServer = null;  
  20.     private Socket localSocket = null;  
  21.     private Socket remoteSocket = null;  
  22.     private String remoteIPAddress;  
  23.   
  24.     private InputStream in_remoteSocket;  
  25.     private OutputStream out_remoteSocket;  
  26.     private InputStream in_localSocket;  
  27.     private OutputStream out_localSocket;  
  28.       
  29.     private interface OnFinishListener {  
  30.         void onFinishListener();  
  31.     }  
  32.       
  33.     public HttpGetProxy(int localport) {  
  34.   
  35.         // --------建立代理中转服务器-----------//  
  36.         try {  
  37.             localServer = new ServerSocket(localport, 1,  
  38.                     InetAddress.getByName(LOCAL_IP_ADDRESS));  
  39.         } catch (UnknownHostException e) {  
  40.             // TODO Auto-generated catch block  
  41.             e.printStackTrace();  
  42.         } catch (IOException e) {  
  43.             // TODO Auto-generated catch block  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  
  47.   
  48.     /** 
  49.      * 结束时,清除所有资源 
  50.      */  
  51.     private OnFinishListener finishListener =new OnFinishListener(){  
  52.   
  53.         @Override  
  54.         public void onFinishListener() {  
  55.             System.out.println("..........release all..........");  
  56.             Log.e("---->","..........release all..........");  
  57.             try {  
  58.                 in_localSocket.close();  
  59.                 out_remoteSocket.close();  
  60.                   
  61.                 in_remoteSocket.close();  
  62.                 out_localSocket.close();  
  63.                   
  64.                 localSocket.close();  
  65.                 remoteSocket.close();  
  66.             } catch (IOException e) {  
  67.                 // TODO Auto-generated catch block  
  68.                 e.printStackTrace();  
  69.             }  
  70.         }  
  71.     };  
  72.       
  73.     public void startProxy(String remoteIpAddr) throws IOException {  
  74.         remoteIPAddress = remoteIpAddr;  
  75.         SocketAddress address = new InetSocketAddress(remoteIPAddress,HTTP_PORT);  
  76.   
  77.         // --------连接目标服务器---------//  
  78.         remoteSocket = new Socket();  
  79.         remoteSocket.connect(address);  
  80.         System.out.println("..........remote Server connected..........");  
  81.         Log.e("---->","..........remote Server connected..........");  
  82.         in_remoteSocket = remoteSocket.getInputStream();  
  83.         out_remoteSocket = remoteSocket.getOutputStream();  
  84.         System.out.println("..........init remote Server I/O..........");  
  85.         /** 
  86.          * 接收本地request,并转发到远程服务器 
  87.          */  
  88.         new Thread() {  
  89.             public void run() {  
  90.                 int bytes_read;  
  91.                 byte[] local_request = new byte[5120];  
  92.                 try {  
  93.                     // 本地Socket  
  94.                     localSocket = localServer.accept();  
  95.                     System.out.println("..........localSocket connected..........");  
  96.                     Log.e("---->","..........localSocket connected..........");  
  97.                     in_localSocket = localSocket.getInputStream();  
  98.                     out_localSocket = localSocket.getOutputStream();  
  99.   
  100.                     System.out.println("..........init local Socket I/O..........");  
  101.                     Log.e("---->","..........init local Socket I/O..........");  
  102.                     String buffer = "";  
  103.                     while ((bytes_read = in_localSocket.read(local_request)) != -1) {  
  104.                         String str = new String(local_request);  
  105.                         System.out.println("localSocket     " + str);  
  106.                         Log.e("localSocket---->",str);  
  107.                         buffer = buffer + str;  
  108.                         if (buffer.contains("GET")  
  109.                                 && buffer.contains("\r\n\r\n")) {  
  110.                             //---把request中的本地ip改为远程ip---//  
  111.                             buffer = buffer.replace(LOCAL_IP_ADDRESS,remoteIPAddress);  
  112.                             System.out.println("已经替换IP");  
  113.                             out_remoteSocket.write(buffer.getBytes());  
  114.                             out_remoteSocket.flush();  
  115.                             continue;  
  116.                         } else{  
  117.                             out_remoteSocket.write(buffer.getBytes());  
  118.                             out_remoteSocket.flush();  
  119.                         }  
  120.                     }  
  121.                     System.out.println("..........local finish receive...........");  
  122.                     Log.e("---->","..........local finish receive..........");  
  123.                     finishListener.onFinishListener();  
  124.                 } catch (IOException e) {  
  125.                     // TODO Auto-generated catch block  
  126.                     e.printStackTrace();  
  127.                 }  
  128.             }  
  129.         }.start();  
  130.   
  131.         /** 
  132.          * 接收远程服务器reply,并转发到本地客户端 
  133.          */  
  134.         new Thread() {  
  135.             public void run() {  
  136.                 int bytes_read;  
  137.                 byte[] remote_reply = new byte[5120];  
  138.                 try {  
  139.                     System.out.println("..........remote start to receive...........");  
  140.                     Log.e("---->","..........remote start to receive..........");  
  141.                     while ((bytes_read = in_remoteSocket.read(remote_reply)) != -1) {  
  142.                           
  143.                         //System.out.println("remoteSocket     " + remote_reply.length);  
  144.                         //System.out.println("remoteSocket     " + new String(remote_reply));  
  145.                         out_localSocket.write(remote_reply, 0, bytes_read);  
  146.                         out_localSocket.flush();  
  147.                     }  
  148.                     System.out.println("..........remote finish receive...........");  
  149.                     Log.e("---->","..........remote finish receive..........");  
  150.                 } catch (IOException e) {  
  151.                     // TODO Auto-generated catch block  
  152.                     e.printStackTrace();  
  153.                 }  
  154.             }  
  155.         }.start();  
  156.     }  
  157. }  
  158. </span>  

 

分享到:
评论

相关推荐

    Android MediaPlayer与Http Proxy结合之提高篇

    在基础篇之上扩展,可以支持seek,更接近实际使用。

    Android MediaPlayer与Http Proxy结合之优化篇

    本文是在《玩转 Android MediaPlayer之视频预加载(优化)》基础上修复Http代理服务器(Http Proxy()透传的bug。前面几篇相关文章所用的代理服务器一个时间只能监听来自Mediaplayer的一个Request请求,但在实际项目开发...

    玩转 Android MediaPlayer之Media Proxy

    在《Android MediaPlayer与Http Proxy结合之提高篇》基础上,进一步优化代理服务器,支持了Http的302、301重定向,清晰获取Http Request和Http Response的文本内容。本文以视频播放结合Http Proxy,讲述MediaPlayer...

    Android MediaPlayer 自定义循环次数

    在Android开发中,MediaPlayer是处理音频和视频播放的核心类之一,它提供了丰富的API来控制多媒体文件的播放。本文将深入探讨如何使用MediaPlayer自定义循环播放的次数,这在需要重复播放特定音频片段的应用场景中...

    Android MediaPlayer与Http Proxy案例

    Android MediaPlayer与Http Proxy案例源码,该源码案例将会教大家如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 防盗链的媒体文件”,“边播放边保存”等的功能...

    android MediaPlayer+SurfaceView实现播放

    在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...

    Android 使用MediaPlayer播放视频

    在这个场景中,我们将详细探讨如何使用`MediaPlayer`来播放视频,同时结合`SurfaceView`来显示视频画面。本文将深入解析相关知识点,并提供一个实践示例。 首先,`MediaPlayer`类是Android多媒体框架的一部分,它...

    Android MediaPlayer播放mp3的实例.doc

    MediaPlayer 在底层是基于 OpenCore(PacketVideo) 的库实现的,为了构建一个 MediaPlayer 程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是 Android 基本库中的 Binder 机制。 在本示例中,我们将使用 ...

    Android实例之MediaPlayer播放音乐和视频

    总之,这个实例教程提供了Android开发中使用MediaPlayer播放音乐和视频的基础知识,对于初学者和有经验的开发者来说都是一个很好的学习资源。通过实践这个实例,你可以更好地理解和掌握Android多媒体播放的核心技术...

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    在Android开发中,`MediaPlayer`类是用于播放各种媒体文件的核心组件。它可以处理音频、视频流...在实际项目中,可能需要结合具体需求对这些基础知识进行扩展和优化,比如实现缓冲播放、视频进度控制、全屏切换等功能。

    玩转 Android MediaPlayer之视频预加载(优化)

    总的来说,"玩转 Android MediaPlayer之视频预加载(优化)"是关于如何在Android平台上利用MediaPlayer组件,结合网络条件、硬件能力、错误处理等多个方面,实现视频的高效预加载,提升播放体验的技术探讨。...

    Android应用开发mediaplayer播放音频,带有进度条

    在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用开发知识点的详细解析: 1. **MediaPlayer类**: MediaPlayer是Android提供的...

    Android MediaPlayer使用方法简单介绍

    本篇文章将深入探讨`MediaPlayer`的使用方法,帮助开发者理解和掌握如何在Android应用中实现多媒体播放功能。 首先,创建`MediaPlayer`对象是使用它的第一步。通常,我们通过调用`MediaPlayer.create()`静态方法来...

    Android MediaPlayer研究问题

    这篇博客"Android MediaPlayer研究问题"可能深入探讨了在使用MediaPlayer过程中遇到的问题及解决方案。 首先,我们来了解MediaPlayer的基本用法。在Android中,MediaPlayer类提供了加载、控制和播放媒体文件的能力...

    Android 中级教程之------Android MediaPlayer播放mp3的实例

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...

    Android 使用MediaPlayer高级

    本篇文章将深入探讨`MediaPlayer`的高级用法,包括但不限于事件处理、流媒体播放、音量控制以及错误处理等方面。为了更好地理解这些概念,我们将通过一个名为`MediaPlayerDemo`的示例项目进行讲解。 首先,`...

    android-mediaplayer_android源码_

    `MediaPlayer`类是Android SDK中的核心组件之一,它允许开发者播放本地或网络上的媒体文件。这个类提供了丰富的API,包括播放、暂停、停止、SeekTo(定位播放位置)等操作。`MediaPlayer`的工作流程通常涉及以下几个...

    Android MediaPlayer

    **Android MediaPlayer 深度解析** 在Android平台上,多媒体处理是一个重要的功能,而`MediaPlayer`类是Android SDK提供的一种核心组件,专门用于处理音频和视频的播放。它提供了丰富的功能,如播放本地或网络资源...

    Android MediaPlayer简单音乐播放器

    在Android平台上,开发一个简单的音乐播放器应用是一个常见的任务,主要涉及到的核心组件是`MediaPlayer`。这个组件提供了音频和视频播放的功能,对于构建一个基础的音乐播放器来说,至关重要。以下将详细介绍`...

Global site tag (gtag.js) - Google Analytics