手记

Android网络通信总结

android的网络通信方式,大体和java平台的很相似! 

java提供的API:


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(); 
}

转自http://www.jb51.net/article/32033.htm

0人推荐
随时随地看视频
慕课网APP