由於一個項目的需要,我研究了一下android的網路通訊方式,大體和java平台的很相似!
android平台也提供了很多的API供開發人員使用,請按樣本圖:
首先,介紹一下通過http包工具進行通訊,分get和post兩種方式,兩者的區別是:
1,post請求發送資料到伺服器端,而且資料放在html header中一起發送到伺服器url,資料對使用者不可見,get請求是把參數值加到url的隊列中,這在一定程度上,體現出post的安全性要比get高
2,get傳送的資料量小,一般不能大於2kb,post傳送的資料量大,一般預設為不受限制。
訪問網路要加入許可權 <uses-permission android:name="android.permission.INTERNET" />
下面是get請求HttpGet時的範例程式碼:
複製代碼 代碼如下:View Code
// 建立DefaultHttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 建立一個HttpGet對象
HttpGet get = new HttpGet(
"http://192.168.1.88:8888/foo/secret.jsp");
try
{
// 發送GET請求
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity entity = httpResponse.getEntity();
if (entity != null)
{
// 讀取伺服器響應
BufferedReader br = new BufferedReader(
new InputStreamReader(entity.getContent()));
String line = null;
response.setText("");
while ((line = br.readLine()) != null)
{
// 使用response文字框顯示伺服器響應
response.append(line + "\n");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
post請求HttpPost的範例程式碼: 複製代碼 代碼如下:View Code
HttpClient httpClient=new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://192.168.1.88:8888/foo/login.jsp");
// 如果傳遞參數個數比較多的話可以對傳遞的參數進行封裝
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("pass", pass));
try
{
// 佈建要求參數
post.setEntity(new UrlEncodedFormEntity(
params, HTTP.UTF_8));
// 發送POST請求
HttpResponse response = httpClient
.execute(post);
// 如果伺服器成功地返迴響應
if (response.getStatusLine()
.getStatusCode() == 200)
{
String msg = EntityUtils
.toString(response.getEntity());
// 提示登入成功
Toast.makeText(HttpClientTest.this,
msg, 5000).show();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
其次,介紹一下,使用java包的工具進行通訊,也分get和post方式
預設使用get方式,範例程式碼: 複製代碼 代碼如下:View Code
try
{
String urlName = url + "?" + params;
URL realUrl = new URL(urlName);
// 開啟和URL之間的串連或者HttpUrlConnection
URLConnection conn =realUrl.openConnection();
// 設定通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立實際的串連
conn.connect();
// 擷取所有回應標頭欄位
Map<String, List<String>> map = conn.getHeaderFields();
// 遍曆所有的回應標頭欄位
for (String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
// 定義BufferedReader輸入資料流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "\n" + line;
}
}
catch (Exception e)
{
System.out.println("發送GET請求出現異常!" + e);
e.printStackTrace();
}
// 使用finally塊來關閉輸入資料流
使用post的範例程式碼: 複製代碼 代碼如下:View Code
try
{
URL realUrl = new URL(url);
// 開啟和URL之間的串連
URLConnection conn = realUrl.openConnection();
// 設定通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 發送POST請求必須設定如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 擷取URLConnection對象對應的輸出資料流
out = new PrintWriter(conn.getOutputStream());
// 發送請求參數
out.print(params);
// flush輸出資料流的緩衝
out.flush();
// 定義BufferedReader輸入資料流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "\n" + line;
}
}
catch (Exception e)
{
System.out.println("發送POST請求出現異常!" + e);
e.printStackTrace();
}
從以上知,get請求只需要conn.connect(),post請求時,必須設定 conn.setDoOutput(true),conn.setDoinput(true),還必須擷取URLConnection的輸出資料流getOutputStream()
最後,使用通訊端(soket)進行通訊分為兩種形式:連線導向的(tcp)和不需連線的(udp 資料報)
tcp串連樣本: 複製代碼 代碼如下:View Code
//伺服器端
//建立一個ServerSocket,用於監聽用戶端Socket的串連請求
ServerSocket ss = new ServerSocket(30000);
//採用迴圈不斷接受來自用戶端的請求
while (true)
{
//每當接受到用戶端Socket的請求,伺服器端也對應產生一個Socket
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
os.write("您好,您收到了伺服器的訊息!\n"
.getBytes("utf-8"));
//關閉輸出資料流,關閉Socket
os.close();
s.close();
}
//用戶端
Socket socket = new Socket("192.168.1.88" , 30000);
//將Socket對應的輸入資料流封裝成BufferedReader
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//進行普通IO操作
String line = br.readLine();
show.setText("來自伺服器的資料:" + line);
br.close();
socket.close();
udp串連樣本: 複製代碼 代碼如下:View Code
伺服器端:
try {
//建立一個DatagramSocket對象,並指定監聽的連接埠號碼
DatagramSocket socket = new DatagramSocket(4567);
byte data [] = new byte[1024];
//建立一個空的DatagramPacket對象
DatagramPacket packet = new DatagramPacket(data,data.length);
//使用receive方法接收用戶端所發送的資料
socket.receive(packet);
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println("result--->" + result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
用戶端:
try {
//首先建立一個DatagramSocket對象
DatagramSocket socket = new DatagramSocket(4567);
//建立一個InetAddree
InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
String str = "hello";
byte data [] = str.getBytes();
//建立一個DatagramPacket對象,並指定要講這個資料包發送到網路當中的哪個地址,以及連接埠號碼
DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);
//調用socket對象的send方法,發送資料
socket.send(packet);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
以上,是我的總結,最近正在做一個類似網路視頻用戶端的作品,如果大家有人做過這方面,歡迎您們提出建議和實現終端和伺服器訪問的其他方法。謝謝!
與大家共勉!!!