Android(安卓)MediaPlayer与Http Proxy结合之基础篇
16lz
2021-01-24
本文来自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个线程来实现转发,可以在两个线程内实现保存的功能。
[java] view plain copy print ?- <spanstyle="font-family:ComicSansMS;font-size:18px;">packagecom.musicplayer;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.net.InetAddress;
- importjava.net.InetSocketAddress;
- importjava.net.ServerSocket;
- importjava.net.Socket;
- importjava.net.SocketAddress;
- importjava.net.UnknownHostException;
- importandroid.util.Log;
- publicclassHttpGetProxy{
- finalprivateStringLOCAL_IP_ADDRESS="127.0.0.1";
- finalprivateintHTTP_PORT=80;
- privateServerSocketlocalServer=null;
- privateSocketlocalSocket=null;
- privateSocketremoteSocket=null;
- privateStringremoteIPAddress;
- privateInputStreamin_remoteSocket;
- privateOutputStreamout_remoteSocket;
- privateInputStreamin_localSocket;
- privateOutputStreamout_localSocket;
- privateinterfaceOnFinishListener{
- voidonFinishListener();
- }
- publicHttpGetProxy(intlocalport){
- //--------建立代理中转服务器-----------//
- try{
- localServer=newServerSocket(localport,1,
- InetAddress.getByName(LOCAL_IP_ADDRESS));
- }catch(UnknownHostExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- /**
- *结束时,清除所有资源
- */
- privateOnFinishListenerfinishListener=newOnFinishListener(){
- @Override
- publicvoidonFinishListener(){
- System.out.println("..........releaseall..........");
- Log.e("---->","..........releaseall..........");
- try{
- in_localSocket.close();
- out_remoteSocket.close();
- in_remoteSocket.close();
- out_localSocket.close();
- localSocket.close();
- remoteSocket.close();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- };
- publicvoidstartProxy(StringremoteIpAddr)throwsIOException{
- remoteIPAddress=remoteIpAddr;
- SocketAddressaddress=newInetSocketAddress(remoteIPAddress,HTTP_PORT);
- //--------连接目标服务器---------//
- remoteSocket=newSocket();
- remoteSocket.connect(address);
- System.out.println("..........remoteServerconnected..........");
- Log.e("---->","..........remoteServerconnected..........");
- in_remoteSocket=remoteSocket.getInputStream();
- out_remoteSocket=remoteSocket.getOutputStream();
- System.out.println("..........initremoteServerI/O..........");
- /**
- *接收本地request,并转发到远程服务器
- */
- newThread(){
- publicvoidrun(){
- intbytes_read;
- byte[]local_request=newbyte[5120];
- try{
- //本地Socket
- localSocket=localServer.accept();
- System.out.println("..........localSocketconnected..........");
- Log.e("---->","..........localSocketconnected..........");
- in_localSocket=localSocket.getInputStream();
- out_localSocket=localSocket.getOutputStream();
- System.out.println("..........initlocalSocketI/O..........");
- Log.e("---->","..........initlocalSocketI/O..........");
- Stringbuffer="";
- while((bytes_read=in_localSocket.read(local_request))!=-1){
- Stringstr=newString(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("..........localfinishreceive...........");
- Log.e("---->","..........localfinishreceive..........");
- finishListener.onFinishListener();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }.start();
- /**
- *接收远程服务器reply,并转发到本地客户端
- */
- newThread(){
- publicvoidrun(){
- intbytes_read;
- byte[]remote_reply=newbyte[5120];
- try{
- System.out.println("..........remotestarttoreceive...........");
- Log.e("---->","..........remotestarttoreceive..........");
- while((bytes_read=in_remoteSocket.read(remote_reply))!=-1){
- //System.out.println("remoteSocket"+remote_reply.length);
- //System.out.println("remoteSocket"+newString(remote_reply));
- out_localSocket.write(remote_reply,0,bytes_read);
- out_localSocket.flush();
- }
- System.out.println("..........remotefinishreceive...........");
- Log.e("---->","..........remotefinishreceive..........");
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }.start();
- }
- }
- </span>
更多相关文章
- Android判断json格式将错误信息提交给服务器
- Android(安卓)Push Notification实现信息推送使用
- 三、android编译cmake工程
- android通过Base64往服务器上传图片和对象
- 使用Android(安卓)隐藏API和内部 API
- Android(安卓)Twitter分享,即Twitter授权Oauth然后推文
- Android(安卓)Studio和eclipse之间的不同
- 移动开发:Android升级ADT22后会报ClassNotFoundException的原因
- Android(安卓)App 使用javax.mail.* API发送email&&Eclipse工程