中易网

如何玩转 Android MediaPlayer之Media Proxy

答案:1  悬赏:30  
解决时间 2021-02-02 05:12
如何玩转 Android MediaPlayer之Media Proxy
最佳答案
HttpGetProxy.JAVA还是本文的关键部分:
[java] view plaincopyprint?
public class HttpGetProxy {
final static private String TAG = "HttpGetProxy";
final static private String LOCAL_IP_ADDRESS_1 = "127.0.0.1";
final static private String LOCAL_IP_ADDRESS_2 = "10.0.2.2";
final static private int HTTP_PORT = 80;
final static private String HTTP_END="\r\n\r\n";

private int proxy_ip_port;

private String original_ip_port;

private String remoteHost;

private String localHost;
private ServerSocket localServer = null;

private Socket sckPlayer = null;

private Socket sckServer = null;
private SocketAddress address;

public HttpGetProxy(int localport) {
try {
_HttpGetProxy(LOCAL_IP_ADDRESS_1,localport);
} catch (Exception e) {
Log.e(TAG,LOCAL_IP_ADDRESS_1+"???"+e.toString());
try {
_HttpGetProxy(LOCAL_IP_ADDRESS_2,localport);
}catch (Exception e1) {
Log.e(TAG,LOCAL_IP_ADDRESS_2+"???"+e.toString());
System.exit(0);
}
}
}
private void _HttpGetProxy(String ipAddress,int localport) throws UnknownHostException, IOException {
proxy_ip_port=localport;
localServer = new ServerSocket(localport,1,InetAddress.getByName(ipAddress));
localHost=ipAddress;
}

public String getLocalURL(String urlString){
//----排除HTTP特殊----//
String targetUrl=ProxyUtils.getRedirectUrl(urlString);
//----获取对应本地代理服务器的链接----//
String result = null;
URI originalURI=URI.create(targetUrl);
remoteHost=originalURI.getHost();
if(originalURI.getPort()!=-1){//URL带Port
address = new InetSocketAddress(remoteHost,originalURI.getPort());//使用默认端口
original_ip_port = originalURI.getPort()+"";//保存端口,中转时替换
result=targetUrl.replace(remoteHost+":"+originalURI.getPort(),
localHost+":"+proxy_ip_port);
}
else{//URL不带Port
address = new InetSocketAddress(remoteHost,HTTP_PORT);//使用80端口
original_ip_port = "";
result=targetUrl.replace(remoteHost,localHost+":"+proxy_ip_port);
}
return result;
}

public void asynStartProxy(){
new Thread() {
public void run() {
int bytes_read;
byte[] local_request = new byte[1024];
byte[] remote_reply = new byte[1024];
while (true) {
try {
//--------------------------------------
//监听MediaPlayer的请求,MediaPlayer->代理服务器
//--------------------------------------
sckPlayer = localServer.accept();
Log.e(TAG, "..........sckPlayer connected..........");
String requestStr = "";
while ((bytes_read = sckPlayer.getInputStream().read(local_request)) != -1) {
byte[] tmpBuffer=new byte[bytes_read];
System.arraycopy(local_request,0,tmpBuffer,0,bytes_read);
String str = new String(tmpBuffer);
//Log.e("from MediaPlayer---->", str);
requestStr = requestStr + str;
if (requestStr.contains("GET")
&& requestStr.contains(HTTP_END)) {
break;
}
}
//把request中的本地ip改为远程ip
requestStr = requestStr.replace(localHost,remoteHost);
//把代理服务器端口改为原URL端口
if(TextUtils.isEmpty(original_ip_port))
requestStr = requestStr.replace(":"+proxy_ip_port, "");
else
requestStr = requestStr.replace(":"+proxy_ip_port, ":"+original_ip_port);
Log.e("to Media Server---->", requestStr);
//--------------------------------------
//把MediaPlayer的请求发到网络服务器,代理服务器->网络服务器
//--------------------------------------
sckServer = new Socket();
sckServer.connect(address);
Log.e(TAG,"..........remote Server connected..........");
sckServer.getOutputStream().write(requestStr.getBytes());//发送MediaPlayer的请求
//------------------------------------------------------
//把网络服务器的反馈发到MediaPlayer,网络服务器->代理服务器->MediaPlayer
//------------------------------------------------------
Log.e(TAG,"..........remote start to receive..........");
String responseStr = "";
boolean isCaptured=false;
while ((bytes_read = sckServer.getInputStream().read(remote_reply)) != -1) {
byte[] tmpBuffer=new byte[bytes_read];
System.arraycopy(remote_reply,0,tmpBuffer,0,bytes_read);
//----捕获收到的Response文本内容----//
if (!isCaptured) {
String str = new String(tmpBuffer);
responseStr += str;
if (responseStr.contains("HTTP/")
&& responseStr.contains(HTTP_END)) {
int endIndex=responseStr.indexOf(HTTP_END, 0);
responseStr=responseStr.substring(0, endIndex);
Log.e("from Media Server---->", responseStr);
isCaptured=true;
}
}
sckPlayer.getOutputStream().write(tmpBuffer);
sckPlayer.getOutputStream().flush();
}
Log.e(TAG, "..........over..........");
//关闭对内,对内 2个SOCKET
sckPlayer.close();
sckServer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
胜利综合商店(胜利街)这个地址在什么地方,我
怎样形容钢铁这个词
考上研究生若不去读,也不掉档案会不会注册学
上善茶坊在哪里啊,我有事要去这个地方
有一种树,很常见的··叶子蛮大的,开的花是
在厂里买了四年的社保,现在出厂了咋办,要办
妈妈说媳妇的坏话,有口无心,但是媳妇生气了,
庆阳曲美博华店地址有知道的么?有点事想过去
黄岛环球驾校为什么要去潍坊考试
韵媚在哪里啊,我有事要去这个地方
怎样才能免费得到家装修!
志辉精品二手车行在什么地方啊,我要过去处理
大家帮我看看这个申通快递,现在已经到贵州贵
米奇玩具·文具·Q币办公用品地址有知道的么
海尔XQB50-10BP洗衣机洗涤后不脱水,又进水漂
推荐资讯
西伯利亚白桦茸和国产白桦茸有什么不同?
大学生面对应激,应对的方法有几种
北京和杭州应该选择哪个
华为h6○一l11显示正在充电却充不开近去
红平果干洗店地址有知道的么?有点事想过去
20选5的组合
金百荷颜值科技管理中心地址在哪,我要去那里
传媒大学考入摄影专业后能否转专业为导演专业
进厂是莫仕好还是捷普好
韩国女组合从天上掉下来带着翅膀的Mv是什么
求答案,好难猜: ( )什么国,没有人。 ( )什么
找一首歌,里面有一名男人的手里握着女人的和
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?