淫技:Android控制電腦瀏覽器顯示內(nèi)容

多笑笑.png

手機(jī)居然可以控制電腦瀏覽器顯示,一開始我也是吃了一驚,但就是可以的,而且只需要修改手機(jī)端的程序,不需要修改瀏覽器?;驹硎鞘謾C(jī)與瀏覽器通過socket 通信。

前言

這個(gè)東西最初我是看簡書一個(gè)大神的文章知道的
http://www.itdecent.cn/p/89ccae3e590b
《調(diào)試手機(jī)中數(shù)據(jù)庫的福音:Android-Debug-Database》

文章介紹了老外的一個(gè)庫Android-Debug-Database ,通過這個(gè)庫,可以在瀏覽器顯示與修改當(dāng)前應(yīng)用的數(shù)據(jù)庫,sharepreferce等內(nèi)容。這可刷新了我的世界觀。在我的想象中,手機(jī)與電腦通信,起碼要寫兩個(gè)軟件,一個(gè)是手機(jī)端,一個(gè)電腦端的。結(jié)果,這個(gè)庫,只需要寫手機(jī)端的。我想,估計(jì)是瀏覽器已經(jīng)是一個(gè)標(biāo)準(zhǔn)的客戶端,手機(jī)只需要完成服務(wù)器的搭建即可。

下圖是我通過手機(jī),在電腦瀏覽器顯示一段基本的html代碼,酷炫得不行


瀏覽器顯示.png

通信過程##

整個(gè)過程是手機(jī)作為服務(wù)器端,瀏覽器作為客戶端。大概通信步驟如下
1.使電腦與手機(jī)位于同一局域網(wǎng)。實(shí)操就是直接用usb連接手機(jī)與電腦,并進(jìn)行端口轉(zhuǎn)發(fā),將電腦端口9989的數(shù)據(jù),轉(zhuǎn)發(fā)到手機(jī)9989端口(當(dāng)然你也可以用其他端口,要保證端口沒有被占用)

adb forward tcp:9989 tcp:9989

2.手機(jī)開啟一個(gè)socket,,指定手機(jī)端口9989監(jiān)聽客戶端連接

            mServerSocket = new ServerSocket(9989);
            Socket socket = mServerSocket.accept();

3.瀏覽器向電腦端口9989 發(fā)送http請(qǐng)求,該請(qǐng)求被轉(zhuǎn)發(fā)到手機(jī)的9989端口,通信連通。具體就是在瀏覽器輸入一個(gè)網(wǎng)址http://localhost:9989/

3.連接后,手機(jī)返回html文件給瀏覽器,瀏覽器進(jìn)行顯示。

            //返回html給瀏覽器
            String route = "wenfeng.html";
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            output = new PrintStream(socket.getOutputStream());
            byte[] bytes;
            bytes = loadContent(route, mAssets);
            //把狀態(tài)返回給瀏覽器
            output.println("HTTP/1.0 200 OK");
            output.println("Content-Type: " + "text/html");
            output.println("Content-Length: " + bytes.length);
            output.println();
            output.write(bytes);
            output.flush();

看看代碼##

在oncreate開啟socket,進(jìn)行監(jiān)聽

public class MainActivity extends AppCompatActivity {
    private ClientServer mclient;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mclient = new ClientServer(this,9989);
        mclient.start();  //開啟監(jiān)聽

    }
}

連接成功后,把html文件返回給瀏覽器,并且返回狀態(tài)碼給瀏覽器。

public class ClientServer implements Runnable {

    private static final String TAG = "ClientServer";

    private final int mPort;

    private boolean mIsRunning;

    private ServerSocket mServerSocket;

    private  Context context;

    public ClientServer(Context context, int port) {
        mPort = port;
        this.context=context;
    }

    public void start() {
        Log.i("wenfeng","start");
        mIsRunning = true;
        new Thread(this).start();
    }

    @Override
    public void run() {
        try {
            mServerSocket = new ServerSocket(mPort);
                Log.i("wenfeng","wait for accept"); //等待連接
                Socket socket = mServerSocket.accept();
                handle(socket);  //處理連接
        } catch (SocketException e) {
            // The server was stopped; ignore.
            Log.i("wenfeng","SocketException",e);
        } catch (IOException e) {
            Log.i("wenfeng","IOException",e);
        } catch (Exception ignore) {
        }
    }

    public void handle(Socket socket) throws IOException {
        BufferedReader reader = null;
        PrintStream output = null;
        try {
            AssetManager mAssets = context.getResources().getAssets();
            String route = "wenfeng.html";
            output = new PrintStream(socket.getOutputStream());
            byte[] bytes;
            //裝載wenfeng.html文件,用于返回給瀏覽器
            bytes = loadContent(route, mAssets);

            //返回服務(wù)器狀態(tài)  
            output.println("HTTP/1.0 200 OK");
            output.println("Content-Type: " + "text/html");
            output.println("Content-Length: " + bytes.length);
            output.println();
           //返回?cái)?shù)據(jù)
            output.write(bytes);
            output.flush();
        } finally {
            try {
                if (null != output) {
                    output.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    //該函數(shù)用于裝載html文件
    public static byte[] loadContent(String fileName, AssetManager assetManager) throws IOException {
        InputStream input = null;
        try {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            input = assetManager.open(fileName);
            byte[] buffer = new byte[1024];
            int size;
            while (-1 != (size = input.read(buffer))) {
                output.write(buffer, 0, size);
            }
            output.flush();
            return output.toByteArray();
        } catch (FileNotFoundException e) {
            return null;
        } finally {
            try {
                if (null != input) {
                    input.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

例子的傳送門,可以體驗(yàn)一下。
https://github.com/wenfengtou/RubbishDemo
日更中,歡迎關(guān)注。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,812評(píng)論 25 709
  • 名詞延伸 通俗的說,域名就相當(dāng)于一個(gè)家庭的門牌號(hào)碼,別人通過這個(gè)號(hào)碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,784評(píng)論 2 56
  • 電臺(tái)里流淌著的聲音柔軟、溫暖,是遠(yuǎn)近的《我曾擁有你,一想到就心酸》,本來這是關(guān)于愛情的,我卻想起了曾經(jīng)在我身邊陪我...
    霓旌ying閱讀 282評(píng)論 1 2
  • 人都是貪婪的,無論是生活,學(xué)習(xí)或是工作上,我們希望一帆風(fēng)順并且步步高升。其實(shí)愿望很美好,現(xiàn)實(shí)很殘酷。有句話:期望越...
    我只是一個(gè)壞小子閱讀 316評(píng)論 0 0

友情鏈接更多精彩內(nèi)容