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

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

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

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

  1. J2SE工程:HttpGetProxy,在PC上实现简单的代理服务器,核心类是HttpGetProxy.java,非常容易使用,这里就不唠叨了直接贴出运行效果图:
  2. 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 ?
  1. <spanstyle="font-family:ComicSansMS;font-size:18px;">packagecom.musicplayer;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.io.OutputStream;
  5. importjava.net.InetAddress;
  6. importjava.net.InetSocketAddress;
  7. importjava.net.ServerSocket;
  8. importjava.net.Socket;
  9. importjava.net.SocketAddress;
  10. importjava.net.UnknownHostException;
  11. importandroid.util.Log;
  12. publicclassHttpGetProxy{
  13. finalprivateStringLOCAL_IP_ADDRESS="127.0.0.1";
  14. finalprivateintHTTP_PORT=80;
  15. privateServerSocketlocalServer=null;
  16. privateSocketlocalSocket=null;
  17. privateSocketremoteSocket=null;
  18. privateStringremoteIPAddress;
  19. privateInputStreamin_remoteSocket;
  20. privateOutputStreamout_remoteSocket;
  21. privateInputStreamin_localSocket;
  22. privateOutputStreamout_localSocket;
  23. privateinterfaceOnFinishListener{
  24. voidonFinishListener();
  25. }
  26. publicHttpGetProxy(intlocalport){
  27. //--------建立代理中转服务器-----------//
  28. try{
  29. localServer=newServerSocket(localport,1,
  30. InetAddress.getByName(LOCAL_IP_ADDRESS));
  31. }catch(UnknownHostExceptione){
  32. //TODOAuto-generatedcatchblock
  33. e.printStackTrace();
  34. }catch(IOExceptione){
  35. //TODOAuto-generatedcatchblock
  36. e.printStackTrace();
  37. }
  38. }
  39. /**
  40. *结束时,清除所有资源
  41. */
  42. privateOnFinishListenerfinishListener=newOnFinishListener(){
  43. @Override
  44. publicvoidonFinishListener(){
  45. System.out.println("..........releaseall..........");
  46. Log.e("---->","..........releaseall..........");
  47. try{
  48. in_localSocket.close();
  49. out_remoteSocket.close();
  50. in_remoteSocket.close();
  51. out_localSocket.close();
  52. localSocket.close();
  53. remoteSocket.close();
  54. }catch(IOExceptione){
  55. //TODOAuto-generatedcatchblock
  56. e.printStackTrace();
  57. }
  58. }
  59. };
  60. publicvoidstartProxy(StringremoteIpAddr)throwsIOException{
  61. remoteIPAddress=remoteIpAddr;
  62. SocketAddressaddress=newInetSocketAddress(remoteIPAddress,HTTP_PORT);
  63. //--------连接目标服务器---------//
  64. remoteSocket=newSocket();
  65. remoteSocket.connect(address);
  66. System.out.println("..........remoteServerconnected..........");
  67. Log.e("---->","..........remoteServerconnected..........");
  68. in_remoteSocket=remoteSocket.getInputStream();
  69. out_remoteSocket=remoteSocket.getOutputStream();
  70. System.out.println("..........initremoteServerI/O..........");
  71. /**
  72. *接收本地request,并转发到远程服务器
  73. */
  74. newThread(){
  75. publicvoidrun(){
  76. intbytes_read;
  77. byte[]local_request=newbyte[5120];
  78. try{
  79. //本地Socket
  80. localSocket=localServer.accept();
  81. System.out.println("..........localSocketconnected..........");
  82. Log.e("---->","..........localSocketconnected..........");
  83. in_localSocket=localSocket.getInputStream();
  84. out_localSocket=localSocket.getOutputStream();
  85. System.out.println("..........initlocalSocketI/O..........");
  86. Log.e("---->","..........initlocalSocketI/O..........");
  87. Stringbuffer="";
  88. while((bytes_read=in_localSocket.read(local_request))!=-1){
  89. Stringstr=newString(local_request);
  90. System.out.println("localSocket"+str);
  91. Log.e("localSocket---->",str);
  92. buffer=buffer+str;
  93. if(buffer.contains("GET")
  94. &&buffer.contains("\r\n\r\n")){
  95. //---把request中的本地ip改为远程ip---//
  96. buffer=buffer.replace(LOCAL_IP_ADDRESS,remoteIPAddress);
  97. System.out.println("已经替换IP");
  98. out_remoteSocket.write(buffer.getBytes());
  99. out_remoteSocket.flush();
  100. continue;
  101. }else{
  102. out_remoteSocket.write(buffer.getBytes());
  103. out_remoteSocket.flush();
  104. }
  105. }
  106. System.out.println("..........localfinishreceive...........");
  107. Log.e("---->","..........localfinishreceive..........");
  108. finishListener.onFinishListener();
  109. }catch(IOExceptione){
  110. //TODOAuto-generatedcatchblock
  111. e.printStackTrace();
  112. }
  113. }
  114. }.start();
  115. /**
  116. *接收远程服务器reply,并转发到本地客户端
  117. */
  118. newThread(){
  119. publicvoidrun(){
  120. intbytes_read;
  121. byte[]remote_reply=newbyte[5120];
  122. try{
  123. System.out.println("..........remotestarttoreceive...........");
  124. Log.e("---->","..........remotestarttoreceive..........");
  125. while((bytes_read=in_remoteSocket.read(remote_reply))!=-1){
  126. //System.out.println("remoteSocket"+remote_reply.length);
  127. //System.out.println("remoteSocket"+newString(remote_reply));
  128. out_localSocket.write(remote_reply,0,bytes_read);
  129. out_localSocket.flush();
  130. }
  131. System.out.println("..........remotefinishreceive...........");
  132. Log.e("---->","..........remotefinishreceive..........");
  133. }catch(IOExceptione){
  134. //TODOAuto-generatedcatchblock
  135. e.printStackTrace();
  136. }
  137. }
  138. }.start();
  139. }
  140. }
  141. </span>

更多相关文章

  1. Android判断json格式将错误信息提交给服务器
  2. Android(安卓)Push Notification实现信息推送使用
  3. 三、android编译cmake工程
  4. android通过Base64往服务器上传图片和对象
  5. 使用Android(安卓)隐藏API和内部 API
  6. Android(安卓)Twitter分享,即Twitter授权Oauth然后推文
  7. Android(安卓)Studio和eclipse之间的不同
  8. 移动开发:Android升级ADT22后会报ClassNotFoundException的原因
  9. Android(安卓)App 使用javax.mail.* API发送email&&Eclipse工程

随机推荐

  1. 教你如何选择Android游戏引擎
  2. Android Adapter 源码笔记(1)
  3. Android studio 中创建AIDL Service
  4. Android内存优化
  5. Android软件开发之盘点所有Dialog对话框
  6. 使用Android BindingAdapter与InverseBin
  7. Android两种数据库操作方式入门介绍
  8. Android中实现Broastcast接收短信
  9. Robotium入门
  10. Android取消EditText自动聚焦、自动弹出