Android MediaPlayer与Http Proxy结合之基础篇
来源:互联网 发布:关于网络喷子的见解 编辑:程序博客网 时间:2024/04/29 17:04
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
最近半年都忙着Android TV项目,在春节假期才有时间写点东西。先在这里给大家拜个年,祝大家龙年快乐...
直接进入主题:本文将会教大家如何实现一个简单的代理服务器(仅支持Http Get),与Android的MediaPlayer结合,从而可以扩展出“播放 防盗链的媒体文件”,“边播放边保存”等的功能。
本文的代码可以到这里下载:http://download.csdn.net/detail/hellogv/4047134,代码分为两个工程:
- J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:
- Android工程:本文重点,必须唠叨一下。MediaPlayer播放网络音频(http://blog.csdn.net/hellogv/article/details/6406732)与HttpGetProxy.java结合,通过代理服务器播放网络音频。
接下来贴出HttpGetProxy.java的原理图:
接下来贴出HttpGetProxy.java的源码:
通过RemoteSocket的out_remoteSocket可以访问防盗链资源,HttpGetProxy通过2个线程来实现转发,可以在两个线程内实现保存的功能。
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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 结束时,清除所有资源 */private OnFinishListener finishListener =new OnFinishListener(){@Overridepublic 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 blocke.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 {// 本地SocketlocalSocket = 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 blocke.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 blocke.printStackTrace();}}}.start();}}
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之基础篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之优化篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之优化篇
- Android MediaPlayer与Http Proxy结合之提高篇
- Android MediaPlayer与Http Proxy结合之优化篇
- 日志管理
- SQL锁表语句 收藏
- serialVersionUID作用
- IPhone之UIScrollView—翻页效果
- 从引擎核心谈页游处理 flash平台和 webgl_html平台的硬件加速 2d处理
- Android MediaPlayer与Http Proxy结合之基础篇
- 求职时什么时刻问薪水最恰当?
- 依赖注入那些事儿【2】 之 探究依赖注入
- GridView自定义分页样式
- dll 中使用ADO 出错的相关处理。
- Eclipse调出Android SDK源码实现
- 去除ie下面的滚动条
- android androidManifest.xml 解释
- magento 产品列表排序