package com.example.ffy.other;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.lang.Thread.sleep;
/**
* Created by ffy on 18-6-9.
*/
public class MediaPlayerProxy {
public static boolean proxyIdle = true;//代理是否空闲
//手机ip地址
final static private String LOCAL_IP_ADDRESS = "192.168.43.1";
private static int local_ip_port = 9090; //空闲端口
final static private int HTTP_PORT = 80; //空闲端口
public static List<String> bufferingMusicUrlList = new ArrayList<>();//正在缓存的网络音乐地址
private OnCaChedProgressUpdateListener mOnCaChedProgressUpdateListener;
public static long lastProxyId = 0;//最新的代理ID
public long currProxyId = 0;//当前代理ID
private ServerSocket localServer = null;
private String remoteHostAndPort = "";//这个用来到时替换本地地址的
public SocketAddress remoteAddress;
int socketTimeoutTime = 5000; //超时时间
public String writeFileName = "";
boolean writeFile = true;//是否缓存播放文件
String trueSocketRequestInfoStr = "";//音乐的远程socket请求地址
String remotUrl = "";//远程音乐地址
String musicKey = "";//音乐对象的key
public int currPlayDegree = 0;//当前音乐播放进度
public boolean proxyFail = false;//代理播放失败了
private static long cachedFileLength = 0;//已缓存的文件长度
private static long fileTotalLength = 0;//要缓存的文件总长度
public int currMusicCachedProgress = 0;//当前的音乐缓冲值(seekbar上的缓冲值)
//初始化本地socket代理
public MediaPlayerProxy(String writeFileName, boolean writeFile) throws Exception {
currPlayDegree = 0;//当前音乐播放进度
proxyFail = false;//代理播放失败了
cachedFileLength = 0;//已缓存的文件长度
fileTotalLength = 0;//要缓存的文件总长度
currMusicCachedProgress = 0;//当前的音乐缓冲值(seekbar上的缓冲值)
proxyIdle = false; //代理忙
this.writeFile = writeFile;
this.writeFileName = writeFileName;
try {
if (localServer == null || localServer.isClosed()) {
//创建本地socket服务器,用来监听mediaplayer请求和给mediaplayer提供数据
localServer = new ServerSocket();
localServer.setReuseAddress(true);
//创建IP地址为192.168.43.1,端口号为9090的本地端口地址
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(LOCAL_IP_ADDRESS), local_ip_port);
//本地socket绑定本地端口地址
localServer.bind(socketAddress);
}
} catch (Exception e) {
Log.e("1111111111111111+++++++",e.getMessage());
try {
local_ip_port--; //端口号非空闲,自减
localServer = new ServerSocket();
localServer.setReuseAddress(true);
//创建IP地址为192.168.43.1,端口号为9090的本地端口地址
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(LOCAL_IP_ADDRESS), local_ip_port);
//本地socket绑定本地端口地址
localServer.bind(socketAddress);
} catch (Exception e2) {
Log.e("22222222222222++++++",e2.getMessage());
throw new Exception();
}
}
}
/**
* 把网络URL转为本地URL,192.168.43.1替换网络域名,且设置远程的socket连接地址
*
*/
public String getLocalURLAndSetRemotSocketAddr(String url) {
try {
remotUrl = url;
if (writeFile) { //正在缓存的音乐地址
bufferingMusicUrlList.add(remotUrl);
}
String localProxyUrl = "";
final URI originalURI = URI.create(url);
final String remoteHost = originalURI.getHost(); //服务器主机
if (!TextUtils.isEmpty(remoteHost)) { //存在主机
if (originalURI.getPort() != -1) {//URL带Port
new Thread(new Runnable() {
@Override
public void run() {
//服务器的主机号和端口
remoteAddress = new InetSocketAddress(remoteHost, originalURI.getPort());
}
}).start();
//替换
localProxyUrl = url.replace(remoteHost + ":" + originalURI.getPort(), LOCAL_IP_ADDRESS + ":" + local_ip_port);
remoteHostAndPort = remoteHost + ":" + originalURI.getPort();
} else {//URL不带Port,使用80端口
if (!TextUtils.isEmpty(remoteHost)) {
new Thread(new Runnable() {
@Override
public void run() {
remoteAddress = new InetSocketAddress(remoteHost, HTTP_PORT);//使用80端口
}
}).start();
localProxyUrl = url.replace(remoteHost, LOCAL_IP_ADDRESS + ":" + local_ip_port);
remoteHostAndPort = remoteHost;
}
}
}
return localProxyUrl;
} catch (Exception e) {
Log.e("+333333333333++++++++++",e.getMessage());
return "";
}
}
//获得真实的socket请求信息
public void getTrueSocketRequestInfo(Socket localSocket) throws Exception {
InputStream in_localSocket = localSocket.getInputStream();
String trueSocketRequestInfoStr = "";//保存MediaPlayer的真实HTTP请求
byte[] local_request = new byte[1024];
while (in_localSocket.read(local_request) != -1) {
String str = new String(local_request);
trueSocketRequestInfoStr = trueSocketRequestInfoStr + str;
if (trueSocketRequestInfoStr.contains("GET") && trueSocketRequestInfoStr.contains("\r\n\r\n")) {
//把request中的本地ip改为远程ip
trueSocketRequestInfoStr = trueSocketRequestInfoStr.replace(LOCAL_IP_ADDRESS + ":" + local_ip_port, remoteHostAndPort);
this.trueSocketRequestInfoStr = trueSocketRequestInfoStr;
//如果用户拖动了进度条,因为拖动了滚动条还有Range则表示本地歌曲还未缓存完,不再保存
if (trueSocketRequestInfoStr.contains("Range")) {
Log.e("+44444++++Range++++++","");
writeFile = false;
}
break;
}
}
}
//通过远程socket连接远程请求,并返回remot_socket
public Socket sendRemoteRequest() throws Exception {
//创建远程socket用来请求网络数据
Socket remoteSocket = new Socket();
remoteSocket.connect(remoteAddress, socketTimeoutTime);
remoteSocket.getOutputStream().write(trueSocketRequestInfoStr.getBytes());
remoteSocket.getOutputStream().flush();
return remoteSocket;
}
//处理真实请求信息, 把网络服务器的反馈发到MediaPlayer,网络服务器->代理服务器->MediaPlayer
public void processTrueRequestInfo(Socket remoteSocket
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
我是用AndroidStudio写的Android前端,由于项目名称太大,贴不上来,所以我只放了关键的代码文件src,你使用直接把src里面的代码文件粘贴到新建的Android文件中即可。后台用的是 JavaEE+Tomcat+SQLServer。主要实现的功能是:Android前端的登录(注册没实现,很简单的),从后台获取歌曲的全部信息并展示出来,以及边下边播(缓存)。详情见:https://blog.csdn.net/qq_37437983/article/details/80723981
资源推荐
资源详情
资源评论
收起资源包目录
Mp3.zip (86个子文件)
Mp3
Mp3Manager_JavaEE
WebContent
addUser.jsp 1KB
META-INF
MANIFEST.MF 39B
WEB-INF
web.xml 2KB
lib
gson-2.8.0.jar 227KB
sqljdbc42.jar 871KB
main.jsp 2KB
Mp3
zhangcheng-yuqishu.mp3 13.43MB
huangling-fengyue.mp3 8.72MB
pushu-pingbaizhinian.mp3 10.46MB
heyihang-pingfangxiansheng.mp3 9.91MB
userMain.jsp 1KB
index.jsp 101B
Welcome.jsp 1KB
AddMp3.jsp 2KB
.settings
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.project.facet.core.xml 335B
org.eclipse.wst.common.component 474B
org.eclipse.wst.jsdt.ui.superType.container 49B
.jsdtscope 555B
org.eclipse.jdt.core.prefs 357B
src
db
DBOper.java 1KB
servlet
GetMp3Info.java 2KB
UserLogin.java 2KB
DeleteUser.java 1KB
AddUser.java 2KB
PasswordCheck.java 2KB
DeleteMp3.java 1KB
AddMp3.java 2KB
gson
Mp3Info.java 816B
.project 879B
.classpath 825B
build
classes
db
DBOper.class 2KB
servlet
GetMp3Info.class 3KB
DeleteMp3.class 2KB
AddMp3.class 2KB
PasswordCheck.class 2KB
AddUser.class 2KB
DeleteUser.class 2KB
UserLogin.class 2KB
gson
Mp3Info.class 1KB
Mp3_Android
test
java
com
example
ffy
other
ExampleUnitTest.java 399B
androidTest
java
com
example
ffy
other
ExampleInstrumentedTest.java 743B
main
res
mipmap-xxxhdpi
ic_launcher.png 9KB
ic_launcher_round.png 15KB
drawable
outlook.png 38KB
stop.png 4KB
right.png 5KB
bg_white_yuanjiao.xml 203B
music_progressbar.xml 692B
pause.png 4KB
title.jpeg 22KB
left.png 5KB
play.png 4KB
ic_launcher_background.xml 5KB
mipmap-hdpi
ic_launcher.png 3KB
ic_launcher_round.png 5KB
drawable-v24
ic_launcher_foreground.xml 2KB
values
colors.xml 208B
strings.xml 352B
styles.xml 383B
mipmap-xxhdpi
ic_launcher.png 6KB
ic_launcher_round.png 10KB
mipmap-mdpi
ic_launcher.png 2KB
ic_launcher_round.png 3KB
mipmap-xhdpi
music.jpeg 14KB
ic_launcher.png 8KB
next_music.png 714B
music_pb_drag_button.png 2KB
music_button_play.png 9KB
music_link.png 1KB
pre_music.png 720B
music_button_pause.png 9KB
ic_launcher_round.png 10KB
single_play.png 1KB
mipmap-anydpi-v26
ic_launcher_round.xml 270B
ic_launcher.xml 270B
layout
activity_main.xml 2KB
main.xml 5KB
java
com
example
ffy
other
PlayMp3.java 8KB
UserLogin.java 2KB
Mp3Info.java 1KB
MainActivity.java 2KB
Common.java 3KB
MediaPlayerProxy.java 16KB
PlayArea.java 8KB
AndroidManifest.xml 1KB
共 86 条
- 1
资源评论
我要出家当道士
- 粉丝: 9838
- 资源: 46
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功