王霄翔
(南京市第十三中學,江蘇南京,210000)
隨著智能移動終端設備極大范圍的普及,手機應用軟件(APP)正掀起互聯網式的浪潮,完善原始系統的不足與個性化的缺失。APP將獲取到的數據信息直觀呈現,用戶可以更加便捷地參與到各個領域,實現對其他設備的交互控制。Android系統,作為手機應用軟件的主流系統之一,以Linux為基礎為當前流行的各種移動終端設備提供了開源開發平臺。Android系統已經是目前使用最為廣泛的智能手機操作系統之一,獲得了大量手機生產商和智能終端應用開發商的追捧[1]。在硬件方面,使用Android系統的手機廠商可獲谷歌(Google)強大的技術支撐。軟件方面,程序開發人員可享受基于android平臺的應用程序權限,并可上傳軟件以及其開源代碼,提供給Android用戶或開發者免費下載使用。
更重要的一點是,Android終端具備WiFi無線連接的功能,開發者可以在系統所提供的WiFi模塊功能上進一步開發,本文在系統的設計上巧妙地應用了這一功能并進行拓展。在Android開發平臺上可采用基于TCP/IP或UDP/IP協議的socket編程思想,實現手機客戶終端通過WiFi無線網絡與其他手機終端或Personal Computer(PC)的數據傳輸。為了方便用戶更加快捷的實現即時通訊,本文設計一款基于Android平臺的無線局域網通信APP。將傳統的計算機網頁平臺轉變為便攜式手機應用,也進一步為實現真正的智能控制方式提供了可能。
基于飛鴿傳書以及TCP/IP及UDP/IP協議,實現了兩種方式的局域網通信。具體的創新的如下:
(1)通過無線局域網建立連接以及基于飛鴿傳書協議,實現與Android手機移動終端之間的即時通訊,包括消息發送,文件傳輸等。
(2)M2M功能模塊中,當多個用戶終端同處在一個局域網下可通過APP自動尋找并連接周圍的其他用戶終端并連接。
(3)基于UDP/IP和TCP/IP協議以及UDP發送全網廣播等方法,進一步實現局域網下PC端到Android客戶端的socket通信。
Android是一個Google公司推出的以Linux為基礎的開源操作系統是首個為移動終端打造的真正開放和完整的移動平臺。Google重新設計了Java虛擬機,使得Android的Java應用更接近于底層系統,運行效率更高,并且在被監控的情況下運行,安全性也更高[4]。
Android操作系統采用了軟件疊層的架構,自頂向下共包含四個層次:應用層,應用框架層,組件庫和虛擬機層,Linux內核層[5],如圖1所示。Android架構的層次劃分合理,適合底層組件開發和移植同時應用層軟件開發也方便,對于開發人員很有吸引力。

圖1 Android系統架構
1.2.1 AndroidSocket通信
Android與服務器有兩種通信方式,分別為Http通信和Socket通信。在我們的日常開發中不論是響應網絡的請求還是向網絡中發送請求,通常都是用socket實現的[2]。Socket又名套接字,是一種抽象層,應用程序通過它來發送和接收數據。使用Socket可以將應用程序添加到網絡中,與處于同一網絡中的其他應用程序進行通信。簡單來說,Socket提供了程序內部與外界通信的端口并為通信雙方的提供了數據傳輸通道。
基于TCP/IP協議的Socket通信是在雙方通過IP地址以及端口號,建立連接后可直接進行數據的傳輸,在連接時可實現信息的主動推送,不需要在傳輸時不停地由客戶端發送請求給服務器?;赨DP/IP協議建立通信過程更為簡單,提供的是無連接的數據報服務,只要對端都有彼此的IP地址及端口號即可,不需要確認是否建立連接了,不對數據報進行檢查即可發送數據包。相比于TCP/IP協議的通信,UDP線程不安全且易丟失數據包。TCP/IP通信協議是比較偏向物理硬件底層的網絡通信協議,并且是一種可跨多平臺編程的計算機語言。
在基于TCP/IP協議的Socket編程模式中,Socket類是用來建立客戶端程序,ServiceSocket類是用來建立服務器端程序。開發通信程序時,首先建立服務器端,本設計中電腦作為服務器端。建立一個基本的TCP/IP協議的無線局域網socket通信,具體實現步驟歸納如圖2所示。
(1)服務器端創建:聲明一個ServerSocket對象并制定端口號;
(2)調用ServerSocket的accept()方法,等待接受客戶端所發送的連接請求。注意accept()方法在沒有數據進行接收的處于堵塞狀態,即程序不運行;

