Android MediaPlayer与Http Proxy结合之基础篇

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

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

       本文的代码可以到这里下载:http://download.youkuaiyun.com/detail/hcb1230/6593451,代码分为两个工程:

  1. J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:

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

  2. 接下来贴出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、付费专栏及课程。

余额充值