天天看點

Android MediaPlayer與Http Proxy結合之基礎篇

       最近半年都忙着Android TV項目,在春節假期才有時間寫點東西。先在這裡給大家拜個年,祝大家龍年快樂...

       直接進入主題:本文将會教大家如何實作一個簡單的代理伺服器(僅支援Http Get),與Android的MediaPlayer結合,進而可以擴充出“播放 防盜鍊的媒體檔案”,“邊播放邊儲存”等的功能。

J2SE工程:HttpGetProxy,在PC上實作簡單的代理伺服器,核心類是HttpGetProxy.java,非常容易使用,這裡就不唠叨了直接貼出運作效果圖:

Android MediaPlayer與Http Proxy結合之基礎篇

   接下來貼出HttpGetProxy.java的原理圖:

Android MediaPlayer與Http Proxy結合之基礎篇

 接下來貼出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) {  

        }  

    /** 

     * 結束時,清除所有資源 

     */  

    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{  

                        }  

                    }  

                    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,并轉發到本地用戶端 

                byte[] remote_reply = new byte[5120];  

                    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..........");  

}  

</span>  

繼續閱讀