Android MediaPlayer与Http Proxy结合之基础篇

 本文将会教大家如何实现一个简单的代理服务器(仅支持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个线程来实现转发,可以在两个线程内实现保存的功能。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.musicplayer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;

import android.util.Log;

public class HttpGetProxy {
 final private String LOCAL_IP_ADDRESS = "127.0.0.1";
 final private int HTTP_PORT = 80;

 private ServerSocket localServer = null;
 private Socket localSocket = null;
 private Socket remoteSocket = null;
 private String remoteIPAddress;

 private InputStream in_remoteSocket;
 private OutputStream out_remoteSocket;
 private InputStream in_localSocket;
 private OutputStream out_localSocket;
 
 private interface OnFinishListener {
  void onFinishListener();
 }
 
 public HttpGetProxy(int localport) {

  // --------建立代理中转服务器-----------//
  try {
   localServer = new ServerSocket(localport, 1,
     InetAddress.getByName(LOCAL_IP_ADDRESS));
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 结束时,清除所有资源
  */
 private OnFinishListener finishListener =new OnFinishListener(){

  @Override
  public void onFinishListener() {
   System.out.println("..........release all..........");
   Log.e("---->","..........release all..........");
   try {
    in_localSocket.close();
    out_remoteSocket.close();
    
    in_remoteSocket.close();
    out_localSocket.close();
    
    localSocket.close();
    remoteSocket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 };
 
 public void startProxy(String remoteIpAddr) throws IOException {
  remoteIPAddress = remoteIpAddr;
  SocketAddress address = new InetSocketAddress(remoteIPAddress,HTTP_PORT);

  // --------连接目标服务器---------//
  remoteSocket = new Socket();
  remoteSocket.connect(address);
  System.out.println("..........remote Server connected..........");
  Log.e("---->","..........remote Server connected..........");
  in_remoteSocket = remoteSocket.getInputStream();
  out_remoteSocket = remoteSocket.getOutputStream();
  System.out.println("..........init remote Server I/O..........");
  /**
   * 接收本地request,并转发到远程服务器
   */
  new Thread() {
   public void run() {
    int bytes_read;
    byte[] local_request = new byte[5120];
    try {
     // 本地Socket
     localSocket = localServer.accept();
     System.out.println("..........localSocket connected..........");
     Log.e("---->","..........localSocket connected..........");
     in_localSocket = localSocket.getInputStream();
     out_localSocket = localSocket.getOutputStream();

     System.out.println("..........init local Socket I/O..........");
     Log.e("---->","..........init local Socket I/O..........");
     String buffer = "";
     while ((bytes_read = in_localSocket.read(local_request)) != -1) {
      String str = new String(local_request);
      System.out.println("localSocket     " + str);
      Log.e("localSocket---->",str);
      buffer = buffer + str;
      if (buffer.contains("GET")
        && buffer.contains("\r\n\r\n")) {
       //---把request中的本地ip改为远程ip---//
       buffer = buffer.replace(LOCAL_IP_ADDRESS,remoteIPAddress);
       System.out.println("已经替换IP");
       out_remoteSocket.write(buffer.getBytes());
       out_remoteSocket.flush();
       continue;
      } else{
       out_remoteSocket.write(buffer.getBytes());
       out_remoteSocket.flush();
      }
     }
     System.out.println("..........local finish receive...........");
     Log.e("---->","..........local finish receive..........");
     finishListener.onFinishListener();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }.start();

  /**
   * 接收远程服务器reply,并转发到本地客户端
   */
  new Thread() {
   public void run() {
    int bytes_read;
    byte[] remote_reply = new byte[5120];
    try {
     System.out.println("..........remote start to receive...........");
     Log.e("---->","..........remote start to receive..........");
     while ((bytes_read = in_remoteSocket.read(remote_reply)) != -1) {
      
      //System.out.println("remoteSocket     " + remote_reply.length);
      //System.out.println("remoteSocket     " + new String(remote_reply));
      out_localSocket.write(remote_reply, 0, bytes_read);
      out_localSocket.flush();
     }
     System.out.println("..........remote finish receive...........");
     Log.e("---->","..........remote finish receive..........");
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }.start();
 }
}
</span>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值