Android MediaPlayer与Http Proxy结合之基础篇

【Android】在Android中设置网络代理:一文详解 在移动设备上,特别是Android平台,设置网络代理是一种常见的需求,可以通过网络代理实现对网络请求和响应的拦截和修改。本文将详细介绍在Android设备上通过adb命令设置全局HTTP代理的方法,并解释这个操作的实际用途以及在开发和测试中的应用场景。 阅读详情

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

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

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

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

  1. J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:
  2. Android工程:本文重点,必须唠叨一下。MediaPlayer播放网络音频(http://blog.youkuaiyun.com/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 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();
	}
}

 

Android MediaPlayer与Http Proxy结合之提高篇 在基础篇之上扩展,可以支持seek,更接近实际使用。 立即下载

相关推荐

Android MediaPlayer与Http Proxy结合之优化篇

本文是在《玩转 Android MediaPlayer之视频预加载(优化)》基础上修复Http代理服务器(Http Proxy()透传的bug。前面几篇相关文章所用的代理服务器一个时间只能监听来自Mediaplayer的一个Request请求,但在实际项目开发过程中,发现有些支持m3u8格式Mediaplayer发出新的Request请求之前不会中断旧的Request请求,所以本文代码会加入多线程监听Request请求。

Android搭建HTTP服务,作为MediaPlayer的播放源来播放音频

问题描述:遇到过这样一个问题,向服务器发送一个请求,然后服务器给一个返回,这个返回当中包含有json数据和音频数据,我需要做的就是解析出这段音频数据然后播放出来。 目前Android播放音频有两种方式,一种是MediaPlayer,支持播放本地文件、网络文件等;另一种是AudioTrack,可以用来播放音频流,但是只支持播放原生的音频数据。 因此如果想要实现播放的功能,就有两种解决方案: 1.

我是黄大仙 3598

玩转 Android MediaPlayer之Media Proxy

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

Android之LocalSocket和LocalServerSocket的使用

前言: 在分析Android视频直播的源码时,碰到了LocalSocket和LocalServerSocket,于是在这里做个小结 在Android Developer中,关于LocalSocket和LocalServerSocket的解释比较少,个人总结一下, 在所看的代码中,其所起的作用吧!LocalSocket并不于Socket相同,LocalSocket个人总结的 作用是:

drinkingcode 1万+

ADS使用Smith圆图进行阻抗匹配

在处理RF系统的实际应用问题时,总会遇到一些非常困难的工作,对各部分级联电路的不同阻抗进行匹配就是其中之一。一般情况下,需要进行匹配的电路包括天线与低噪声放大器(LNA)之间的匹配、功率放大器输出(RFOUT)与天线之间的匹配、LNA/VCO输出与混频器输入之间的匹配。匹配的目的是为了保证信号或能量有效地从“信号源”传送到“负载”。 阻抗匹配(impedance matching) 信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输

红茶绿茶和奶茶的博客 3万+

从OVITO可视化到LAMMPS计算:ATOMSK堆垛层错模型的全流程避坑指南

本文提供了一份从ATOMSK建模、OVITO可视化诊断到LAMMPS计算的堆垛层错模型全流程实战指南。重点解析了构建“计算友好”模型的核心矛盾,并详细演示了如何通过添加真空层、原子包裹和能量最小化等关键步骤,规避周期性边界条件带来的非物理相互作用,确保广义层错能计算的可靠性与可复现性。

v4w5x6的博客 266

android local socket,android localSocket

package com.ccdt.crashcollect.cmd;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import android.net.LocalServerSocket;import andro...

weixin_28932617的博客 261

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 607
上一篇: 可动态布局的Android抽屉之完整篇
下一篇: 适应多行长文本的Android TextView
欧巴Godwin
欧巴Godwin 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 9690粉丝 141原创
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值