Android 网络连接基本方式
来源:互联网 发布:启动sql server服务 编辑:程序博客网 时间:2024/06/01 07:40
就目前我所了解,可以分为两大类,Socket方式 和 Http方式。
其中,Socket方式所需使用的类,及Http方式中HttpUrlConnection类,都是JDK中的java类,跟传统java网络编程无差异。
1.Socket是针对传输层协议的,据说可以支持多种协议,不过java中貌似主要用来进行基于TCP/IP协议的网络编程。
它只是在两个网络进程间建立起稳定点到点连接,可以互相发送字节流,至于这些字节流双方按照什么协议解析,完全看程序开发者自己怎么设计。
2.Http方式,故名思议,是按照应用层HTTP协议规范进行网络连接。至于具体底层如何按照HTTP协议来编写程序实现网络连接,作为应用层开发者并不需要很清楚,因为已经有很多现成的程序包实现了这些功能,并且向我们提供简便易用的java api接口,其中既有JDK提供的HttpUrlConnection方式,也有开源组织Apache提供的HttpClient方式,还有很多其它第三方方式。任何一个人假如足够牛,又肯花功夫,也可以自己来实现相关功能,并提供自己的java api编程接口。
以下为使用上述api来编写程序的大致步骤:
一、Socket方式
1.客户端:
try{
//新建一个Socket,同时会向网络上 【IP地址:端口号】指定的进程发起连接
//端口号共256*256个,从0开始,其中前1024个为保留端口号,已经公共定义用途,或者留待未来公共定义,剩下的端口号用户可以自己定义
Socket socket = new Socket( 【IP地址】, 【端口号】);
............
//分别获取输入输出流,至于按照什么协议流程来进行数据输入输出,以及如何解析数据,看编写者自己的需要了
//往往会利用其它流对象对这两个数据流进一步处理,来优化输入输出。例如数据为字符串时,可以用BufferedReader和PrinterWriter
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
...........
//完事了,关闭相关的流以及网络连接
in.close();
out.close();
socket.close();
} catch (...){
...
}
2.服务端:
try{
//新建一个ServerSocket对象,监控本机指定端口
ServerSocket server = new ServerSocket( 【端口号】 );
..............
//阻塞再次,直到有客户端向自己发起请求,然后生成与之连接的对应的Socket对象,作为accept()方法的返回值
//获取到Socket对象后,剩下的用法,跟上面客户端Socket用法无异
Socket socket = server.accept();
..............
} catch (...){
......
}
二、Http方式
1.使用HttpUrlConnection
(JDK中的java.net.HttpURLConnection类)
1.1 Get请求:
String path = "......";
Url url = new Url( path );
HttpUrlConnection conn = url.openConnection();
conn.setConnectionTimeout( 5 * 1000 );//超时时间
try{
conn.Connect();//进行连接
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
if( conn.getResponseCode() == 200 ){//状态码为200,说明成功相应
InputStream in = conn.getInputStream();//获取输入流
if( ( len = in.read(buffer) ) != -1 ){//判断数据是否已经读完, 同时将数据读入数组buffer
baos.write( buffer, 0, len );//将数组buffer中的数据写入baos输出流
}
byte[] result = baos.toByteArray();
baos.close();
in.close();
conn.disConnect();//关闭连接
return new String( result );//假如result数组需要转化为String返回
}
} catch( Exception ... ){
.....
}
1.2 Post请求
大同小异,多了一些Http头部信息设置;多了一个环节,需要按照自己的规格组装数据体“参数对”信息,用数据流发往服务端。
具体见参考资料中示例代码
2.使用HttpClient
(org.apache.http.client.HttpClient接口,开源组织Apache提供的Java请求网络框架向上层提供的接口类)
HttpClient对JDK中的HttpUrlConnection各API进行了封装和简化,提高了性能并简化了使用步骤。Android SDK中引进了这个jar包,不需要额外导入任何jar或者类库就可以直接使用,但是,看到网上的信息称,Android官方已经宣布不建议使用HttpClient了,是故日后还是别以之为惯用方式为妙。
2.1 Get请求
String path = ".....";//url字符串
HttpGet httpGet = new HttpGet( path );//请求对象
HttpClient httpClient = new DefaultClient();//连接对象
try{
HttpResponse httpResponse = httpClient.execute( httpGet );//进行连接,并获取响应对象
int code = httpResponse.getStatusLine().getStatusCode();
if( code == 200 ){
InputStream in = httpResponse.getEntity().getContent();
.......
}
......
} catch( ... ){
......
}
2.2 Post请求
大同小异,只不过HttpGet要换为HttpPost,多了一些头部信息设置;
多了一个环节,需要组装数据体,并绑定到HttpPost对象上,但并不需要我们来写发送的代码,貌似执行httpClient.execute( httpPost )时会自动发送吧,该环节如下所示:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
params.add(new BasicNameValuePair("pwd", "android"));
// 设置字符集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
// 设置参数实体
httpPost.setEntity(entity);
具体见参考资料中代码示例。
3.到网上去找其它实现相关功能的程序包,有些框架已经将相应功能封装地很好,而且功能健壮。
(参考资料第一篇末尾就推荐了一款。)
三、Http报文格式简略说明
1.请求报文结构:
请求行 { 请求方法(get/post等)+ URL + 协议版本号 }
+ 头部 { 按照规范,根据自己需要来选择性添加 }
+ 包体 { 即数据内容,post请求时,这部分才有数据;get请求时,数据附在URL参数里,格式为【URL?参数名=参数值】 }
2.响应报文格式
状态行 { 协议版本号 + 状态码 + 状态码说明 }
+ 头部 { 按照规范,根据自己需要来选择性添加 }
+ 包体 { 服务端返回给客户端的数据 }
我们做应用层开发,无非就是借助已经写好的程序包,发送发文时,调用相关api接口,往HTTP报文里塞数据,对应的字段要塞上对应的数据;接收报文时,调用相关api接口,从所需字段取出数据,来解析。
阅读全文
0 0
- Android 网络连接基本方式
- android http通信方式连接网络
- android http通信方式连接网络
- android http通信方式连接网络
- android HTTP通信方式连接网络
- Android判断设备网络连接状态,并判断连接方式
- Android判断设备网络连接状态,并判断连接方式
- Android判断设备网络连接状态,并判断连接方式
- Android判断设备网络连接状态,并判断连接方式
- Android判断设备网络连接状态,并判断连接方式
- Android判断设备网络连接状态,并判断连接方式
- 虚拟机网络连接方式
- VM网络连接方式
- 虚拟机网络连接方式
- 虚拟机网络连接方式
- 虚拟机网络连接方式
- 网络连接方式
- 网络连接方式
- 蓝桥杯练习题 BEGIN-2 序列求和
- (三)Angular4 英雄征途HeroConquest-初始化组件文件介绍
- 网络协议的综合思考 及 网络体系: OSI vs TCP/IP
- 总结:Distributed systems for fun and profit
- SSH面密码登陆设置失败一直需要输入密码可能原因分析
- Android 网络连接基本方式
- 基础排序(四)
- QTableView 数据操作
- TCP三次握手、四次握手过程,以及原因分析
- Angular2学习 Http通信
- keil中的头文件是放在哪个文件夹里的
- [PAT乙级]1019. 数字黑洞 (20)
- pat 1005. 继续(3n+1)猜想 (25)
- 蓝桥杯练习题 BEGIN-3 圆的面积