談?wù)凙ndroid的三種網(wǎng)絡(luò)通信方式
Android平臺(tái)有三種網(wǎng)絡(luò)接口可以使用,他們分別是:java.net.*(標(biāo)準(zhǔn)Java接口)、Org.apache接口和Android.net.*(Android網(wǎng)絡(luò)接口)。下面分別介紹這些接口的功能和作用。
1.標(biāo)準(zhǔn)Java接口
java.net.*提供與聯(lián)網(wǎng)有關(guān)的類,包括流、數(shù)據(jù)包套接字(socket)、Internet協(xié)議、常見(jiàn)Http處理等。比如:創(chuàng)建URL,以及URLConnection/HttpURLConnection對(duì)象、設(shè)置鏈接參數(shù)、鏈接到服務(wù)器、向服務(wù)器寫數(shù)據(jù)、從服務(wù)器讀取數(shù)據(jù)等通信。這些在Java網(wǎng)絡(luò)編程中均有涉及,我們看一個(gè)簡(jiǎn)單的socket編程,實(shí)現(xiàn)服務(wù)器回發(fā)客戶端信息。
服務(wù)端:
public class Server implements Runnable{
@Override
public void run() {
Socket socket = null;
try {
ServerSocket server = new ServerSocket(18888);
//循環(huán)監(jiān)聽客戶端鏈接請(qǐng)求
while(true){
System.out.println("start...");
//接收請(qǐng)求
socket = server.accept();
System.out.println("accept...");
//接收客戶端消息
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = in.readLine();
//發(fā)送消息,向客戶端
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println("Server:" + message);
//關(guān)閉流
in.close();
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if (null != socket){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//啟動(dòng)服務(wù)器
public static void main(String[] args){
Thread server = new Thread(new Server());
server.start();
}
}
客戶端,MainActivity
public class MainActivity extends Activity {
private EditText editText;
private Button button;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText)findViewById(R.id.editText1);
button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Socket socket = null;
String message = editText.getText().toString()+ "\r\n" ;
try {
//創(chuàng)建客戶端socket,注意:不能用localhost或127.0.0.1,Android模擬器把自己作為localhost
socket = new Socket("<span style="font-weight: bold;">10.0.2.2</span>",18888);
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
(socket.getOutputStream())),true);
//發(fā)送數(shù)據(jù)
out.println(message);
//接收數(shù)據(jù)
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = in.readLine();
if (null != msg){
editText.setText(msg);
System.out.println(msg);
}
else{
editText.setText("data error");
}
out.close();
in.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if (null != socket){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<EditText android:layout_width="match_parent" android:id="@+id/editText1"
android:layout_height="wrap_content"
android:hint="input the message and click the send button"
></EditText>
<Button android:text="send" android:id="@+id/button1"
android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
</LinearLayout>
啟動(dòng)服務(wù)器:
javac com/test/socket/Server.java java com.test.socket.Server
運(yùn)行客戶端程序:
結(jié)果如圖:


注意:服務(wù)器與客戶端無(wú)法鏈接的可能原因有:
沒(méi)有加訪問(wèn)網(wǎng)絡(luò)的權(quán)限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
IP地址要使用:10.0.2.2
模擬器不能配置代理。
2。Apache接口
對(duì)于大部分應(yīng)用程序而言JDK本身提供的網(wǎng)絡(luò)功能已遠(yuǎn)遠(yuǎn)不夠,這時(shí)就需要Android提供的Apache HttpClient了。它是一個(gè)開源項(xiàng)目,功能更加完善,為客戶端的Http編程提供高效、最新、功能豐富的工具包支持。
下面我們以一個(gè)簡(jiǎn)單例子來(lái)看看如何使用HttpClient在Android客戶端訪問(wèn)Web。
首先,要在你的機(jī)器上搭建一個(gè)web應(yīng)用myapp,只有很簡(jiǎn)單的一個(gè)http.jsp
內(nèi)容如下:
<%@page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>
Http Test
</title>
</head>
<body>
<%
String type = request.getParameter("parameter");
String result = new String(type.getBytes("iso-8859-1"),"utf-8");
out.println("<h1>" + result + "</h1>");
%>
</body>
</html>
然后實(shí)現(xiàn)Android客戶端,分別以post、get方式去訪問(wèn)myapp,代碼如下:
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:gravity="center" android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></Button> <Button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></Button> </LinearLayout>
資源文件:
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">通過(guò)按鈕選擇不同方式訪問(wèn)網(wǎng)頁(yè)</string> <string name="app_name">Http Get</string> </resources>
主Activity:
public class MainActivity extends Activity {
private TextView textView;
private Button get,post;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView)findViewById(R.id.textView);
get = (Button)findViewById(R.id.get);
post = (Button)findViewById(R.id.post);
//綁定按鈕監(jiān)聽器
get.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//注意:此處ip不能用127.0.0.1或localhost,Android模擬器已將它自己作為了localhost
String uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以Get方式發(fā)送請(qǐng)求";
textView.setText(get(uri));
}
});
//綁定按鈕監(jiān)聽器
post.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String uri = "http://192.168.22.28:8080/myapp/http.jsp";
textView.setText(post(uri));
}
});
}
/**
* 以get方式發(fā)送請(qǐng)求,訪問(wèn)web
* @param uri web地址
* @return 響應(yīng)數(shù)據(jù)
*/
private static String get(String uri){
BufferedReader reader = null;
StringBuffer sb = null;
String result = "";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
try {
//發(fā)送請(qǐng)求,得到響應(yīng)
HttpResponse response = client.execute(request);
//請(qǐng)求成功
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
sb = new StringBuffer();
String line = "";
String NL = System.getProperty("line.separator");
while((line = reader.readLine()) != null){
sb.append(line);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if (null != reader){
reader.close();
reader = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != sb){
result = sb.toString();
}
return result;
}
/**
* 以post方式發(fā)送請(qǐng)求,訪問(wèn)web
* @param uri web地址
* @return 響應(yīng)數(shù)據(jù)
*/
private static String post(String uri){
BufferedReader reader = null;
StringBuffer sb = null;
String result = "";
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost(uri);
//保存要傳遞的參數(shù)
List<NameValuePair> params = new ArrayList<NameValuePair>();
//添加參數(shù)
params.add(new BasicNameValuePair("parameter","以Post方式發(fā)送請(qǐng)求"));
try {
//設(shè)置字符集
HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8");
//請(qǐng)求對(duì)象
request.setEntity(entity);
//發(fā)送請(qǐng)求
HttpResponse response = client.execute(request);
//請(qǐng)求成功
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
System.out.println("post success");
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
sb = new StringBuffer();
String line = "";
String NL = System.getProperty("line.separator");
while((line = reader.readLine()) != null){
sb.append(line);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
//關(guān)閉流
if (null != reader){
reader.close();
reader = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != sb){
result = sb.toString();
}
return result;
}
}
運(yùn)行結(jié)果如下:


3.android.net編程:
常常使用此包下的類進(jìn)行Android特有的網(wǎng)絡(luò)編程,如:訪問(wèn)WiFi,訪問(wèn)Android聯(lián)網(wǎng)信息,郵件等功能。這里不詳細(xì)講。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路
本文通過(guò)實(shí)例代碼給大家講解了Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路及解決方案,需要的朋友參考下吧2017-05-05
Kotlin的Collection與Sequence操作異同點(diǎn)詳解
這篇文章主要介紹了Kotlin的Collection與Sequence操作異同點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android智能指針輕量級(jí)Light Pointer初識(shí)
這篇文章主要為大家介紹了Android智能指針輕量級(jí)Light Pointer初識(shí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
android實(shí)現(xiàn)緩存圖片等數(shù)據(jù)
本文給大家分享的是Android采用LinkedHashMap自帶的LRU 算法緩存數(shù)據(jù)的方法和示例,有需要的小伙伴可以參考下。2015-07-07
Android實(shí)現(xiàn)一個(gè)包含表格的圖標(biāo)庫(kù)實(shí)例代碼
這篇文章主要介紹了Android實(shí)現(xiàn)一個(gè)包含表格的圖標(biāo)庫(kù)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Android ShareSDK快速實(shí)現(xiàn)分享功能
這篇文章主要介紹了Android ShareSDK快速實(shí)現(xiàn)分享功能的相關(guān)資料,需要的朋友可以參考下2016-02-02

