由于一個(gè)項(xiàng)目的需要,我研究了一下android.html" target="_blank">android的網(wǎng)絡(luò)通信方式,大體和java平臺(tái)的很相似!
?
android平臺(tái)也提供了很多的API供開(kāi)發(fā)者使用,請(qǐng)按示例圖:
?
首先,介紹一下通過(guò)http包工具進(jìn)行通信,分get和post兩種方式,兩者的區(qū)別是:
1,post請(qǐng)求發(fā)送數(shù)據(jù)到服務(wù)器端,而且數(shù)據(jù)放在html header中一起發(fā)送到服務(wù)器url,數(shù)據(jù)對(duì)用戶不可見(jiàn),get請(qǐng)求是把參數(shù)值加到url的隊(duì)列中,這在一定程度上,體現(xiàn)出post的安全性要比get高
2,get傳送的數(shù)據(jù)量小,一般不能大于2kb,post傳送的數(shù)據(jù)量大,一般默認(rèn)為不受限制。
訪問(wèn)網(wǎng)絡(luò)要加入權(quán)限
下面是get請(qǐng)求HttpGet時(shí)的示例代碼:
View Code
// 創(chuàng)建DefaultHttpClient對(duì)象
HttpClient httpClient = new DefaultHttpClient();
// 創(chuàng)建一個(gè)HttpGet對(duì)象
HttpGet get = new HttpGet(
"http://192.168.1.88:8888/foo/secret.jsp");
try
{
// 發(fā)送GET請(qǐng)求
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity entity = httpResponse.getEntity();
if (entity != null)
{
// 讀取服務(wù)器響應(yīng)
BufferedReader br = new BufferedReader(
new InputStreamReader(entity.getContent()));
String line = null;
response.setText("");
while ((line = br.readLine()) != null)
{
// 使用response文本框顯示服務(wù)器響應(yīng)
response.append(line + "/n");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
post請(qǐng)求HttpPost的示例代碼:
?
?
View Code
HttpClient httpClient=new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://192.168.1.88:8888/foo/login.jsp");
// 如果傳遞參數(shù)個(gè)數(shù)比較多的話可以對(duì)傳遞的參數(shù)進(jìn)行封裝
List params = new ArrayList();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("pass", pass));
try
{
// 設(shè)置請(qǐng)求參數(shù)
post.setEntity(new UrlEncodedFormEntity(
params, HTTP.UTF_8));
// 發(fā)送POST請(qǐng)求
HttpResponse response = httpClient
.execute(post);
// 如果服務(wù)器成功地返回響應(yīng)
if (response.getStatusLine()
.getStatusCode() == 200)
{
String msg = EntityUtils
.toString(response.getEntity());
// 提示登錄成功
Toast.makeText(HttpClientTest.this,
msg, 5000).show();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
其次,介紹一下,使用java包的工具進(jìn)行通信,也分get和post方式
默認(rèn)使用get方式,示例代碼:
?
?
View Code
try
{
String urlName = url + "?" + params;
URL realUrl = new URL(urlName);
// 打開(kāi)和URL之間的連接或者HttpUrlConnection
URLConnection conn =realUrl.openConnection();
// 設(shè)置通用的請(qǐng)求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立實(shí)際的連接
conn.connect();
// 獲取所有響應(yīng)頭字段
Map> map = conn.getHeaderFields();
// 遍歷所有的響應(yīng)頭字段
for (String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
// 定義BufferedReader輸入流來(lái)讀取URL的響應(yīng)
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "/n" + line;
}
}
catch (Exception e)
{
System.out.println("發(fā)送GET請(qǐng)求出現(xiàn)異常!" + e);
e.printStackTrace();
}
// 使用finally塊來(lái)關(guān)閉輸入流
使用post的示例代碼:
?
?
View Code
try
{
URL realUrl = new URL(url);
// 打開(kāi)和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設(shè)置通用的請(qǐng)求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流
out = new PrintWriter(conn.getOutputStream());
// 發(fā)送請(qǐng)求參數(shù)
out.print(params);
// flush輸出流的緩沖
out.flush();
// 定義BufferedReader輸入流來(lái)讀取URL的響應(yīng)
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "/n" + line;
}
}
catch (Exception e)
{
System.out.println("發(fā)送POST請(qǐng)求出現(xiàn)異常!" + e);
e.printStackTrace();
}
從以上知,get請(qǐng)求只需要conn.connect(),post請(qǐng)求時(shí),必須設(shè)置 conn.setDoOutput(true),conn.setDoinput(true),還必須獲取URLConnection的輸出流getOutputStream()
最后,使用套接字(soket)進(jìn)行通信分為兩種形式:面向連接的(tcp)和無(wú)連接的(udp 數(shù)據(jù)報(bào))
tcp連接示例:
?
?
View Code
//服務(wù)器端
//創(chuàng)建一個(gè)ServerSocket,用于監(jiān)聽(tīng)客戶端Socket的連接請(qǐng)求
ServerSocket ss = new ServerSocket(30000);
//采用循環(huán)不斷接受來(lái)自客戶端的請(qǐng)求
while (true)
{
//每當(dāng)接受到客戶端Socket的請(qǐng)求,服務(wù)器端也對(duì)應(yīng)產(chǎn)生一個(gè)Socket
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
os.write("您好,您收到了服務(wù)器的消息!/n"
.getBytes("utf-8"));
//關(guān)閉輸出流,關(guān)閉Socket
os.close();
s.close();
}
//客戶端
Socket socket = new Socket("192.168.1.88" , 30000);
//將Socket對(duì)應(yīng)的輸入流包裝成BufferedReader
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//進(jìn)行普通IO操作
String line = br.readLine();
show.setText("來(lái)自服務(wù)器的數(shù)據(jù):" + line);
br.close();
socket.close();
udp連接示例:
?
?
View Code
服務(wù)器端:
try {
//創(chuàng)建一個(gè)DatagramSocket對(duì)象,并指定監(jiān)聽(tīng)的端口號(hào)
DatagramSocket socket = new DatagramSocket(4567);
byte data [] = new byte[1024];
//創(chuàng)建一個(gè)空的DatagramPacket對(duì)象
DatagramPacket packet = new DatagramPacket(data,data.length);
//使用receive方法接收客戶端所發(fā)送的數(shù)據(jù)
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 {
//首先創(chuàng)建一個(gè)DatagramSocket對(duì)象
DatagramSocket socket = new DatagramSocket(4567);
//創(chuàng)建一個(gè)InetAddree
InetAddress serverAddress = InetAddress.getByName("192.168.1.104");
String str = "hello";
byte data [] = str.getBytes();
//創(chuàng)建一個(gè)DatagramPacket對(duì)象,并指定要講這個(gè)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)當(dāng)中的哪個(gè)地址,以及端口號(hào)
DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);
//調(diào)用socket對(duì)象的send方法,發(fā)送數(shù)據(jù)
socket.send(packet);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
以上,是我的總結(jié),最近正在做一個(gè)類似網(wǎng)絡(luò)視頻客戶端的作品,如果大家有人做過(guò)這方面,歡迎您們提出建議和實(shí)現(xiàn)終端和服務(wù)器訪問(wèn)的其他方法。謝謝!
與大家共勉,更多內(nèi)容請(qǐng)繼續(xù)關(guān)注武林技術(shù)頻道網(wǎng)站!