




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章網(wǎng)絡(luò)編程10.1WebView控件10.2HTTP協(xié)議及使用10.3Socket通信本章總結(jié)
10.1WebView控件10.1.1WebView概述WebView是一個基于WebKit引擎、可以在自己的應(yīng)用程序中顯示本地或Internet網(wǎng)頁的控件。那么WebView控件在Android平臺上扮演什么角色呢?相信讀者在使用某些應(yīng)用程序時經(jīng)常會遇到在程序中訪問網(wǎng)頁的需求,如果選擇調(diào)用系統(tǒng)或第三方瀏覽器,那么可能會影響用戶的體驗,此時Android中提供的WebView控件就可以很好地解決應(yīng)用程序需要展示網(wǎng)頁這一問題。借助WebView控件我們可以在自己開發(fā)的應(yīng)用程序中內(nèi)嵌一個瀏覽器,從而實現(xiàn)在應(yīng)用程序中直接展示網(wǎng)頁。
現(xiàn)在手機上常用的一些App都內(nèi)置了Web網(wǎng)頁,比如很多線上購物平臺:京東、淘寶、美團等。WebView使用靈活,當(dāng)需要更新頁面內(nèi)容時,不需要升級客戶端,只需要修改網(wǎng)頁代碼即可。尤其是一些經(jīng)常變化的頁面可以采用WebView加載網(wǎng)頁,比如淘寶經(jīng)常會有一些促銷活動,這樣Activity界面會有很大的變化,如果使用WebView顯示的話,只需修改html頁面就行,而不需要頻繁升級客戶端。
10.1.2WebView的基本使用
Webview的基本使用很簡單,下面通過一個簡單的例子來說明WebView的使用,讀者通過這個例子可以掌握WebView控件的基本使用。
注:android:usesCleartextTraffic指示應(yīng)用程序是否打算使用明文網(wǎng)絡(luò)流量,如明文HTTP。目標API級別為27或更低的應(yīng)用程序的默認值為“true”。面向API級別28或更高級別的應(yīng)用默認為“false”。當(dāng)屬性設(shè)置為“false”時,平臺組件將拒絕應(yīng)用程序使用明文流量的請求。
至此,一個簡單的利用WebView控件來顯示網(wǎng)頁的Android工程已經(jīng)完成,接下來將工程運行到手機或者模擬器上,運行效果如圖10.1所示。
圖10.1WebView加載網(wǎng)頁
10.1.3WebView子類及使用方法
Android中的Webview可以直接加載url,也可以使用html(超文本標記語言,HyperTextMarkupLanguage)文件。在具體使用中,WebView既可以像10.1.2節(jié)中所舉的實例一樣單獨使用,也可以聯(lián)合其子類一起使用。接下來簡單介紹一下Webview常見的子類及二者的聯(lián)合使用。
Webview中常用的子類有兩個:
(1)?WebViewClient:輔助WebView處理各種通知、請求等事件。
(2)?WebChromeClient:輔助WebView處理JavaScript的對話框、網(wǎng)站Title、網(wǎng)站圖標及加載進度等。
我們可以看到,在原MainActivity的基礎(chǔ)上,通過findViewById()方法獲取布局文件中增加的四個TextView控件實例。然后在代碼中通過setWebChromeClient()方法設(shè)置了WebChromeClient類,并在該類中實現(xiàn)了onReceivedTitle()方法和onProgressChanged()方法,其中onReceivedTitle()方法用來獲取訪問網(wǎng)站的標題,onProgressChanged()方法用來獲取網(wǎng)頁加載進度。
接下來通過WebView的setWebViewClient()方法設(shè)置WebViewClient類,并在該類中實現(xiàn)了onPageStarted()方法和onPageFinished()方法,其中onPageStarted()方法的作用是通知主程序網(wǎng)頁開始加載,onPageFinished()方法的作用是通知主程序網(wǎng)頁加載完畢。
最后在onKeyDown()方法中實現(xiàn)點擊返回按鈕返回WebView的上一頁,而不是退出瀏覽器。
再次運行這個新的程序,效果如圖10.2和圖10.3所示。
圖10.2WebView頁面加載中
圖10.3WebView頁面加載結(jié)束
點擊圖10.3中界面上的其他鏈接,還可以瀏覽更多網(wǎng)頁的內(nèi)容,如圖10.4所示。
圖10.4瀏覽其他網(wǎng)頁
通過上面這個例子的學(xué)習(xí),相信讀者應(yīng)該對WebView及其子類的基本用法有了一個初步認識。實際上,WebView還有許多高階的使用方法,限于篇幅,本節(jié)不再對WebView的高階使用方法進行擴展,讀者如果感興趣的話,可以在本節(jié)的基礎(chǔ)上去探索一下WebView的其他用法。
10.2HTTP協(xié)議及使用
提起HTTP協(xié)議,相信很多讀者都不陌生,因為它是Internet廣泛使用的協(xié)議,大家接觸到的幾乎所有編程語言和SDK都會支持HTTP協(xié)議,Android自然也不例外。AndroidSDK擁有強大的HTTP訪問能力?;贏ndroid的HTTP其工作原理也比較簡單:首先客戶端向服務(wù)器端發(fā)出一條HTTP請求,服務(wù)器端收到HTTP請求之后會給客戶端返回一些數(shù)據(jù);然后客戶端對這些數(shù)據(jù)進行解析和處理就可以了。
10.2.1使用HttpURLConnection類
HttpURLConnection是一種多用途、輕量級的HTTP客戶端,使用它來進行HTTP操作可以適用于大多數(shù)應(yīng)用程序。在Android應(yīng)用程序中使用HttpURLConnection訪問網(wǎng)絡(luò)一般要經(jīng)過如下步驟:
(1)創(chuàng)建一個URL對象,調(diào)用URL對象的openConnection()來獲取HttpURLConnection對象實例:
(2)設(shè)置HTTP請求所使用的方法。在HTTP中基本的請求方法有GET、POST、PUT及DELETE四種,但常用的是GET和POST方法。GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)。此處以GET方式為例,代碼如下:
conn.setRequestMethod("GET");
(3)根據(jù)應(yīng)用的需求自行設(shè)置一些方法,比如連接超時,讀取超時的毫秒數(shù)以及服務(wù)器希望得到的一些消息頭等,代碼如下:
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
(4)調(diào)用getInputStream()方法獲得服務(wù)器返回的輸入流,并對輸入流進行讀?。?/p>
InputStreaminStream=conn.getInputStream();
(5)調(diào)用disconnect()方法將HTTP連接關(guān)掉:
conn.disconnect();
注:除上述步驟外,有時可能還需要對響應(yīng)碼進行判斷。比如:
if(conn.getResponseCode()!=200){
thrownewRuntimeException("請求url失敗");
}
通過本節(jié)開頭的學(xué)習(xí),讀者知道通過conn.getInputStream()獲取到的是一個流,所以在這個示例中還需要寫一個將流轉(zhuǎn)化為二進制數(shù)組的工具類。在工程包名下,新建一個util文件夾,如圖10.5所示。
圖10.5新建util文件夾
在前面介紹menus.xml文件時提到過,要給id為tv_menu的控件添加上下文菜單功能,所以在MainActivity中,通過registerForContextMenu()方法為需要有上下文菜單的控件進行注冊,重寫上下文菜單的創(chuàng)建方法,利用MenuInflater來加載menu布局文件,利用inflate()方法填充菜單,然后當(dāng)某個上下文菜單項被選中時,就會觸發(fā)onContextItemSelected()函數(shù),根據(jù)ItemId來判斷當(dāng)前選中的是哪個Item,之后做相應(yīng)處理。在本示例中,分別開啟了兩個子線程來對選中的Item進行對應(yīng)事件處理,處理結(jié)束后通過handler傳遞信息到主線程進行相應(yīng)操作。為何此處要使用handler呢?因為Android中是不允許在子線程中直接更新UI的,所以利用handler實現(xiàn)子線程通知主線程更新UI。
最后運行程序,程序主界面如圖10.6所示。長按主界面上的TextView控件,彈出上下文菜單,如圖10.7所示。
圖10.6程序主界面圖10.7menu界面
點擊“請求圖片”,界面上會顯示出所請求的網(wǎng)頁圖片,并彈出圖片加載完畢的提示,如圖10.8所示。圖10.8加載圖片界面
點擊請求“HTML代碼”,界面會展示出HTML代碼,并彈出HTML代碼加載完畢的提示,如圖10.9所示。此外,我們在這個界面布局中使用了ScrollView控件,因此讀者可以試著在此界面上下滑動查看代碼。
圖10.9加載HTML代碼界面
10.2.2POST方式提交數(shù)據(jù)
POST方式用來向目的服務(wù)器發(fā)出請求,它向服務(wù)器提交的參數(shù)在請求后的實體中,并且參數(shù)是瀏覽器通過流的方式直接寫給服務(wù)器的,用戶不能在瀏覽器中看到向服務(wù)器提交的請求參數(shù),因此POST方式相對安全一點。接下來通過一個具體的示例演示一下POST方式提交手機客戶端的登錄信息到Web服務(wù)器。
接下來仍然需要寫一個utils工具類,將HttpURLConnection以POST方式提交數(shù)據(jù)至服務(wù)器的功能在此類中實現(xiàn)。在edu.tust.httpposttest包下新建一個util文件夾,在該文件夾下新建一個PostUtils.java類,如圖10.10所示。
圖10.10PostUtils類
這里再給讀者介紹一下查詢自己PC的ip地址的方法,首先讀者可以利用快捷鍵Windows+R輸入cmd運行,進入到DOS命令窗口下,然后輸入ipconfig命令,按回車鍵即可,具體如圖10.11所示。
圖10.11查詢個人PC的ip地址
在PostActivity中,通過點擊登錄按鈕,開啟一個子線程,在子線程中通過PostUtils工具類中的LoginByPost()方法將用戶名和登錄密碼上傳給服務(wù)器,并將服務(wù)器返回的數(shù)據(jù)賦給result,之后在子線程中利用Handler發(fā)送一個空消息通知主線程去更新UI。
至此,Android客戶端內(nèi)容已基本完成,但是由于本例演示的是服務(wù)器接受Android客戶端上傳的數(shù)據(jù),因此還需要新建一個Web工程,用以模擬服務(wù)器。這里我們使用MyEclipse10+jdk1.7.0來創(chuàng)建Web工程,讀者可以自行下載安裝使用。
在MyEclipse10平臺下,新建一個工程名為HttpWebTest的WebProject工程,然后點擊Finish按鈕,如圖10.12所示。
圖10.12新建Web工程
然后在src下新建一個名為.httpwebtest的包,在包下新建一個ServletForPost.java類,如圖10.13所示。圖10.13新建ServletForPost類
代碼的主要功能是接收Android客戶端的請求,獲取客戶端的參數(shù)、校驗客戶端提交的數(shù)據(jù)、響應(yīng)客戶端的請求并返回相應(yīng)的數(shù)據(jù)。本示例中,當(dāng)客戶端傳遞過來的用戶名為zhangsan且登錄密碼為123時,服務(wù)器返回“登錄成功”的信息,否則返回“登錄失敗”的信息。
接下來測試一下服務(wù)器是否部署成功,運行Webproject,選中創(chuàng)建的HttpWebTest項目,右鍵點擊選擇runas→MyEclipseServerApplication,在彈出的對話框中選擇任意一個都可以,點擊ok按鈕,結(jié)果如圖10.14所示。
圖10.14Webproject運行結(jié)果圖
搭建好服務(wù)器后,接下來將Android程序部署到虛擬機上,運行結(jié)果如圖10.15所示。點擊“POST方式提交”按鈕,跳轉(zhuǎn)到登錄界面,如圖10.16所示。
圖10.15工程主界面
圖10.16登錄界面
輸入用戶名為zhangsan,登錄密碼為123,點擊“登錄”按鈕,服務(wù)器返回“登錄成功”的信息,界面上彈出登錄成功的提示,如圖10.17所示。
接下來修改登錄密碼為121,用戶名不變,然后點擊“登錄”按鈕,此時服務(wù)器返回“登錄失敗”的信息,界面上彈出登錄失敗的提示,如圖10.18所示。
圖10.17登錄成功
圖10.18登錄失敗
10.2.3OKHttp的使用
除了使用HttpURLConnection訪問網(wǎng)絡(luò)以外,還可以選擇其他一些優(yōu)秀的開源網(wǎng)絡(luò)請求框架,如Volley和OKHttp,但是因為Volley是要依靠HttpClient的,而HttpClient在Android6.0中已經(jīng)被棄用,所以O(shè)KHttp成為目前比較常用的網(wǎng)絡(luò)請求框架。
首先讀者可以在OKHttp官網(wǎng)及OKHttpGitHub上了解其具體的信息,地址如下:
OKHttp官網(wǎng)地址為http://square.github.io/okhttp/。
OKHttpGitHub地址為/square/okhttp。
OKHttp具有以下優(yōu)勢:
(1)允許連接到同一個主機地址的所有請求,提高請求效率;
(2)共享Socket,減少對服務(wù)器的請求次數(shù);
(3)通過連接池,減少了請求延遲;
(4)緩存響應(yīng)數(shù)據(jù)來減少重復(fù)的網(wǎng)絡(luò)請求;
(5)減少了對數(shù)據(jù)流量的消耗。
OKHttp的功能如下:
(1)發(fā)送GET、POST等請求;
(2)實現(xiàn)文件的上傳/下載;
(3)加載圖片;
(4)支持請求回調(diào),直接返回對象、對象集合;
(5)支持session的保持。
添加成功OKHttp依賴后,項目下會自動下載兩個庫,一個是OKHttp庫,另一個是OKio庫。OKio庫是由square公司開發(fā)的,它補充了java.io和java.nio的不足,可以更加方便快速地訪問、存儲和處理數(shù)據(jù)。OKHttp底層用OKio庫作為支持。讀者可以在.idea/libraries下查看這兩個庫,如圖10.19所示。圖10.19OKHttp與OKio依賴庫
添加完OKHttp的依賴后,就可以學(xué)習(xí)OKHttp的具體使用方法。首先介紹一下OKHttp的GET請求,GET請求分為同步(較少用)和異步。異步GET請求的步驟如下:
(1)創(chuàng)建OKHttpClient的實例:
OKHttpClientokHttpClient=newOKHttpClient();
(2)創(chuàng)建一個Request對象用以發(fā)起HTTP請求:
Requestrequest=newRequest.Builder().build();
上述只是創(chuàng)建了一個空的Request對象,實際使用的話,可以在最后的build()方法之前添加其他方法來豐富此Request對象。
(3)構(gòu)建Call對象,如下所示。
Callcall=okHttpClient.newCall(request);
(4)調(diào)用Call對象的enqueue(CallBack)方法發(fā)送請求并獲取服務(wù)器返回的數(shù)據(jù)。
注:同步GET請求最后是通過call.execute()來提交訪問網(wǎng)絡(luò)請求的,這種方式會阻塞調(diào)用線程,在Android中應(yīng)放在子線程中執(zhí)行,否則有可能引起ANR(ApplicationNotResponding程序無響應(yīng)異常。Android3.0以后已經(jīng)不允許在主線程訪問網(wǎng)絡(luò)。
學(xué)習(xí)完GET的同步請求和異步請求之后,再來學(xué)習(xí)一下POST請求鍵值對和上傳文件,POST請求相比GET請求會更復(fù)雜一點,因為在構(gòu)造Request對象時,需要多構(gòu)造一個RequestBody對象,用以攜帶用戶要提交的數(shù)據(jù)。構(gòu)建RequestBody對象語句如下:
RequestBodyformBody=newFormBody.Builder()
.add("name","zhangsan")
.add("passwd","123")
.build();
構(gòu)建好對象后,要在Request.Builder中調(diào)用post()方法,同時將RequestBody對象傳入:
Requestrequest=newRequest.Builder()
.url("16:8080/HttpWebTest/ServletForPost")
.post(formBody)
.build();
上述兩步完成后,后續(xù)的操作就和前面學(xué)過的GET請求一樣了,通過Call對象的execute()方法或者enqueue方法來發(fā)送請求并獲取服務(wù)器返回的數(shù)據(jù)。
至此OKHttp的基本用法已介紹完畢,下面通過一個具體的示例來學(xué)習(xí)一下OKHttp的用法。此處我們就在上述已經(jīng)添加OKHttp依賴的OKHttpTest工程的基礎(chǔ)上進行修改,在這個工程里,我們將向讀者分別展示異步GET請求、同步GET請求、POST請求鍵值對及POST上傳文件。
在該布局文件中,添加了四個Button按鈕控件,分別用來觸發(fā)異步GET請求、同步GET請求、POST請求鍵值對及POST上傳文件這四個事件,布局界面如圖10.20所示。
圖10.20主界面布局
在MainActivity.java中,主要實現(xiàn)了四個按鈕的點擊事件,并在各自的點擊事件中,通過Intent實現(xiàn)相應(yīng)功能界面的跳轉(zhuǎn)。
接下來要實現(xiàn)四個按鈕各自對應(yīng)的功能事件。首先實現(xiàn)異步GET請求,在異步GET請求部分,從網(wǎng)絡(luò)上下載一張圖片,將圖片保存到本地,并將圖片展示在界面上。
在AsynGetActivity.java文件中,要把從網(wǎng)絡(luò)上下載的圖片保存到本機SD卡,并將圖片展示到界面上。因為涉及向SD卡存儲文件并讀取,所以在AsynGetActivity.java文件中一開始就添加了動態(tài)獲取權(quán)限的代碼。在本書的前面章節(jié)已經(jīng)介紹過動態(tài)獲取權(quán)限的內(nèi)容,大家已經(jīng)知道Android6.0之后系統(tǒng)對權(quán)限的管理更加嚴格了,不但要在AndroidManifest中添加,還要在應(yīng)用運行的時候動態(tài)申請。
獲取完動態(tài)權(quán)限后,開始實現(xiàn)異步GET請求獲取網(wǎng)絡(luò)圖片的邏輯,首先創(chuàng)建OKHttpClient的實例,接下來創(chuàng)建一個Request對象來發(fā)起一條HTTP請求,然后通過OKHttpClient的newCall()方法來創(chuàng)建Call對象,并調(diào)用它的enqueue()方法來實現(xiàn)GET的異步請求,并獲取服務(wù)器返回的數(shù)據(jù)。
獲取到圖片之后,將圖片通過byteStream()方法轉(zhuǎn)化為字節(jié)流,然后創(chuàng)建文件的FileOutputStream,將圖片要保存的路徑及命名傳到FileOutputStream中,再通過FileOutputStream的write()方法將文件寫入指定的位置,寫入完成后調(diào)用FileOutputStream的close()方法關(guān)閉流以釋放資源,否則可能會發(fā)生資源泄露的情況。至此,在本機的SD卡下已經(jīng)可以找到一個名為android.jpg的圖片文件了。
最后利用BitmapFactory的decodeFile()方法,將保存到SD卡中的圖片讀取出來并轉(zhuǎn)換成Bitmap的形式,開啟一個子線程,在子線程中用ImageView控件將獲取到的圖片展示出來。
完成上述所有步驟后,運行程序看一下效果,點擊主界面上第一個“異步GET請求”按鈕,會彈出如圖10.21所示的內(nèi)容。
如果點擊了“拒絕”按鈕,則會彈出如圖10.22所示的界面,并彈出“請求權(quán)限被拒絕”的提示,要求用戶去設(shè)置權(quán)限。
圖10.21授權(quán)界面
圖10.22請求設(shè)置權(quán)限界面
如果用戶點擊了圖10.21所示的“允許”按鈕,然后點擊AndroidStudio軟件上的DeviceFileExplorer選項卡,那么在本機的SD卡下就會找到一個名為android.jpg的文件,如圖10.23所示。
同時在程序的主界面上也會展示出從SD卡讀取出來的圖片,如圖10.24所示。圖10.23SD卡下存儲的圖片文件
圖10.24圖片展示
運行程序,點擊主界面上“同步GET請求”按鈕,跳轉(zhuǎn)到網(wǎng)頁展示界面,如圖10.25所示。圖10.25網(wǎng)頁展示界面
學(xué)習(xí)完同步和異步GET請求后,接下來學(xué)習(xí)POST方式請求鍵值對,這里我們?nèi)匀灰允謾C客戶端向Web服務(wù)器發(fā)送登錄消息為例,來學(xué)習(xí)以O(shè)KHttp的POST方式來實現(xiàn)此功能。
讀者可以看到,相較于通過HttpURLConnection的POST方式來提交數(shù)據(jù),使用OKHttp的POST方式來提交數(shù)據(jù)明顯更加簡單高效。PostKvActivity中的代碼很簡單,讀者只需注意將url中的ip地址改為自己本機的ip,本機ip地址的查詢方法在10.2.2小節(jié)已經(jīng)介紹過了,此處不再贅述。
然后Web服務(wù)器此處依然使用10.2.2節(jié)所建的HttpWebTest工程即可,運行Web服務(wù)器。
以上步驟都完成之后,運行程序,程序運行成功進入主界面后,點擊第三個“POST請求鍵值對”按鈕,會出現(xiàn)如圖10.26所示的界面,其中{LoginInfo=登錄成功}是服務(wù)器返回來的數(shù)據(jù)。
圖10.26登錄請求成功
接下來實現(xiàn)主界面第四個按鈕要觸發(fā)的功能,即POST上傳文件。新建一個activity_post_up_load.xml布局文件,布局文件僅用來展示訪問網(wǎng)絡(luò)結(jié)果的提示,所以并不需要其他控件,此處僅使用一個線性布局的文件即可。
讀者可以看到,PostUpLoadActivity.java文件中的代碼和POST方式請求登錄的內(nèi)容基本一樣,只是多了一個MediaType,用來設(shè)置上傳文件類型,然后url寫的是搜狗的地址,其實讀者可以想到,單純地向搜狗首頁上傳文件結(jié)果肯定是失敗的,此處僅用于演示,如果讀者感興趣,可以嘗試寫個服務(wù)器或者用第三方服務(wù)器來實現(xiàn)上傳文件的功能。
完成上述內(nèi)容后,運行程序,在主界面點擊第四個功能按鈕,然后跳轉(zhuǎn)的界面會顯示出如圖10.27所示的提示內(nèi)容,表明上傳失敗。
圖10.27上傳失敗
10.3Socket通信
10.3.1Socket簡介Socket即套接字,是支持TCP、UDP等協(xié)議的網(wǎng)絡(luò)通信的基本操作單元,表現(xiàn)為一個封裝了協(xié)議族的編程接口(API),Socket實質(zhì)上提供了進程通信的端點。進程通信之前,雙方首先必須各自創(chuàng)建一個端口,否則是沒有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一個話機和一個電話號碼。
接下來了解一下Socket連接的建立。建立Socket連接至少需要一對套接字,其中一個運行于客戶端(ClientSocket),另一個運行于服務(wù)器端(ServerSocket)。套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認。
(1)服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。
(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。
(3)連接確認:是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
圖10.28為建立Socket連接的簡單流程圖。
圖10.28建立Socket連接的簡單流程圖
注:(1)Socket不是一種協(xié)議,只是一個編程調(diào)用接口(API),屬于傳輸層,即通過Socket,才能在Android平臺上通過TCP/IP協(xié)議進行開發(fā)。
(2)對用戶來說,只需調(diào)用Socket去組織數(shù)據(jù),以符合指定的協(xié)議即可通信。
10.3.2Socket與HTTP對比
Socket實現(xiàn)服務(wù)器與客戶端之間的物理連接,并進行數(shù)據(jù)傳輸,處于網(wǎng)絡(luò)協(xié)議的傳輸層,解決的是數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸?shù)膯栴}。Socket采用服務(wù)器主動發(fā)送數(shù)據(jù)的方式:即建立網(wǎng)絡(luò)連接后,服務(wù)器可主動發(fā)送消息給客戶端,而不需要由客戶端向服務(wù)器發(fā)送請求,可理解為服務(wù)器端有需要才進行通信。其適用于網(wǎng)絡(luò)游戲、銀行交互、支付等場景。
Socket的優(yōu)點:
(1)傳輸數(shù)據(jù)為字節(jié)級,傳輸數(shù)據(jù)可自定義,數(shù)據(jù)量小;
(2)傳輸數(shù)據(jù)時間短,性能高;
(3)適合C/S之間信息實時交互;
(4)可以加密,數(shù)據(jù)安全性高。
Socket的缺點:
(1)需要對傳輸?shù)臄?shù)據(jù)進行解析,轉(zhuǎn)化為應(yīng)用級的數(shù)據(jù);
(2)對開發(fā)人員的開發(fā)水平要求高;
(3)相對于Http協(xié)議傳輸,增加了開發(fā)量。
HTTP協(xié)議屬于應(yīng)用層,解決的是如何包裝數(shù)據(jù)。HTTP采用請求—響應(yīng)方式,即建立網(wǎng)絡(luò)連接后,當(dāng)客戶端向服務(wù)器發(fā)送請求后,服務(wù)器端才能向客戶端返回數(shù)據(jù),可理解為是客戶端有需要才進行通信。其適用于公司OA服務(wù)、互聯(lián)網(wǎng)服務(wù)等場景。
HTTP的優(yōu)點:
(1)基于應(yīng)用級的接口使用方便;
(2)要求的開發(fā)水平不高,容錯性強。
HTTP缺點:
(1)傳輸速度慢,數(shù)據(jù)包大;
(2)若要實現(xiàn)實時交互,服務(wù)器性能壓力大;
(3)數(shù)據(jù)傳輸安全性差。
10.3.3Socket通信示例
Socket通信的一般步驟如下:
(1)創(chuàng)建Socket和ServerSocket;
(2)打開連接到Socket的輸入/輸出流;
(3)按照相應(yīng)的協(xié)議對Socket進行讀/寫操作;
(4)關(guān)閉輸入/輸出流,關(guān)閉Socket。
Socket可以基于TCP或者UDP協(xié)議。本節(jié)Socket通信示例將基于TCP協(xié)議來實現(xiàn)?;赥CP協(xié)議的Socket通信的步驟如下(分為客戶端和服務(wù)器)。
客戶端:
(1)創(chuàng)建Socket,需要指明服務(wù)器的IP地址和端口號;
(2)建立連接后,通過輸出流向服務(wù)器發(fā)送數(shù)據(jù),通過輸入流讀取服務(wù)器的響應(yīng)信息;
(3)關(guān)閉輸入輸出流,關(guān)閉Socket。
服務(wù)器:
(1)創(chuàng)建ServerSocket,綁定一個監(jiān)聽端口;
(2)通過accept()方法監(jiān)聽客戶端請求;
(3)建立連接后,通過輸入流讀取客戶端數(shù)據(jù),通過輸出流向客戶端發(fā)送數(shù)據(jù);
(4)關(guān)閉輸入/輸出流,關(guān)閉Socket。
布局文件中有EditText、Button及TextView三個控件,其中EditTe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買賣名酒合同范本
- 二年級口算題目匯編100道
- 二年級口算題集100道20以內(nèi)
- 三年級口算題全集1000道
- 2025年河北省安全員B證考試題庫
- 上海財務(wù)記賬報稅合同范本
- 農(nóng)村集體租賃合同范本
- 賣酒供貨合同范本
- 主播釣魚合同范例
- 廠子上班合同范本
- 《物理化學(xué)》電子教案(上冊)(共84頁)
- berg平衡評定量表
- EPC總承包項目財務(wù)管理要點
- 一年級下學(xué)期開學(xué)家長會
- 中國控制會議論文模板英文
- 機器人技術(shù) 第一章緒論
- 前廳羅盤系統(tǒng)操作細則
- 2_甲基丙烯酰氧基乙基磷酰膽堿共聚物應(yīng)用研究進展
- 迅達扶梯9300AE故障代碼
- 乒乓球--社團活動記錄表(共20頁)
- 《各種各樣的橋》ppt課件
評論
0/150
提交評論