王霄翔
(南京市第十三中學(xué),江蘇南京,210000)
隨著智能移動(dòng)終端設(shè)備極大范圍的普及,手機(jī)應(yīng)用軟件(APP)正掀起互聯(lián)網(wǎng)式的浪潮,完善原始系統(tǒng)的不足與個(gè)性化的缺失。APP將獲取到的數(shù)據(jù)信息直觀呈現(xiàn),用戶可以更加便捷地參與到各個(gè)領(lǐng)域,實(shí)現(xiàn)對(duì)其他設(shè)備的交互控制。Android系統(tǒng),作為手機(jī)應(yīng)用軟件的主流系統(tǒng)之一,以Linux為基礎(chǔ)為當(dāng)前流行的各種移動(dòng)終端設(shè)備提供了開源開發(fā)平臺(tái)。Android系統(tǒng)已經(jīng)是目前使用最為廣泛的智能手機(jī)操作系統(tǒng)之一,獲得了大量手機(jī)生產(chǎn)商和智能終端應(yīng)用開發(fā)商的追捧[1]。在硬件方面,使用Android系統(tǒng)的手機(jī)廠商可獲谷歌(Google)強(qiáng)大的技術(shù)支撐。軟件方面,程序開發(fā)人員可享受基于android平臺(tái)的應(yīng)用程序權(quán)限,并可上傳軟件以及其開源代碼,提供給Android用戶或開發(fā)者免費(fèi)下載使用。
更重要的一點(diǎn)是,Android終端具備WiFi無(wú)線連接的功能,開發(fā)者可以在系統(tǒng)所提供的WiFi模塊功能上進(jìn)一步開發(fā),本文在系統(tǒng)的設(shè)計(jì)上巧妙地應(yīng)用了這一功能并進(jìn)行拓展。在Android開發(fā)平臺(tái)上可采用基于TCP/IP或UDP/IP協(xié)議的socket編程思想,實(shí)現(xiàn)手機(jī)客戶終端通過(guò)WiFi無(wú)線網(wǎng)絡(luò)與其他手機(jī)終端或Personal Computer(PC)的數(shù)據(jù)傳輸。為了方便用戶更加快捷的實(shí)現(xiàn)即時(shí)通訊,本文設(shè)計(jì)一款基于Android平臺(tái)的無(wú)線局域網(wǎng)通信APP。將傳統(tǒng)的計(jì)算機(jī)網(wǎng)頁(yè)平臺(tái)轉(zhuǎn)變?yōu)楸銛y式手機(jī)應(yīng)用,也進(jìn)一步為實(shí)現(xiàn)真正的智能控制方式提供了可能。
基于飛鴿傳書以及TCP/IP及UDP/IP協(xié)議,實(shí)現(xiàn)了兩種方式的局域網(wǎng)通信。具體的創(chuàng)新的如下:
(1)通過(guò)無(wú)線局域網(wǎng)建立連接以及基于飛鴿傳書協(xié)議,實(shí)現(xiàn)與Android手機(jī)移動(dòng)終端之間的即時(shí)通訊,包括消息發(fā)送,文件傳輸?shù)取?/p>
(2)M2M功能模塊中,當(dāng)多個(gè)用戶終端同處在一個(gè)局域網(wǎng)下可通過(guò)APP自動(dòng)尋找并連接周圍的其他用戶終端并連接。
(3)基于UDP/IP和TCP/IP協(xié)議以及UDP發(fā)送全網(wǎng)廣播等方法,進(jìn)一步實(shí)現(xiàn)局域網(wǎng)下PC端到Android客戶端的socket通信。
Android是一個(gè)Google公司推出的以Linux為基礎(chǔ)的開源操作系統(tǒng)是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)平臺(tái)。Google重新設(shè)計(jì)了Java虛擬機(jī),使得Android的Java應(yīng)用更接近于底層系統(tǒng),運(yùn)行效率更高,并且在被監(jiān)控的情況下運(yùn)行,安全性也更高[4]。
Android操作系統(tǒng)采用了軟件疊層的架構(gòu),自頂向下共包含四個(gè)層次:應(yīng)用層,應(yīng)用框架層,組件庫(kù)和虛擬機(jī)層,Linux內(nèi)核層[5],如圖1所示。Android架構(gòu)的層次劃分合理,適合底層組件開發(fā)和移植同時(shí)應(yīng)用層軟件開發(fā)也方便,對(duì)于開發(fā)人員很有吸引力。
圖1 Android系統(tǒng)架構(gòu)
1.2.1 AndroidSocket通信
Android與服務(wù)器有兩種通信方式,分別為Http通信和Socket通信。在我們的日常開發(fā)中不論是響應(yīng)網(wǎng)絡(luò)的請(qǐng)求還是向網(wǎng)絡(luò)中發(fā)送請(qǐng)求,通常都是用socket實(shí)現(xiàn)的[2]。Socket又名套接字,是一種抽象層,應(yīng)用程序通過(guò)它來(lái)發(fā)送和接收數(shù)據(jù)。使用Socket可以將應(yīng)用程序添加到網(wǎng)絡(luò)中,與處于同一網(wǎng)絡(luò)中的其他應(yīng)用程序進(jìn)行通信。簡(jiǎn)單來(lái)說(shuō),Socket提供了程序內(nèi)部與外界通信的端口并為通信雙方的提供了數(shù)據(jù)傳輸通道。
基于TCP/IP協(xié)議的Socket通信是在雙方通過(guò)IP地址以及端口號(hào),建立連接后可直接進(jìn)行數(shù)據(jù)的傳輸,在連接時(shí)可實(shí)現(xiàn)信息的主動(dòng)推送,不需要在傳輸時(shí)不停地由客戶端發(fā)送請(qǐng)求給服務(wù)器?;赨DP/IP協(xié)議建立通信過(guò)程更為簡(jiǎn)單,提供的是無(wú)連接的數(shù)據(jù)報(bào)服務(wù),只要對(duì)端都有彼此的IP地址及端口號(hào)即可,不需要確認(rèn)是否建立連接了,不對(duì)數(shù)據(jù)報(bào)進(jìn)行檢查即可發(fā)送數(shù)據(jù)包。相比于TCP/IP協(xié)議的通信,UDP線程不安全且易丟失數(shù)據(jù)包。TCP/IP通信協(xié)議是比較偏向物理硬件底層的網(wǎng)絡(luò)通信協(xié)議,并且是一種可跨多平臺(tái)編程的計(jì)算機(jī)語(yǔ)言。
在基于TCP/IP協(xié)議的Socket編程模式中,Socket類是用來(lái)建立客戶端程序,ServiceSocket類是用來(lái)建立服務(wù)器端程序。開發(fā)通信程序時(shí),首先建立服務(wù)器端,本設(shè)計(jì)中電腦作為服務(wù)器端。建立一個(gè)基本的TCP/IP協(xié)議的無(wú)線局域網(wǎng)socket通信,具體實(shí)現(xiàn)步驟歸納如圖2所示。
(1)服務(wù)器端創(chuàng)建:聲明一個(gè)ServerSocket對(duì)象并制定端口號(hào);
(2)調(diào)用ServerSocket的accept()方法,等待接受客戶端所發(fā)送的連接請(qǐng)求。注意accept()方法在沒有數(shù)據(jù)進(jìn)行接收的處于堵塞狀態(tài),即程序不運(yùn)行;
圖2 基于TCP/IP協(xié)議的Socket通信原理
(3)客戶端創(chuàng)建:一個(gè)Socket對(duì)象,指定服務(wù)器端的IP地址和端口號(hào);
(4)客戶端成功建立了與服務(wù)器的連接之后,雙方即以進(jìn)行數(shù)據(jù)通信;
(5)兩端分別創(chuàng)建InputStream輸入流跟Output Stream輸出流對(duì)象用于之間發(fā)送數(shù)據(jù)。
1.2.2 Android手機(jī)移動(dòng)終端間的即時(shí)通訊(M2M)
用戶終端的即時(shí)通訊,是基于TCP/IP協(xié)議的socket通信。在同一局域網(wǎng)下,用戶可通過(guò)APP發(fā)布的UDP全網(wǎng)廣播,將自己的IP地址及端口號(hào)信息通知給周圍的APP用戶,通過(guò)自組建立socket通信子線程,實(shí)現(xiàn)消息的傳遞及文件傳輸,圖3為其功能模塊圖。
圖3 M2M功能模塊圖
(1)M2M的功能實(shí)現(xiàn)過(guò)程
實(shí)現(xiàn)Android客戶端之間的即時(shí)通訊的根本是,通過(guò)同一局域網(wǎng)下端對(duì)端的建立起通信連接??蛻舳穗p方在建立即時(shí)通訊之前,由連接的發(fā)起方主動(dòng)向接收方發(fā)起創(chuàng)建通信連接請(qǐng)求。通信雙方采用的是飛鴿傳書協(xié)議,它是基于TCP/IP協(xié)議設(shè)計(jì)的一種分支協(xié)議。
Android客戶端之間的通信采用多線程[3]的方式。多線程實(shí)際是指實(shí)現(xiàn)多任務(wù)的一種方式。一個(gè)Java應(yīng)用總是從main()方法開始運(yùn)行,而這條默認(rèn)的生產(chǎn)線被稱為主線程。通常創(chuàng)建一個(gè)Android工程是,系統(tǒng)都會(huì)自動(dòng)生成一個(gè)MainActivity.java的文件。在這個(gè)Activity里面如果之間將代碼段寫入到OnCreate()里面,并運(yùn)行。那么這段代碼就會(huì)在主線程里面進(jìn)行執(zhí)行。由于,在Android4.0以上版本中,規(guī)定在主線程中不能進(jìn)行訪問(wèn)網(wǎng)絡(luò)相關(guān)的操作,所以必須建立子線程處理局域網(wǎng)的通信過(guò)程。需要在OnCreate()方法里面加入如下的線程聲明。
由于M2M的socket通信建立過(guò)程與P2M的socket建立過(guò)程類似,所以此處不再進(jìn)行重復(fù)說(shuō)明。由于文件的處理時(shí)間較長(zhǎng),如果將其放入主線程中處理,很可能造成這個(gè)程序卡死,所以設(shè)計(jì)時(shí)新建了文件傳輸[4]NetTcp FileSendThread與文件發(fā)送NetTcpFileReceiveThread兩個(gè)子線程來(lái)處理。文件的傳輸都是通過(guò)TCP/IP協(xié)議進(jìn)行的,所以根據(jù)對(duì)方的IP地址與之間規(guī)定的端口號(hào)(飛鴿傳輸協(xié)議默認(rèn)port:2425)來(lái)新建一個(gè)socket,下面代碼中指出了發(fā)送文件的核心代碼。
(2)M2M功能模塊的界面設(shè)計(jì)
M2M局域網(wǎng)通信,類似于被大家所熟知的手機(jī)QQ,由好友列表、聊天界面、文件瀏覽界面等構(gòu)成。其中,好友列表界面是這個(gè)功能的主界面,包含兩部分,頭部跟好友列表。頭部設(shè)計(jì)包括在線用戶數(shù)等信息的顯示。好友列表主要是采用Listview,然后為其添加一個(gè)UserListviewAdapter的適配器[6]。如圖4第一個(gè)界面所示。好友列表可自動(dòng)的搜索周圍其他在線用戶發(fā)送的廣播,并由發(fā)起方自動(dòng)組建與接收方的socket通信。
如圖4所示,聊天界面的布局類似于微信,頭部顯示對(duì)方的基本信息,消息列表也是同樣的有屬于自己的Adapter適配器,不同之處在于,由于對(duì)方的消息跟自己發(fā)的消息都要呈現(xiàn)在列表當(dāng)中,對(duì)方頭像與消息偏左放置,自己的消息跟頭像則偏右放置,所以需要設(shè)計(jì)兩個(gè)不同的Adapter分別實(shí)現(xiàn)各自的樣式。在最下方消息發(fā)送欄的最左邊,有一個(gè)加號(hào)的按鍵,用戶通過(guò)點(diǎn)擊此加號(hào)彈出文件瀏覽頁(yè)面,選定文件后進(jìn)行傳輸。
圖4 局域網(wǎng)M2M好友列表及聊天界面
選擇文件列表中的某一項(xiàng)文件后,當(dāng)前路徑就會(huì)在界面中顯示出來(lái),此時(shí)發(fā)送按鍵會(huì)enabled。點(diǎn)擊發(fā)送會(huì)想接收方提交發(fā)送文件請(qǐng)求,接收方檢測(cè)到文件之后,就會(huì)彈出是否確認(rèn)接收文件的對(duì)話框,對(duì)話框顯示了文件的數(shù)量、發(fā)送者的IP地址、發(fā)送者的手機(jī)型號(hào)信息。相應(yīng)的發(fā)送放的手機(jī)界面中會(huì)出現(xiàn)當(dāng)前文件的發(fā)送進(jìn)度信息,如圖5的文件瀏覽與接收。
圖5 局域網(wǎng)M2M文件瀏覽及發(fā)送進(jìn)度與接收請(qǐng)求
1.2.3 電腦端與手機(jī)端通信(P2M)
P2M通信與M2M通信原理相一致。不同之處在于,電腦服務(wù)器端是通過(guò)Java代碼實(shí)現(xiàn)的界面以及程序的編寫,與Android的java代碼編寫有一些接口程序上的不同。服務(wù)器端可以自動(dòng)的捕捉到用戶端的連接與退出,以及信息發(fā)送等等。
圖6 P2M局域網(wǎng)通信電腦端與手機(jī)端界面
圖6中分別為Java服務(wù)器端界面與Android客戶端界面??蛻舳溯斎敕?wù)器端在顯示文本框中IP地址跟端口號(hào),進(jìn)行對(duì)服務(wù)器的連接。連接成功之前用戶無(wú)法點(diǎn)擊發(fā)送按鍵,成功連入之后發(fā)送按鍵使能,用戶可以在發(fā)送框中輸入消息與服務(wù)器進(jìn)行socket通信。
測(cè)試設(shè)備:兩部Android手機(jī)(android版本為4.0以上)、一臺(tái)Win7電腦、一根USB連接線、WiFi等。
測(cè)試準(zhǔn)備:①將其中一部Android手機(jī)通過(guò)USB線連入到電腦上。②打開電腦端的Eclipse軟件,進(jìn)入Eclipse平臺(tái)的測(cè)試環(huán)境,USB將APP程序打包下載到手機(jī)測(cè)試終端并通過(guò)電腦上的LogCat以及控制臺(tái)[7]監(jiān)測(cè)到的終端運(yùn)行信息進(jìn)行如下的測(cè)試過(guò)程。
(1)點(diǎn)擊進(jìn)入M2M功能模塊。
①正常進(jìn)入后,查看好友列表界面上方是否正確顯示當(dāng)前在線用戶數(shù)等信息。之后,打開另一部Android手機(jī)中的APP,同樣進(jìn)入M2M功能界面。此時(shí),查看兩部手機(jī)的在線人數(shù)是否更新為2人。
②如果列表用戶數(shù)沒有更新,則點(diǎn)擊刷新按鍵,判斷是否實(shí)現(xiàn)更新。
③點(diǎn)擊其中某個(gè)好友,查看是否正常進(jìn)入聊天界面。
④如果正常進(jìn)入后,兩部手機(jī)互相發(fā)送消息,進(jìn)行通信功能測(cè)試。
⑤在聊天界面中,點(diǎn)擊屏幕左下角的加號(hào),查看是否成功跳轉(zhuǎn)到文件瀏覽界面。
⑥選擇某個(gè)文件,查看是否能夠完成文件傳輸功能。
(2)完成局域網(wǎng)M2M功能測(cè)試后,點(diǎn)擊進(jìn)入P2M界面。
①輸入電腦服務(wù)器顯示文本框中的IP地址跟端口號(hào),點(diǎn)擊連接,查看電腦端是否出現(xiàn)P2M通信連接成功提示。
②成功建立連接后,手機(jī)與電腦端互相發(fā)送消息,進(jìn)行通信功能的測(cè)試。
(3)完成局域網(wǎng)通信功能測(cè)試。
本文實(shí)現(xiàn)了基于Android平臺(tái)下無(wú)線局域網(wǎng)絡(luò)通信APP的設(shè)計(jì)與開發(fā)?;赥CP/IP和UDP/IP協(xié)議實(shí)現(xiàn)了P2M與M2M兩大局域網(wǎng)通信功能。
本文首先對(duì)研究?jī)?nèi)容的背景與現(xiàn)狀做出了討論,隨后介紹了在技術(shù)開發(fā)與設(shè)計(jì)當(dāng)中會(huì)用到了相關(guān)知識(shí)與技術(shù)。之后重點(diǎn)就APP的詳細(xì)設(shè)計(jì)進(jìn)行了分功能的描述,包括程序編寫以及界面設(shè)計(jì)等。在最后,進(jìn)行了系統(tǒng)的測(cè)試與結(jié)果分析,達(dá)到了最初的設(shè)計(jì)預(yù)期,并確保應(yīng)用程序的可靠性與穩(wěn)定性。主要的創(chuàng)新點(diǎn)在于:
當(dāng)多個(gè)用戶終端同處在一個(gè)局域網(wǎng)下可通過(guò)APP自動(dòng)尋找并連接周圍的其他用戶終端,實(shí)現(xiàn)多方的消息傳送或文件傳輸?;赨DP的全網(wǎng)廣播及TCP/IP協(xié)議的局域網(wǎng)通信,不僅可以智能的實(shí)現(xiàn)用戶之間自由通信,針對(duì)需要進(jìn)行登錄校園網(wǎng)等付費(fèi)熱點(diǎn)來(lái)說(shuō),還可以節(jié)省用戶的部分流量費(fèi)用。
通過(guò)WiFi無(wú)線網(wǎng)絡(luò)與局域網(wǎng)建立連接以及基于飛鴿傳書協(xié)議,實(shí)現(xiàn)與Android客戶端之間的即時(shí)通訊,包括消息發(fā)送,文件傳輸?shù)取?/p>
基于UDP/IP和TCP/IP協(xié)議以及UDP發(fā)送全網(wǎng)廣播等方法,進(jìn)一步實(shí)現(xiàn)局域網(wǎng)下PC端到Android客戶端的socket通信。