圖2 基于TCP/IP協議的Socket通信原理
(3)客戶端創建:一個Socket對象,指定服務器端的IP地址和端口號;
(4)客戶端成功建立了與服務器的連接之后,雙方即以進行數據通信;
(5)兩端分別創建InputStream輸入流跟Output Stream輸出流對象用于之間發送數據。
1.2.2 Android手機移動終端間的即時通訊(M2M)
用戶終端的即時通訊,是基于TCP/IP協議的socket通信。在同一局域網下,用戶可通過APP發布的UDP全網廣播,將自己的IP地址及端口號信息通知給周圍的APP用戶,通過自組建立socket通信子線程,實現消息的傳遞及文件傳輸,圖3為其功能模塊圖。

圖3 M2M功能模塊圖
(1)M2M的功能實現過程
實現Android客戶端之間的即時通訊的根本是,通過同一局域網下端對端的建立起通信連接。客戶端雙方在建立即時通訊之前,由連接的發起方主動向接收方發起創建通信連接請求。通信雙方采用的是飛鴿傳書協議,它是基于TCP/IP協議設計的一種分支協議。
Android客戶端之間的通信采用多線程[3]的方式。多線程實際是指實現多任務的一種方式。一個Java應用總是從main()方法開始運行,而這條默認的生產線被稱為主線程。通常創建一個Android工程是,系統都會自動生成一個MainActivity.java的文件。在這個Activity里面如果之間將代碼段寫入到OnCreate()里面,并運行。那么這段代碼就會在主線程里面進行執行。由于,在Android4.0以上版本中,規定在主線程中不能進行訪問網絡相關的操作,所以必須建立子線程處理局域網的通信過程。需要在OnCreate()方法里面加入如下的線程聲明。

由于M2M的socket通信建立過程與P2M的socket建立過程類似,所以此處不再進行重復說明。由于文件的處理時間較長,如果將其放入主線程中處理,很可能造成這個程序卡死,所以設計時新建了文件傳輸[4]NetTcp FileSendThread與文件發送NetTcpFileReceiveThread兩個子線程來處理。文件的傳輸都是通過TCP/IP協議進行的,所以根據對方的IP地址與之間規定的端口號(飛鴿傳輸協議默認port:2425)來新建一個socket,下面代碼中指出了發送文件的核心代碼。

(2)M2M功能模塊的界面設計
M2M局域網通信,類似于被大家所熟知的手機QQ,由好友列表、聊天界面、文件瀏覽界面等構成。其中,好友列表界面是這個功能的主界面,包含兩部分,頭部跟好友列表。頭部設計包括在線用戶數等信息的顯示。好友列表主要是采用Listview,然后為其添加一個UserListviewAdapter的適配器[6]。如圖4第一個界面所示。好友列表可自動的搜索周圍其他在線用戶發送的廣播,并由發起方自動組建與接收方的socket通信。
如圖4所示,聊天界面的布局類似于微信,頭部顯示對方的基本信息,消息列表也是同樣的有屬于自己的Adapter適配器,不同之處在于,由于對方的消息跟自己發的消息都要呈現在列表當中,對方頭像與消息偏左放置,自己的消息跟頭像則偏右放置,所以需要設計兩個不同的Adapter分別實現各自的樣式。在最下方消息發送欄的最左邊,有一個加號的按鍵,用戶通過點擊此加號彈出文件瀏覽頁面,選定文件后進行傳輸。

