android基础(五)网络编程
android 的网络编程一般可以分为两种:基于Socket的,基于Http的。
一、socket与Http
socket封装了TCP/IP协议,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。socket通信方式是当服务器端与客户端建立起了socket连接后,服务器端可以直接将数据传输到客户端。(建立socket连接:建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。)
Http是应用层协议,Http是利用TCP在服务器和客户端之间传输信息的协议,主要解决如何包装数据。http通信方式是服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等
所以,Http通信方式可以看作为在Socket通信方式上对传输数据进行封装。Socket通信支持的TCP/IP协议相当于通信高速公路上的货车,负责运输任务;而Http则相当于货车上携带的货物,负责将要传输的数据包装为一个完整的货物。
二、socket通信编程实现
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
客户端:
(1)用服务器的IP地址和端口号实例化Socket对象。
(2)将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter。
(3)利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。
(4) 通讯完成后,关闭打开的IO对象和Socket。
服务器端:
(1)在服务器,用一个端口来实例化一个 ServerSocket对象。此时,服务器就可以这个端口时刻监听从客户端发来的连接请求。
(2)调用ServerSocket的accept方法,开始监听连接从端口上发来的连接请求。
(3)利用accept方法返回的客户端的Socket对象,进行读写IO的操作
(4)通讯完成后,关闭打开的流和Socket对象。
代码:
public class Client {
private static InetAddress address;
private static int portNum=8888; public static void main(String[]args) throws Exception{
//获取本地IP
address=InetAddress.getByName("localhost"); //设置服务器端地址和连接端口号
Socket socket=new Socket(address,portNum);
//客户端向服务器端发送数据
PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true);
out.println("客户端向服务器端发送数据");
//接收服务器端数据
BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
String serverMsg=in.readLine();
System.out.println("serverMsg "+serverMsg);
out.close();
in.close();
socket.close();
}
}
public class Server {
private static int portNo = 8888; public static void main(String[] args) throws IOException{
//设置服务器端与客户端连接的端口号,与客户端设置一致
ServerSocket serverSocket = new ServerSocket(portNo);
//等待接收客户端请求的socket
Socket socket = serverSocket.accept();
//向客户端发送数据
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println("这是服务器端向客户端发送的数据");
//接收客户端发送数据
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientMsg=in.readLine();
System.out.println("clientMsg "+clientMsg);
in.close();
out.close();
socket.close();
serverSocket.close();
}
}
三、Http通信编程实现(HttpURLConnection/HttpClient)
1、HttpURLConnection Java接口
private void httpUrlConnection() {
try {
//设置访问服务器地址
String pathUrl = "http://172.20.0.206:8082/TestServelt/login.do";
// 建立连接
URL url = new URL(pathUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); //设置连接属性
httpConn.setDoOutput(true);// 使用 URL 连接进行输出
httpConn.setDoInput(true);// 使用 URL 连接进行输入
httpConn.setUseCaches(false);// 忽略缓存
httpConn.setRequestMethod("POST");// 设置URL请求方法
String requestString = "客服端要以以流方式发送到服务端的数据...";//设置请求数据 // 设置请求属性
// 获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致
byte[] requestStringBytes = requestString.getBytes(ENCODING_UTF_8);
httpConn.setRequestProperty("Content-length", "" + requestStringBytes.length);
httpConn.setRequestProperty("Content-Type", "application/octet-stream");
httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
httpConn.setRequestProperty("Charset", "UTF-8");
//设置请求参数
String name = URLEncoder.encode("username", "utf-8");
httpConn.setRequestProperty("NAME", name); // 建立输出流,并将数据传输到服务器端
OutputStream outputStream = httpConn.getOutputStream();
outputStream.write(requestStringBytes);
outputStream.close();
// 获得响应状态
int responseCode = httpConn.getResponseCode();
if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功
// 当正确响应时处理数据
StringBuffer sb = new StringBuffer();
String readLine;
BufferedReader responseReader;
// 处理响应流,必须与服务器响应流输出的编码一致
responseReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), ENCODING_UTF_8));
while ((readLine = responseReader.readLine()) != null) {
sb.append(readLine).append("\n");
}
responseReader.close();
tv.setText(sb.toString());
}
} catch (Exception ex) {
ex.printStackTrace();
} }
2、HttpClient Apache接口
HttpClient是Apache提供的HTTP网络访问接口,从一开始就被引入到Android API中。它可以完成和HttpURLConnection几乎一模一样的效果,但两者之间的用法却有较大的差别。HttpClient是一个接口,android API中对这个接口有两个实现类AndroidHttpClient、DefaultHttpClient,一般android中对HttpClient的使用是通过DefaultHttpClient实现的。
发送带参数的get请求 //先将参数放入List,再对参数进行URL编码
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "中国"));
params.add(new BasicNameValuePair("param2", "value2"));
//对参数编码
String param = URLEncodedUtils.format(params, "UTF-8"); //baseUrl
String baseUrl = "http://ubs.free4lab.com/php/method.php"; //发送get请求需要创建HttpGet对象,然后将URL与参数拼接
HttpGet getMethod = new HttpGet(baseUrl + "?" + param); HttpClient httpClient = new DefaultHttpClient(); try {
//调用HttpClient的execute()方法发送请求
HttpResponse response = httpClient.execute(getMethod); //发起GET请求 if(response.getStatusLine().getStatusCode()==200){ //获取响应码 ,如果响应码为200,表示请求响应成功
//获取服务器响应内容
EntityUtils.toString(response.getEntity(), "utf-8");
} } catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
发送带参数的Post请求 //和GET方式一样,先将参数放入List
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二个参数")); try {
//发送Post请求需要先创建一个HttpPost对象
HttpPost postMethod = new HttpPost(baseUrl);
//将参数填入POST Entity中
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //执行POST方法,发送请求
HttpResponse response = httpClient.execute(postMethod);
if(response.getStatusLine().getStatusCode()==200){//获取响应码
//获取响应内容
String result=EntityUtils.toString(response.getEntity(), "utf-8")
} } catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
android基础(五)网络编程的更多相关文章
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- Java实验五网络编程与安全
实验五 网络编程与安全 实验准备 博客 活动一 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀 ...
- GO学习-(19) Go语言基础之网络编程
Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...
- Android之Http网络编程(三)
在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博 ...
- Android之Http网络编程(一)
Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLC ...
- 20155324 《Java程序设计》实验五 网络编程与安全
20155324 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中 ...
- 20165317Java实验五 网络编程与安全
实验五 网络编程与安全 一.中缀转后缀 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.ja ...
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- #《JAVA程序设计》 20155214 实验五 网络编程与安全
<JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
- 20155301 《Java程序设计》实验五网络编程与安全
20155301 <Java程序设计>实验五网络编程与安全 实验内容 实验1: 两人一组结对编程:参考http://www.cnblogs.com/rocedu/p/6766748.htm ...
随机推荐
- 在网站制作中随时可用的10个 HTML5 代码片段
HTML 很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单.在这篇文章中,我收集了10个超有用的 HTML 代码片段,有 HTML5 启动模板.空白图片.打电话和发短信.自动完成等等,帮 ...
- 本地搭建PHP环境后进入应用失败
进入localhost/wordpress或者其他应用,直接出现类似以下这种情况: 解决方法是修改tomcat的配置文件httpd.conf中: <IfModule dir_module> ...
- 实际项目中的一个angularjs 应用
实际需求:通过下拉框,选择自己需要的类型,创建元素(要求必须是输入点击保存了才能出现对应的类型块) html代码: <div class="list-panel-data"& ...
- 利用windbg 分析IIS 的线程池w3wp程序多线程挂起问题
前几天有个朋友发个了在windows server 2008跑的IIS 跑的程序w3wp程序dmp,要我帮忙分析为何线程都挂起不运行 经过查阅资料用windbg可以调试可以输出线程的调用堆栈,但是准备 ...
- ArcGIS Add-in插件开发从0到1及实际案例分享
同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...
- SEO基础问题:1. 关于网站的三要素你知道多少?
800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style ...
- CDN 实现原理
传统未加缓存访问过程: 用户提交域名——浏览器对域名进行解释——访问目的主机IP地址——根据IP地址发送请求——得到请求数据并回复 由此我们可以得到未加CDN缓存网站的过程为 (1) 用户向浏览器提供 ...
- 【小月博客】 Html5 上传图片 移动端、PC端通用
在博客园注册账号有些天了,感觉有些许欣慰,自己写的东西有人在看,有人在评论很是开心.(ps: 满足一下虚荣心吧!) 废话不多说了,说一下今天给大家分享的是 html5上传图片.我们是在移动端使用的,但 ...
- swift-分支语句
// switch的基本用法 // 1>switch后面的()可以省略 // 2>case中语句结束后不需要跟break // 3>在case中定义局部变量不需要跟{} // 4&g ...
- CASthesis 模板编译的问题
使用CASthesis模板(https://github.com/xiaoyao9933/UCASthesis,介绍里说这个版本是在ThuThesis的基础上修改的),自带的说明如下. 使用须知 == ...