




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章Android網(wǎng)絡(luò)編程TCP/IP基礎(chǔ)HTTP編程調(diào)用Web服務(wù)補(bǔ)充:socket編程11.1
TCP/IP基礎(chǔ)TCP:Transmission
Control
Protocol
傳輸控制協(xié)議IP:Internet
Protocol
因特網(wǎng)互聯(lián)協(xié)議TCP/IP協(xié)議定義了電子設(shè)備如何連入Internet,以及數(shù)據(jù)如何在它們之間進(jìn)行傳輸?shù)臉?biāo)準(zhǔn)。TCP/IP協(xié)議是Internet最基本的協(xié)議,也是Internet的基礎(chǔ)。TCP/IP協(xié)議不只是TCP和IP這兩個(gè)協(xié)議,而是指整個(gè)TCP/IP協(xié)議族TCP/IP網(wǎng)絡(luò)層次結(jié)構(gòu)這里的英文縮寫(xiě)都是TCP/IP協(xié)議族的一員Socket編程和HTTP編程Socket編程HTTP編程(物理層)Socket概念網(wǎng)絡(luò)上的兩個(gè)應(yīng)用程序之間的通信是分層進(jìn)行的,socket是應(yīng)用程序進(jìn)行網(wǎng)絡(luò)通信的接口。Socket=主機(jī)地址+端口號(hào)關(guān)于端口號(hào)如果要發(fā)起網(wǎng)絡(luò)連接,不僅需要知道遠(yuǎn)程機(jī)器的地址或名字。而且,還需要一個(gè)端口號(hào)。客戶(hù)端和服務(wù)器必須事先約定所使 用的端口,如果系統(tǒng)兩部分所使用的端口不一致,那就不能進(jìn) 行通信。 TCP/IP系統(tǒng)中的端口號(hào)是一個(gè)16位的數(shù)字,它的范圍是0~65535。實(shí)際上,小于1024的端口號(hào)保留給預(yù)定義的服務(wù)。Socket=主機(jī)地址+端口號(hào)HTTP概念HTTP:HyperText
Transfer
Protocol
超文本傳輸協(xié)議HTTP協(xié)議是互聯(lián)網(wǎng)上應(yīng)用最多、最為廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是一種是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。HTTP通信—HttpHTTP通信—HttpHttp采用請(qǐng)求/響應(yīng)模型客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求請(qǐng)求內(nèi)容包含:請(qǐng)求的方法、URL、協(xié)議版本、請(qǐng)求修飾符、客 戶(hù)信息和內(nèi)容的消息結(jié)構(gòu)服務(wù)器端以一個(gè)狀態(tài)行作為響應(yīng)響應(yīng)的內(nèi)容包括消息協(xié)議的版本、成功或者錯(cuò)誤編碼、服務(wù)器信 息、實(shí)體元信息以及可能的實(shí)體內(nèi)容最顯著的特點(diǎn)客戶(hù)端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng)請(qǐng)求結(jié)束后會(huì)主動(dòng)釋放連接8HTTP通信—Http請(qǐng)求格式http請(qǐng)求格式[":"port][abs_path]http使用http作為通訊協(xié)議以定位網(wǎng)絡(luò)資源host合法的Internet主機(jī)域名或者IP地址端口指定訪(fǎng)問(wèn)的主機(jī)端口號(hào)默認(rèn)為80訪(fǎng)問(wèn)地址指定訪(fǎng)問(wèn)的主機(jī)資源URI9HTTP通信—Http的請(qǐng)求方法http的請(qǐng)求方法GET請(qǐng)求獲取Request-URI
所標(biāo)識(shí)的資源;POST在Request-URI
所標(biāo)識(shí)的資源后附加新的數(shù)據(jù);HEAD請(qǐng)求獲取由Request-URI
所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭PUT請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI
作為其標(biāo)識(shí)DELETE請(qǐng)求服務(wù)器刪除Request-URI
所標(biāo)識(shí)的資源;TRACE請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷CONNECT保留將來(lái)使用OPTIONS請(qǐng)求查詢(xún)服務(wù)器的性能,或者查詢(xún)與資源相關(guān)的選項(xiàng)和需求10HTTP通信—Http協(xié)議請(qǐng)求方法應(yīng)用舉例:–
GET方法–
POST方法
GET
Host:
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,*/*;q=0.8
POST
/inventory-check.cgi
HTTP/1.1
Host:
Content-Type:
text/plain
Content-length:
18
item=bandsaw
2647HTTP通信—Http響應(yīng)HTTP響應(yīng)也是由三個(gè)部分組成:狀態(tài)行、消息報(bào)頭、響應(yīng)正文,一并發(fā)給客戶(hù)端,狀態(tài)行中包括狀態(tài)碼:1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理2xx:成功--表示請(qǐng)求已被成功接收、理解、接受3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作4xx:客戶(hù)端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求HTTP通信—Http常見(jiàn)狀態(tài)碼描述常見(jiàn)狀態(tài)代碼、狀態(tài)描述、說(shuō)明:200
OK//客戶(hù)端請(qǐng)求成功400
Bad
Request//客戶(hù)端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解401Unauthorized//請(qǐng)求,這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)//頭域一起使用403Forbidden//服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)404
Not
Found//請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL500
Internal
Server
Error//服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤503ServerUnavailable//服務(wù)器當(dāng)前不能處理客戶(hù)端的請(qǐng)求,一段時(shí)間后,//可能恢復(fù)正常eg:HTTP/1.1
200
OK
(CRLF)HTTP通信—Http響應(yīng)應(yīng)用舉例:GET響應(yīng)
HTTP/1.1
200
OK
Server:Apache
Tomcat/5.0.12
Date:Mon,6Oct2003
13:23:42
GMT
Content-Length:112
<html><head>
<title>HTTP響應(yīng)示例<title>
</head>
<body>
Hello
HTTP!
</body>
</html>HTTP的POST和GET兩種命令模式POST是被設(shè)計(jì)用來(lái)向上放東西的,而GET是被設(shè)計(jì)用來(lái)從服務(wù)器取東西的,GET也能夠向服務(wù)器傳送較少的數(shù)據(jù)。GET的數(shù)據(jù)是在HTTP
的頭部傳送的,而Post的數(shù)據(jù)則是在HTTP請(qǐng)求的內(nèi)容里傳送。POST傳輸數(shù)據(jù)時(shí),不需要在URL中顯示出來(lái),而GET方法要在URL中顯示。GET方法由于受到URL長(zhǎng)度的限制,只能傳遞大約1024字節(jié);
POST傳輸?shù)臄?shù)據(jù)量大,可以達(dá)到2M。HTTP
GET示例<html><body><form
action="login.jsp"
method="get"
>用戶(hù)名:<input
type="text"name="username"><br>密碼:<input
type="password"name="psd"maxlength=6><br><input
type="submit"
value="提交"><input
type="reset"
value="重填"></form></body></html>跳轉(zhuǎn)到數(shù)據(jù)處理頁(yè)面(html/jsp/aspx/php…)get方法提交數(shù)據(jù)會(huì)在URL中顯示注意要用name屬性才能在地址欄中顯示頁(yè)面和參數(shù)之間用?連接參數(shù)之間用&連接【返回】11.2
HTTP編程越來(lái)越多的
Java應(yīng)用程序需要直接通過(guò)
HTTP
協(xié)議來(lái)訪(fǎng)問(wèn)網(wǎng)絡(luò)資源。在
JDK
的 包中已經(jīng)提供了訪(fǎng)問(wèn)
HTTP
協(xié)議的基本功能:HttpURLConnection。但是對(duì)于大部分應(yīng)用程序來(lái)說(shuō),JDK
庫(kù)本身提供的功能還不夠豐富和靈活。除此之外,在Android系統(tǒng)中,Android
SDK集成了Apache的HttpClient模塊,用來(lái)提供高效的、功能豐富的支持HTTP協(xié)議工具包,并且它支持HTTP
協(xié)議最新的版本和建議。使用
HttpClient可以快速開(kāi)發(fā)出功能強(qiáng)大的HTTP
程序。HTTP編程2種方法HttpURLConnection編程HttpClient編程【返回】1.
HttpURLConnection編程(以Post為例)提交登錄數(shù)據(jù)給Web服務(wù)器網(wǎng)站將結(jié)果反饋給Android客戶(hù)端HttpURLConnection主要步驟(以Post為例)創(chuàng)建URL對(duì)象:String
httpUrl="http格式的url地址串";//此處不帶參數(shù)URL
url
=
new
URL(httpUrl);通過(guò)HttpURLConnection創(chuàng)建連接對(duì)象:HttpURLConnection
conn
=(HttpURLConnection)
url.openConnection();需要強(qiáng)制轉(zhuǎn)換一下HttpURLConnection主要步驟(以Post為例)3)設(shè)置連接的幾個(gè)重要屬性:conn.setConnectTimeout(5000);
//設(shè)置連接超時(shí)時(shí)間,如5秒conn.setRequestMethod("POST");
//使用POST的方式conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);//允許輸出輸入//允許輸入//post方式最好不使用緩存conn.setRequestProperty("Charset","UTF-8");
//設(shè)置編碼字符集UTF-8
編碼用在網(wǎng)頁(yè)上可以在同一頁(yè)面顯示中文簡(jiǎn)體繁體及其它語(yǔ)言(如日文,韓文)HttpURLConnection主要步驟(以Post為例)4)準(zhǔn)備傳送的數(shù)據(jù),例如:String
datastr="username="+URLEncoder.encode("wust",
"utf-8")+"&psd="+URLEncoder.encode("123",
"utf-8");byte
[]
data=datastr.getBytes();將字符串編碼為utf-8格式將字符串轉(zhuǎn)化為適合物理層傳輸?shù)淖止?jié)流到時(shí)候這些值來(lái)自于文本框的輸入HttpURLConnection主要步驟(以Post為例)5)傳送數(shù)據(jù)給服務(wù)器:以流的方式DataOutputStream
outputStream
=new
DataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();outputStream.close();//刷新//關(guān)閉這里的操作都是Java標(biāo)準(zhǔn)的的I/OHttpURLConnection主要步驟(以Post為例)6)接收服務(wù)器響應(yīng)數(shù)據(jù):以流的方式BufferedReader
reader
=
new
BufferedReader(newInputStreamReader(conn.getInputStream()));String
resultData="";
//存放從服務(wù)器返回的信息String
line=null;while((line=reader.readLine())!=null){ //使用循環(huán)體來(lái)獲得數(shù)據(jù)
resultData+=line+"\n";}reader.close();
//關(guān)閉這里的操作都是Java標(biāo)準(zhǔn)的的I/OAndroid客戶(hù)端可以用一個(gè)
TextView顯示一下resultData第6步之前可加一個(gè)判斷請(qǐng)求是否成功處理:int
reponseCode
=conn.getResponseCode();if(response==HttpURLConnection.HTTP_OK){第6步代碼}(1)服務(wù)器端的準(zhǔn)備MyEclipse中創(chuàng)建一個(gè)Web工程,命名為了“MyServer”。兩個(gè)JSP網(wǎng)頁(yè):index.jsp和login.jspMyEclipse下載地址:index.jsp主要代碼<%@
page
language="java"
import="java.util.*"
pageEncoding="utf-8"%><body><form
action="login.jsp" method="post"
>用戶(hù)名:<input
type="text"name="username"><br>密碼:<input
type="password"name="psd"
maxlength=6><br><input
type="submit"
value="提交"><input
type="reset"
value="重填"></form></body>提醒:(1)將jsp文件保存為utf-8格式(2)將頁(yè)面pageEncoding改為="utf-8"改成get,看看瀏覽器地址欄區(qū)別附:如何將文件保存為utf-8jsp文件右鍵->Propertylogin.jsp主要代碼<%@
page
language="java"
import="java.util.*"
pageEncoding="utf-8"%><body><%String
username=request.getParameter("username");String
psd=request.getParameter("psd");if(username.equals("wust")&&psd.equals("123")){out.print("登錄成功!歡迎"+username);}else{out.print("登錄失??!");}%></body>運(yùn)行網(wǎng)站index.jsp網(wǎng)站地址:其中指本地機(jī),一般用來(lái)測(cè)試使用,也可用localhost代替8080:Web服務(wù)器端口號(hào)login.jsp(2)
Android客戶(hù)端準(zhǔn)備工作:此將指定給自己很重要AndroidManifest.xml中添加訪(fǎng)問(wèn)權(quán)限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推薦在主線(xiàn)程中使用HttpURLConnection(不安全),因此如要強(qiáng)制使用,則需在onCreate中添加代碼:StrictMode.ThreadPolicy
policy
=
newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模擬器已
這兩句需要
android:minSdkVersion="9"
配合
了,因
要訪(fǎng)問(wèn)本機(jī)的服務(wù)器,用它設(shè)定的另一個(gè)地址:主界面<LinearLayout
xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"
><EditTextandroid:id="@+id/editText1"android:hint="請(qǐng)輸入用戶(hù)名"android:layout_width="match_parent"android:layout_height="wrap_content"
><requestFocus
/></EditText><EditTextandroid:id="@+id/editText2"android:hint="請(qǐng)輸入密碼"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/button1"android:layout_width="110dp"android:layout_height="wrap_content"android:layout_gravity="right"android:text="登錄"/><TextViewandroid:id="@+id/textView1"android:textSize="10px"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="結(jié)果"/></LinearLayout>注:用戶(hù)名和密碼的textview定義略MainActivity主要代碼protected
void
onCreate(Bundle
savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在主線(xiàn)程中強(qiáng)制使用子線(xiàn)程
StrictMode.ThreadPolicy
policy=newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);Buttonbt=(Button)findViewById(R.id.button1);bt.setOnClickListener(new
View.OnClickListener()
{@Overridepublic
void
onClick(View
v)
{String
httpUrl="
";URL
url=null;try
{url
=
newURL(httpUrl);}catch
(MalformedURLException
e1){
Toast.makeText(getApplicationContext(),"無(wú)法創(chuàng)建URL",Toast.LENGTH_SHORT).show();}創(chuàng)建URL對(duì)象(需要try/catch)注意服務(wù)器地址為:8080MainActivity主要代碼(續(xù))if(url!=null){HttpURLConnection
conn;try
{conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(3000);conn.setRequestMethod("POST");//設(shè)置連接超時(shí)時(shí)間//Post方式conn.setDoOutput(true);//設(shè)置能輸出
conn.setDoInput(true);//設(shè)置能輸入
conn.setUseCaches(false);//不使用緩存conn.setRequestProperty("Charset","UTF-8");
//設(shè)置uft-8字符集創(chuàng)建連接對(duì)象
并設(shè)置相關(guān)屬性I/O操作也要try/catchMainActivity主要代碼(續(xù))//準(zhǔn)備要傳送給服務(wù)器的數(shù)據(jù)String
username
=
((EditText)findViewById(R.id.editText1)
).getText().toString();String
password
=
((EditText)findViewById(R.id.editText2)
).getText().toString();String
datastr="username="+URLEncoder.encode(username,
"utf-8")+"&psd="+URLEncoder.encode(password
,
"utf-8");byte
[]
data=datastr.getBytes();準(zhǔn)備要傳送的數(shù)據(jù)MainActivity主要代碼(續(xù))//向服務(wù)器發(fā)送數(shù)據(jù)DataOutputStream
outputStream=newDataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();
//刷新outputStream.close();
//關(guān)閉//接收服務(wù)器返回的信息BufferedReader
reader
=
new
BufferedReader(newInputStreamReader(conn.getInputStream()));String
resultData
=
"";String
line=null;//使用循環(huán)體來(lái)獲得數(shù)據(jù)while((line
=
reader.readLine())!=null){resultData
+=
line
+
"\n";}reader.close();//關(guān)閉發(fā)送數(shù)據(jù)給服務(wù)器接收服務(wù)器返回的信息服務(wù)器返回的信息存放在resultData變量中MainActivity主要代碼//用一個(gè)TextView來(lái)顯示數(shù)據(jù)TextView
tv=
(TextView)findViewById(R.id.textView1);f(!resultData.equals("")){tv.setText(resultData);}else{tv.setText("讀取的內(nèi)容為null");}}catch
(IOException
e)
{e.printStackTrace();Toast.makeText(getApplicationContext(),"出錯(cuò)了!",Toast.LENGTH_SHORT).show();}}
//endif(url!=null)} //endtry});
//endonclick}
//endoncreate顯示服務(wù)器返回的信息運(yùn)行情況先確認(rèn)網(wǎng)站已啟動(dòng)(Web服務(wù)器)然后再運(yùn)行Android客戶(hù)端2.
HttpClient編程提交登錄數(shù)據(jù)給Web服務(wù)器網(wǎng)站將結(jié)果反饋給Android客戶(hù)端服務(wù)器端不變HttpClient主要步驟(以Post為例)1)創(chuàng)建HttpClient實(shí)例:HttpClient
httpClient
=
new
DefaultHttpClient();2)創(chuàng)建HttpPost請(qǐng)求對(duì)象:String
httpUrl="http格式的url地址串";//此處不帶參數(shù)HttpPost
httpPost
=
new
HttpPost(httpUrl);HttpClient主要步驟(以Post為例)3)設(shè)置需要傳遞的參數(shù)://(1)創(chuàng)建參數(shù)ArrayList<NameValuePair>
params
=
new
ArrayList<NameValuePair>();params.add(new
BasicNameValuePair("username",
"wustzz"));params.add(new
BasicNameValuePair("psd",
"123456"));//(2)對(duì)參數(shù)進(jìn)行utf-8編碼UrlEncodedFormEntity
entity
=
new
UrlEncodedFormEntity(params,
"utf-8");//(3)將編碼的參數(shù)設(shè)置給HttpPost對(duì)象
httpPost.setEntity(entity);參數(shù)名參數(shù)值HttpClient主要步驟(以Post為例)發(fā)出POST請(qǐng)求并獲取服務(wù)器反饋:HttpResponse
response
=
httpClient.execute(httpPost);獲取服務(wù)器返回的內(nèi)容:String
result="";//判斷請(qǐng)求是否成功處理if
(response.getStatusLine().getStatusCode()
==
HttpStatus.SC_OK)
{//獲取返回的內(nèi)容result
=
EntityUtils.toString(response.getEntity(),
"utf-8");}使用EntityUtils工具將Entity轉(zhuǎn)換為uft-8編碼的字符串HttpClient主要步驟(以Post為例)6)關(guān)閉HttpClient以確保釋放所有占用的系統(tǒng)資源:httpClient.getConnectionManager().shutdown();Android客戶(hù)端準(zhǔn)備工作:AndroidManifest.xml中添加訪(fǎng)問(wèn)權(quán)限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推薦在主線(xiàn)程中使用HttpURLConnection(不安全),因此如要強(qiáng)制使用,則需在onCreate中添加代碼:StrictMode.ThreadPolicy
policy
=
newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模擬器已將指定給自己了,因此要訪(fǎng)問(wèn)本機(jī)的服務(wù)器,用它設(shè)定的另一個(gè)地址:很重要這兩句需要android:minSdkVersion="9"
配合服務(wù)器端沒(méi)有變化,因此只需設(shè)計(jì)Android客戶(hù)端代碼MainActivity主要代碼protected
void
onCreate(Bundle
savedInstanceState)
{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StrictMode.ThreadPolicy
policy
=
newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);Button
bt=(Button)findViewById(R.id.button1);bt.setOnClickListener(new
View.OnClickListener()
{@Overridepublic
void
onClick(View
v)
{MainActivity主要代碼(續(xù))HttpClient
httpClient=new
DefaultHttpClient();String
httpUrl=""; //此處不帶參數(shù)HttpPost
httpPost
=
new
HttpPost(httpUrl);//(1)創(chuàng)建參數(shù)String
username
=
((EditText)findViewById(R.id.editText1)
).getText().toString();String
password
=
((EditText)findViewById(R.id.editText2)
).getText().toString();ArrayList<NameValuePair>params
=
new
ArrayList<NameValuePair>();params.add(new
BasicNameValuePair("username",
username));params.add(new
BasicNameValuePair("psd",
password));try{//(2)對(duì)參數(shù)進(jìn)行URL編碼UrlEncodedFormEntity
entity
=
new
UrlEncodedFormEntity(params,
"utf-8");//(3)將編碼的參數(shù)設(shè)置給HttpPost對(duì)象
httpPost.setEntity(entity);MainActivity主要代碼(續(xù))HttpResponse
response
=
httpClient.execute(httpPost);String
result="";if
(response.getStatusLine().getStatusCode()
==
HttpStatus.SC_OK)
{result=EntityUtils.toString(response.getEntity(),"utf-8");//獲取返回的內(nèi)容}else{ result
="讀取的內(nèi)容為null";
}TextViewtv=(TextView)findViewById(R.id.textView1);tv.setText(result
);}catch(Exception
e){e.printStackTrace();Toast.makeText(getBaseContext(),"出錯(cuò)了!",Toast.LENGTH_SHORT).show();}httpClient.getConnectionManager().shutdown();//關(guān)閉HttpClient}});}運(yùn)行情況同前例11.3
調(diào)用Web服務(wù)什么是Web服務(wù)(WebService)?Web服務(wù)是一個(gè)平臺(tái)獨(dú)立的,松耦合的,基于可編程的web的應(yīng)用程序,可使用開(kāi)放的XML標(biāo)準(zhǔn)來(lái)描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開(kāi)發(fā)分布式的互操作的應(yīng)用程序。理解Web服務(wù)簡(jiǎn)單的理解:Web服務(wù)是遠(yuǎn)程的某個(gè)服務(wù)器對(duì)外公開(kāi)的某種功能或方法, 通過(guò)調(diào)用該服務(wù)以獲得我們需要的信息。例如:某個(gè)網(wǎng)站對(duì)外公開(kāi)了手機(jī)號(hào)碼歸屬地查詢(xún)服務(wù),我們 只需要在調(diào)用該服務(wù)時(shí)傳入一個(gè)手機(jī)號(hào),就能立即獲取該號(hào) 段的歸屬地信息。理解Web服務(wù)(續(xù))更通俗的理解:通過(guò)使用Web服務(wù),我們能夠像調(diào)用本地方法一樣去調(diào)用遠(yuǎn) 程服務(wù)器上的方法。我們不需要關(guān)心遠(yuǎn)程的方法是Java寫(xiě)的,還是PHP或C#寫(xiě) 的;我們也不需要關(guān)心遠(yuǎn)程的方法是基于Unix平臺(tái),還是
Windows平臺(tái),這就是Web服務(wù)平臺(tái)和語(yǔ)言無(wú)關(guān)性。Web服務(wù)示例
一些web服務(wù)列表Web服務(wù)示例(續(xù))國(guó)內(nèi)手機(jī)號(hào)碼歸屬地查詢(xún)WEB
服務(wù),提供最新的國(guó)內(nèi)手機(jī)號(hào)碼段歸屬地?cái)?shù)據(jù),每月更新。調(diào)用手機(jī)號(hào)碼歸屬地查詢(xún)Web服務(wù)編程調(diào)用Web服務(wù)示例手機(jī)號(hào)碼歸屬地查詢(xún)(HttpClient編程)
【完】補(bǔ)充SocketSocket套接字用于描述IP地址和端口,是通信鏈的句柄應(yīng)用程序通過(guò)Socket發(fā)出網(wǎng)絡(luò)請(qǐng)求或應(yīng)答網(wǎng)絡(luò)請(qǐng)求應(yīng)用程序與TCP/IP協(xié)議進(jìn)行交互的接口Socket的優(yōu)點(diǎn)服務(wù)器端與客戶(hù)端可以互相主動(dòng)發(fā)送數(shù)據(jù)保持客戶(hù)端與服務(wù)器端數(shù)據(jù)的實(shí)時(shí)與同步與http相比http在請(qǐng)求結(jié)束時(shí)主動(dòng)釋放連接56Socket(1)Socket通信必須包含的5種信息連接使用的協(xié)議(TCP/UDP)本地主機(jī)的IP地址本地進(jìn)程的協(xié)議端口遠(yuǎn)程主機(jī)的IP地址遠(yuǎn)程進(jìn)程的協(xié)議端口Socket的傳輸模式面向連接的傳輸無(wú)連接的傳輸57Socket(2)面向連接的Socket操作使用TCP協(xié)議連接必須在發(fā)送數(shù)據(jù)之前建立好并保持穩(wěn)定數(shù)據(jù)到達(dá)順序是固定的連接建立后可以使用流接口進(jìn)行打開(kāi)、讀、寫(xiě)、關(guān)閉操作所有發(fā)送的信息都會(huì)在另一端以同樣的順序被接受無(wú)連接的Socket操作使用UDP協(xié)議不保證發(fā)出數(shù)據(jù)的達(dá)到不保證發(fā)出數(shù)據(jù)按照發(fā)出順序達(dá)到目的地面向連接的操作比無(wú)連接操的效率低,數(shù)據(jù)的安全 性高58Socket(4)Socket構(gòu)造Java在包中提供了兩個(gè)類(lèi)Socket和ServerSocket分別用來(lái)表示雙向連接的客戶(hù)端和服務(wù)端每一個(gè)端口提供一種特定的服務(wù)需要給出正確的端口,才能獲得相應(yīng)的服務(wù)0-1023的端口為系統(tǒng)保留在選擇端口時(shí)最好選擇大于1023端口,以防止放生 沖突建立SOCKET連接至少需要一對(duì)套接字其中一個(gè)運(yùn)行于客戶(hù)端,稱(chēng)為ClientSocket另一個(gè)運(yùn)行于服務(wù)器端,稱(chēng)為ServerSocket59Android
套接字編程實(shí)例—SocketDemo創(chuàng)建Socket的方法:操作Socket的方法
InputStream
getInputStream()
OutputStream
getOutputStream()
void
close()
Socket(InetAddress
remoteAddress,int
remotePort)Socket(5)Socket和ServerSocket類(lèi)Socket(InetAddress
address,
int
port);Socket(InetAddress
address,
int
port,
boolean
stream);Socket(String
host,
int
port);Socket(String
host,
int
port
,
boolean
stream);Socket(SocketImpl
impl);Socket(String
host,
int
port,
InetAddress
localAddr,
int localPort);Socket(InetAddress
address,
int
port
,
InetAddress
localAddr, int
localPort);ServerSocket(int
port);ServerSocket(int
port,
int
backlog);ServerSocket(int
port
,
int
backlog,
InetAddress
bindAddr);62Socket(6)參數(shù)含義address:雙相連接中另一方的IP地址host:雙相連接中另一方的主機(jī)名port
:雙相連接中另一方的端口號(hào)stream
:指明Socket是流Socket還是數(shù)據(jù)報(bào)SocketlocalPort
:表示本地主機(jī)的端口號(hào)localAddr
:本地機(jī)器的地址(ServerSocket的主機(jī)地址)bindAddr
:本地機(jī)器的地址(ServerSocket的主機(jī)地址)Impl
:Socket的父類(lèi)可以用來(lái)創(chuàng)建ServerSocket或者可以用來(lái)創(chuàng)建Socket63Socket(7)常用的構(gòu)造函數(shù)Socket(InetAddress
addr,
int
port)Socket(String
host,
int
port)創(chuàng)建基于Socket的連接服務(wù)器端的流套接字創(chuàng)建時(shí)的異常創(chuàng)建Socket如果發(fā)生錯(cuò)誤產(chǎn)生異常IOException程序中必須進(jìn)行處理創(chuàng)建時(shí)必須捕獲或拋出異常創(chuàng)建Socket和ServerSocket都
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品推廣方案范文5篇
- 代購(gòu)合同書(shū)【5篇】
- 2025簡(jiǎn)約家居裝修設(shè)計(jì)合同
- 學(xué)校支教工作總結(jié)【10篇】
- 獸藥欠賬銷(xiāo)售合同標(biāo)準(zhǔn)文本
- 保安工作計(jì)劃文化藝術(shù)圖書(shū)館部門(mén)
- 確保工作質(zhì)量的年度計(jì)劃
- 公司借款購(gòu)車(chē)合同標(biāo)準(zhǔn)文本
- 農(nóng)業(yè)機(jī)具投放合同標(biāo)準(zhǔn)文本
- 二人合伙合同標(biāo)準(zhǔn)文本
- 生活中的魔法數(shù)學(xué)名師公開(kāi)課獲獎(jiǎng)?wù)n件百校聯(lián)賽一等獎(jiǎng)?wù)n件
- 2024年同等學(xué)力申碩英語(yǔ)考試真題
- 陳傳明《管理學(xué)原理》(第2版)筆記考點(diǎn)課后答案
- 臨床醫(yī)學(xué)檢驗(yàn)試題及答案
- 《阿凡達(dá)》電影賞析
- 山東大學(xué)生物化學(xué)核酸-01
- 2023年人教版中考物理復(fù)習(xí)全冊(cè)教案
- 2023年江蘇省中考語(yǔ)文現(xiàn)代文閱讀之記敘文閱讀9篇
- 員工積分制管理實(shí)施方案細(xì)則
- 水利水電樞紐工程畢業(yè)設(shè)計(jì)
- 指南針英文介紹
評(píng)論
0/150
提交評(píng)論