圖4 局域網M2M好友列表及聊天界面
選擇文件列表中的某一項文件后,當前路徑就會在界面中顯示出來,此時發送按鍵會enabled。點擊發送會想接收方提交發送文件請求,接收方檢測到文件之后,就會彈出是否確認接收文件的對話框,對話框顯示了文件的數量、發送者的IP地址、發送者的手機型號信息。相應的發送放的手機界面中會出現當前文件的發送進度信息,如圖5的文件瀏覽與接收。

圖5 局域網M2M文件瀏覽及發送進度與接收請求
1.2.3 電腦端與手機端通信(P2M)
P2M通信與M2M通信原理相一致。不同之處在于,電腦服務器端是通過Java代碼實現的界面以及程序的編寫,與Android的java代碼編寫有一些接口程序上的不同。服務器端可以自動的捕捉到用戶端的連接與退出,以及信息發送等等。

圖6 P2M局域網通信電腦端與手機端界面
圖6中分別為Java服務器端界面與Android客戶端界面??蛻舳溯斎敕掌鞫嗽陲@示文本框中IP地址跟端口號,進行對服務器的連接。連接成功之前用戶無法點擊發送按鍵,成功連入之后發送按鍵使能,用戶可以在發送框中輸入消息與服務器進行socket通信。
測試設備:兩部Android手機(android版本為4.0以上)、一臺Win7電腦、一根USB連接線、WiFi等。
測試準備:①將其中一部Android手機通過USB線連入到電腦上。②打開電腦端的Eclipse軟件,進入Eclipse平臺的測試環境,USB將APP程序打包下載到手機測試終端并通過電腦上的LogCat以及控制臺[7]監測到的終端運行信息進行如下的測試過程。
(1)點擊進入M2M功能模塊。
①正常進入后,查看好友列表界面上方是否正確顯示當前在線用戶數等信息。之后,打開另一部Android手機中的APP,同樣進入M2M功能界面。此時,查看兩部手機的在線人數是否更新為2人。
②如果列表用戶數沒有更新,則點擊刷新按鍵,判斷是否實現更新。
③點擊其中某個好友,查看是否正常進入聊天界面。
④如果正常進入后,兩部手機互相發送消息,進行通信功能測試。
⑤在聊天界面中,點擊屏幕左下角的加號,查看是否成功跳轉到文件瀏覽界面。
⑥選擇某個文件,查看是否能夠完成文件傳輸功能。
(2)完成局域網M2M功能測試后,點擊進入P2M界面。
①輸入電腦服務器顯示文本框中的IP地址跟端口號,點擊連接,查看電腦端是否出現P2M通信連接成功提示。
②成功建立連接后,手機與電腦端互相發送消息,進行通信功能的測試。
(3)完成局域網通信功能測試。
本文實現了基于Android平臺下無線局域網絡通信APP的設計與開發?;赥CP/IP和UDP/IP協議實現了P2M與M2M兩大局域網通信功能。
本文首先對研究內容的背景與現狀做出了討論,隨后介紹了在技術開發與設計當中會用到了相關知識與技術。之后重點就APP的詳細設計進行了分功能的描述,包括程序編寫以及界面設計等。在最后,進行了系統的測試與結果分析,達到了最初的設計預期,并確保應用程序的可靠性與穩定性。主要的創新點在于:
當多個用戶終端同處在一個局域網下可通過APP自動尋找并連接周圍的其他用戶終端,實現多方的消息傳送或文件傳輸?;赨DP的全網廣播及TCP/IP協議的局域網通信,不僅可以智能的實現用戶之間自由通信,針對需要進行登錄校園網等付費熱點來說,還可以節省用戶的部分流量費用。
通過WiFi無線網絡與局域網建立連接以及基于飛鴿傳書協議,實現與Android客戶端之間的即時通訊,包括消息發送,文件傳輸等。
基于UDP/IP和TCP/IP協議以及UDP發送全網廣播等方法,進一步實現局域網下PC端到Android客戶端的socket通信。