Android--网络交互(Socket/Http)
来源:互联网 发布:喜马拉雅 兼职 知乎 编辑:程序博客网 时间:2024/06/18 10:10
第一种:socket(TCP和UDP)
1、Socket:
Socket又称”套接字"
网络上的两个程序通过一个双向的通信链接实现数据的交换,这个连接的一端成为一个socket
应用程序通常通过”套接字”向网络发出请求或者应答网络请
2、网络通信的要素:
网络上的请求就是通过socket来建立链接然后互相通信
ip地址(网络上主机设备的唯一标识)
端口号(定位程序)
用于标示进程的逻辑地址,不同进程的标示( 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发中建议使用1024以上的端口)
传输协议(通信的规则-->常见协议:TCP UDP)
3、TCP和UDP:
TCP(传输控制协议)
建立链接,形成传输数据的通道
在链接中进行打暑假传输(数据不受到限制 )
通过三次握手完成链接,是可靠协议,安全送达
必须建立链接,效率会稍低
UDP(用户数据报协议)
将数据及源和目的封装成数据包中,不需要建立链接
每个数据报的大小限制在64k之内
因为无需链接,因此是不可靠协议
不需要建立链接,速度快
4、实例:
<!--允许应用程序改变网络状态-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--允许应用程序改变WIFI连接状态-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--允许应用程序访问有关的网络信息-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许应用程序访问WIFI网卡的网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许应用程序完全使用网络-->
<uses-permission android:name="android.permission.INTERNET"/>
(1)、使用TCP协议通信
Socket socket;
try {
// 创建一个Socket对象,并指定服务端的IP及端口号
socket = new Socket("192.168.1.32", 1989);
// 创建一个InputStream用户读取要发送的文件。
InputStream inputStream = new FileInputStream("e://a.txt");
// 获取Socket的OutputStream对象用于发送数据。
OutputStream outputStream = socket.getOutputStream();
// 创建一个byte类型的buffer字节数组,用于存放读取的本地文件
byte buffer[] = new byte[4 * 1024];
int temp = 0;
// 循环读取文件
while ((temp = inputStream.read(buffer)) != -1) {
// 把数据写入到OuputStream对象中
outputStream.write(buffer, 0, temp);
}
// 发送读取的数据到服务端
outputStream.flush();
/**
或创建一个报文,使用BufferedWriter写入,看你的需求
String socketData = "[2143213;21343fjks;213]";
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
writer.write(socketData.replace("\n", " ") + "\n");
writer.flush();
**/
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
(2)、使用UDP协议通信
DatagramSocket socket;
try {
//实例化的端口号要和发送时的socket一致,否则收不到data
socket = new DatagramSocket(1985);
byte data[] = new byte[4 * 1024];
//参数一:要接受的data 参数二:data的长度
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
//把接收到的data转换为String字符串
String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
socket.close();//不使用了记得要关闭
System.out.println("the number of reveived Socket is :" + flag
+ "udpData:" + result);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
第二种:http
1、HttpURLConnection
(1)、首先需要获取到HttpURLConnection(缩写:URL)的实例,一般只需new 出一个URL对象。
(2)、调用一下openConnection()方法。
(3)、得到了HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法(POST和GET:由于Android 的SDK包含org.apache.http包,所以不用导入jar了.
get:
String serverURL = "http://127.0.0.1/xxx/xx.jsp?username=abc;
HttpGet httpRequest = new HttpGet(serverURL);// 建立http get联机
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);// 发出http请求
if (httpResponse.getStatusLine().getStatusCode() == 200)
String result = EntityUtils.toString(httpResponse.getEntity());// 获取相应的字符串
post:
String uriAPI = "http://127.0.0.1/xxx/xx.jsp"; //声明网址字符串
HttpPost httpRequest = new HttpPost(uriAPI); //建立HTTP POST联机
List <NameValuePair> params = new ArrayList <NameValuePair>(); //Post运作传送变量必须用NameValuePair[] 数组储存
params.add(new BasicNameValuePair("str", "I am Post String"));
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //发出http请求
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest); //取得http响应
if(httpResponse.getStatusLine().getStatusCode() == 200)
String strResult = EntityUtils.toString(httpResponse.getEntity()); //获取字符串
(4)、接下来就可以进行一些自由的定制了,比如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头等。
(5)、调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取。
这是一个接收服务器信息的代码:(先把流inputstream到内存中,再reader出来)
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
HttpURLConnection connection=null;
try {
URL url=new URL("http://www.baidu.com");
connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in=connection.getInputStream();
//下面对获取到的输入流进行读取
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
StringBuilder response=new StringBuilder();
String line;
while((line=reader.readLine())!=null){
response.append(line);
}
Message message=new Message();
message.what=SHOW_RESPONSE;
//将服务器返回的结果存放到Message中
message.obj=response.toString();
handler.sendMessage(message);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
if(connection!=null){
connection.disconnect();
}
}
}
}).start();
2、HttpClient
(1)、首先我们要知道,HttpClient是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient的实例。
(2)、如果想要发起一条GET请求,就可以创建一个HttpGet对象。
(3)、调用HttpClient的execute()方法。执行execute()方法之后会返回一个HttpResponse对象,服务器所返回的所有信息就会包含在这里面。
(4)、200就说明请求和响应都成功。
(5)、这个if判断的内部取出服务返回的具体内容,可以调用getEntity()方法获取到一个HttpEntity实例,然后再用
EntityUtils.toString()这个静态方法将HttpEntity转化成字符串。
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try{
HttpClient httpClient=new DefaultHttpClient() ;
HttpGet httpGet=new HttpGet("http://www.baidu.com");
HttpResponse httpResponse=httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode()==200){
//请求和响应都成功了
HttpEntity entity=httpResponse.getEntity();
String response=EntityUtils.toString(entity,"utf-8");
Message message=new Message();
message.what=SHOW_RESPONSE;
//将服务器返回的结果存放到Message中
message.obj=response.toString();
handler.sendMessage(message);
}
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
- Android--网络交互(Socket/Http)
- Android 网络请求(HTTP、Socket)出错
- Android 网络交互(五) Socket 小论
- Android 网络编程 Socket Http
- Android 网络编程 Socket Http
- (4.1.28)android之网络通信:HTTP、Socket、SOAP
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http
- Android HttpURLConnection Socket Http (网络编程)
- Android HttpURLConnection Socket Http (网络编程) .
- Android网络编程之Socket&Http
- Android网络编程之Socket&Http详解
- Android网络编程之Socket&Http
- 使用Scala的Type Class模式实现神经网络的问题总结(亦shapeless使用小结)
- 关联规则挖掘(二)-- Apriori 算法
- Android 实战-版本更新(okhttp3、service、notification)
- HDOJ1465 不容易系列之一(错排)
- 检验-会话cookie中缺少HttpOnly属性
- Android--网络交互(Socket/Http)
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用
- JAVA实现HTTPS协议POST请求JSON报文
- jquery练习8 html()与text()
- 闭包
- 多个活动的结果集 (MARS)
- LINUX中swap与windows中虚拟内存区别
- JS 中 DateTime日期时间及方法函数
- iOS系统弹框封装 一句代码实现中间和底部弹框