1. 程式人生 > >【中期檢查】 搭建Android伺服器並與瀏覽器互動總結一

【中期檢查】 搭建Android伺服器並與瀏覽器互動總結一

最近在寫優麒麟手機助手這個專案,優麒麟手機助手是Ubuntu Kylin組織的開源專案:

在Windows平臺上有眾多的安卓手機管理工具,如360手機助手、騰訊手機管家、豌豆莢等,但是在Linux平臺下卻鮮有功能強大的客戶端出現。為了一解我等Linuxer在學習工作中手機管理的諸多不變,真心需要開發一款可在Linux環境下執行的圖形化安卓手機管理工具,且稱之為優麒麟手機助手。基於Android工具的各項功能進行開發,包括軟體介面界設計、互動命令執行等,使使用者感受不到adb的存在(當然,如果您足夠Hacker也可以拋棄adb基於資料線或wifi等連線方式,自己編寫超級手機hack程序,與Linux客戶端互動並執行各種手機管理功能。難度係數:瘋狂or自殺)。

這個專案希望能在Ubuntu Kylin作業系統下有一款獨特的Android手機管理軟體。經過和導師討論,最終決定先解決無線連線。

前些年,很多人會說在Android端搭建伺服器沒有意義,而隨著家庭區域網的發展,Android手機作為伺服器的意義也逐漸顯現,對於一個程式設計師來說,隨身攜帶一個伺服器本來就是很酷的事情。伺服器開啟,發一個Wifi,如果你蹭程式設計師的網路,那你就要小心了~

在這裡要特別感謝Jonas導師,一直以來我都太關注程式碼,很少思考,東西做完了也就扔了。程式碼本身是沒有意義的,且碼且珍惜吧。

什麼是TCP/IP協議

是用於計算機通訊的一組協議,我們通常稱它為TCP/IP協議族。它是70年代中期美國國防部為其ARPANET廣域網開發的網路體系結構和協議標準,以它為基礎組建的INTERNET是目前國際上規模最大的計算機網路,正因為INTERNET的廣泛使用,使得TCP/IP成了事實上的標準。之所以說TCP/IP是一個協議族,是因為TCP/IP協議包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等許多協議,這些協議一起稱為TCP/IP協議。

層次概述

從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層、網路層、傳輸層、應用層。

什麼是Socket

它實際上是網路通訊的一種介面,基於不同的協議,有各種不同的Socket,比如有基於TCP協議的Socket和基於UDP協議的Socket以及基於藍芽協議的Socket,Android中使用的是Java的Socket模型。

    Socket在計算機行業通常稱為”套接字“,用於描述IP地址和埠,是一個通訊鏈的控制代碼。這是一個比較抽象的概念。計算機是擁有埠的,每一個埠都可以有一個應用程式來進行通訊的使用,比如:80埠是HTTP協議所使用的埠,21埠是FTP協議所使用的埠,埠是計算機和外界通訊的介面,這些介面都是邏輯的介面,埠號取值的範圍是零到256乘以256減1,1024以下的埠都是作業系統使用的保留埠,以上的埠我們可以自由的來使用,不要和其他應用程式的埠衝突。

    應用程式可以通過“套接字”向網路傳送請求或者應答網路的請求,這時候就把Socket分成了兩部分,一部分是伺服器端的Socket,這個Socket主要用來接收來自網路的請求,它一直監聽在某一個埠上。一部分是客戶端的Socket,這個Socket主要用來向網路傳送資料。

  

Http連線和Socket連線的區別

TCP/IP是網路傳輸協議,分為四層:網路介面層、網路層、傳輸層和應用層。

TCP協議和UDP協議都在傳輸層,而Socket則是針對TCP協議和UDP協議的程式設計介面,是網路通訊中端點的抽象表示。包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。

HTTP協議則是存在於應用層,是建立在TCP協議之上的應用。HTTP連線是一種“短連線”,HTTP在每次請求結束後都會主動釋放連線,客戶端也無法向伺服器推送訊息。

最簡單的Android伺服器實現

總體來說Android端實現伺服器和Web伺服器沒什麼區別,通過ServerSocket監聽一個埠,併為每個客戶端分配一個ClientSocket。

