編輯:Android開發實例
本文將會教大家如何實現一個簡單的代理服務器(僅支持Http Get),與Android的MediaPlayer結合,從而可以擴展出“播放 防盜鏈的媒體文件”,“邊播放邊保存”等的功能。
本文的代碼可以到這裡下載:http://download.csdn.net/detail/hellogv/4047134,代碼分為兩個工程:
接下來貼出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();
- }
- }
第一種方法的步驟: 1.在要Activity中實例化WebView組件:WebView webView = new WebView(this); 2.調用WebV
天哪,這篇文章終於說道如何自定義權限了,左盼右盼,其實這個自定義權限相當easy。為了方便敘述,我這邊會用到兩個app作為例子示范。 Permission App
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
本文實例講述了Android編程根據系列圖片繪制動畫的方法。分享給大家供大家參考,具體如下: 一、采用系統提供的Animation類,用自帶的方法 其中的ani