国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android的網(wǎng)絡(luò)通信方式

2020-02-21 17:39:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

由于一個(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)站!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湖南省| 慈利县| 绍兴县| 阿坝县| 麦盖提县| 肥城市| 交城县| 台北市| 横峰县| 六盘水市| 德安县| 当阳市| 独山县| 冷水江市| 东乡县| 义乌市| 定兴县| 太仆寺旗| 石泉县| 保康县| 镇远县| 永丰县| 新和县| 界首市| 黑河市| 兴宁市| 东安县| 积石山| 栾城县| 河北省| 铅山县| 襄汾县| 饶阳县| 和田市| 庆阳市| 金平| 镇江市| 宜宾市| 蚌埠市| 洪江市| 新昌县|