通過Android API獲取在Wifi網路下的地址,並可通過同一網段下的PC瀏覽器進行訪問。

package com.example.androidserver;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

import android.app.Activity;

import android.content.Context;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.view.Menu;

import android.widget.TextView;

publicclass MainActivity extends Activity {

private TextView tv_ip;

private TextView tv_mac;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

new ServerThread().start();

    tv_ip = (TextView) findViewById(R.id.tv_ip);

    tv_mac = (TextView) findViewById(R.id.tv_mac);

    tv_ip.setText(getLocalIpAddress());

    tv_mac.setText(getLocalMacAddress());

}

@Override

publicboolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

returntrue;

}

class ServerThread extends Thread{

publicvoid run() {

          ServerSocket serverSocket = null;

try {

          serverSocket = new ServerSocket(8888);

Socket client = null;

DataOutputStream out = null;

while (true) {

try {

// 監聽客戶端,呼叫ServerSocket的accept()方法,接受客戶端所發出的請求

//如果客戶端沒有傳送請求,會阻塞,一直等待accept函式的返回

System.out.println("開啟伺服器!" );

client = serverSocket.accept();

System.out.print("伺服器成功開啟!!");

//從Socket中得到InputStream物件

int temp = 0;

byte[] RecBuff = newbyte[1024];

InputStream inputStream = client.getInputStream();

System.out.println("server get inputstream" );

// 從Inputstream當中讀取客戶端的命令

temp = inputStream.read(RecBuff);

for(int i= 0;i

System.out.println(RecBuff[i]);

System.out.println("讀取完畢");

//向客戶端傳送資料

out =new DataOutputStream

((OutputStream) client.getOutputStream());

out.writeBytes("Android Server Test!");

System.out.println("before send");

out.flush();

System.out.println("server send message");

catch (IOException e) {

// TODO Auto-generated catch blockg

e.printStackTrace();

finally {

if (client != null) {

client.close();

}

相關推薦

中期檢查 搭建Android伺服器瀏覽器互動總結

最近在寫優麒麟手機助手這個專案,優麒麟手機助手是Ubuntu Kylin組織的開源專案: 在Windows平臺上有眾多的安卓手機管理工具,如360手機助手、騰訊手機管家、豌豆莢等,但是在Linux平臺下卻鮮有功能強大的客戶端出現。為了一解我等Linuxer在學習

node.js搭建本地伺服器

前言:簡易上手node.js後,我們就可以在自己電腦上建立本地伺服器了。更多內容訪問:一、先上程式碼。//請求Node.js自帶的http模組。 var http = require('http');

Centos搭建 SVN 伺服器

1、如果僅僅只是搭建 svn 伺服器:   (a)、先檢查 svn 是否已經安裝了 rpm -qa subversion #輸入這個命令後,會出現 subversion 版本號     (b)、如果沒有安裝,使用下面命令: yum install subversio

android筆記android開發環境搭建--android studio安裝配置

一、下載安裝android studio軟體 目前最新的版本是3.1.2版本,下載即可. 下載完成之後開始安裝,安裝過程不難如下 選擇軟體的安裝路徑 安裝完成後啟動android studio 這裡預設選擇”do not i

node.js搭建可訪問本地檔案的伺服器

前言: 學會了如何搭建了伺服器之後,就要開始運用伺服器來訪問靜態檔案了。 一、先上訪問靜態檔案的完整程式碼 (先走下流程,再解析程式碼) //載入模組 var http = require('

git搭建git伺服器 在 Linux 下搭建 Git 伺服器

在 Linux 下搭建 Git 伺服器 目錄 ① 安裝 Git ② 伺服器端建立 git 使用者,用來管理 Git 服務,併為 git 使用者設定密碼 ③ 伺服器端建立 Git 倉庫 ④ 客戶端 clone 遠端倉庫 ⑤ 客

Linux搭建Samba伺服器詳細介紹

什麼是Samba伺服器 我們都知道培養計劃上的檔案都在伺服器上,隨時可以拷貝下來,但是卻不知道這是Samba實現的功能呢 Samba伺服器主要是用來實現SMB協議的,那SMB協議又是什麼呢,它是能讓我們在區域網上共享檔案和印表機的一種協議,也就是通過這個實現這個協議我們的客戶機就可以

OpenCV3.3搭建VS2017+Android開發環境

        在上一篇【OpenCV3.3】編譯原始碼並搭建VS2017+Windows開發環境中我們搭建了OpenCV的Windows開發環境,現在我們來搭建Android的C++開發環境。本文假設讀者的VS2017已經能夠正常編譯出Android程式,使用的NDK版本

linux學習建立虛擬機器搭建叢集(1)

1.下載VMware Workstation 2.建立虛擬機器 其他都是預設操作,虛擬機器名字根據自己喜好。 記憶體根據電腦情況,我選擇1G的,如果自己記憶體小,可以選512M。 3.編輯虛擬機器設定 虛擬機器-設定,將CD/DVD連線設定為ISO映像檔案,我用

不容錯過,最全的安卓架構合集從零開始搭建android框架系列(2)

安卓架構文章合集(a collection of android Architecture) 部落格原地址: 簡書部落格 github地址: 這是從各大平臺上參考的android架構文章,文章資料,主要參考自Info,推薦關注: infoQ 1 Android

Git搭建Git伺服器——本地協議伺服器

環境 CentOS 7 x64 安裝 在終端下執行下面命令來檢查系統是否安裝git $ git --version 如果返回 “git: 未找到命令” 則需要安裝git。 執行下面命令安裝git和nfs $ sudo yum install -y

重點突破——如何快速識別解決“閉包問題”?

.com 不同的 ret log selector src spa 前端 混亂 一、引言 什麽是“閉包”?它既是前端程序中常常會碰到的一個千年大坑,也是這個大坑唯一可以解決自身的辦法。很多大牛對閉包都有自己的解釋,但每個人的解釋可能都不太一樣,看太

小程序搭建本地https服務器(windows)

inf link title windows logs ews 事業部 巴巴 SM (一)用json-server搭建簡單的服務器 (搭建出來的服務器地址為localhonst:3000) 1.新建Mockjson文件夾,進入該文件夾目錄,運行命令

UOJ_14_UER #1DZY Loves Graph_查集

mes pro names sta 樹邊 std 存在 ace namespace UOJ_14_【UER #1】DZY Loves Graph_並查集 題面:http://uoj.ac/problem/14 考慮只有前兩個操作怎麽做。 每次刪除一定是從後往前刪,

Python + uiaotumator2Android—APP自動化簡易例子

layout div ext widget service .py safety wid pre 上代碼: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/31 09:43 #

小程式解決 Android機型上button按鈕出現邊框

【小程式】解決 Android機型上button按鈕出現邊框 問題描述: 在Android機型上出現button按鈕元件,在四個角上出現邊框。在模擬器、iPhone手機上沒有邊框。 問題原因: button控制元件上有一個偽元素(::after),雖然

java -Mac搭建本地伺服器對映到外網

最近在學習Html,小有進步變想著寫一個浪漫的靜態頁面給女朋友浪漫一下,那麼問題就來了,如何把我的網頁讓對網路一竅不通的女朋友看到,所以便想到了是用自己電腦作為伺服器的想法.百度以後整理如下: 首先搭建本地伺服器Mac自帶Apache伺服器,所以比較簡單一: 開啟終端 //開啟apache:需要輸入密碼s

C#作業學生成績新增排序,錯誤則丟擲異常

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Cons

硬碟檢查chkdsk 命令使用

  硬碟使用久了就會有壞道,或者機械損傷的壞道,使用windows自帶命令封鎖壞道可以維持硬碟一段時間壽命(1年左右)。 新建記事本重新命名為“chkdsk_xiao.bat”,將一下內容複製進去: @echo off set /p dsk_name=please inpu

HDU 1811 Rank of Tetris 查集+拓撲

題目連結:傳送門   中文題目就不闡述題意了,我最開始的想法是種類並查集,但是細想一下,發現並不可行,因為題目沒有告訴有多少型別。   做法:關鍵問題是處理等號的兩個點,其實兩個點相等,就相當於這兩個人的排名是一樣的,我們用並查集搞定這麼些個相等排名的點,之後把有