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基础(五)网络编程的更多相关文章

  1. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  2. Java实验五网络编程与安全

    实验五 网络编程与安全 实验准备 博客 活动一 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀 ...

  3. GO学习-(19) Go语言基础之网络编程

    Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...

  4. Android之Http网络编程(三)

    在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博 ...

  5. Android之Http网络编程(一)

    Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLC ...

  6. 20155324 《Java程序设计》实验五 网络编程与安全

    20155324 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中 ...

  7. 20165317Java实验五 网络编程与安全

    实验五 网络编程与安全 一.中缀转后缀 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.ja ...

  8. 20155326 《Java程序设计》实验五网络编程与安全实验报告

    20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...

  9. #《JAVA程序设计》 20155214 实验五 网络编程与安全

    <JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...

  10. 20155301 《Java程序设计》实验五网络编程与安全

    20155301 <Java程序设计>实验五网络编程与安全 实验内容 实验1: 两人一组结对编程:参考http://www.cnblogs.com/rocedu/p/6766748.htm ...

随机推荐

  1. simpson法求积分 专题练习

    [xsy1775]数值积分 题意 多组询问,求\(\int_l^r\sqrt{a(1-{x^2\over b})}dx\) 分析 double f(double x) { return sqrt(a* ...

  2. java 中Session 持久化问题

    首先: 今天发现了个session 持久化的问题 在Tomcat 停止运行后再启动  session  中保存的东西还会存在 ,百度了一下 原理 1.Session Create 时 2.Sessio ...

  3. Java—多线程编程

    一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...

  4. GitHub的使用之新建与更新代码

    一.新建仓储:注册GitHub后你就会有0.3G的免费空间,不过只能创建公开项目,这也满足代码分享的目的,我最喜欢的倒是它的代码展示方式,可以直接浏览你的代码,代码是经过高亮.添加行号处理过的,十分漂 ...

  5. css3实现逐渐变大的圆填充div背景的效果

    手机端现在的一些应用会运用上这样一个效果,就是duang的一下出现一个圆变大直到填充整个div,动感十足. 想到css3的scale属性,就自己来实现一下. <div id="bcd& ...

  6. Windows 下 pdf2word 的可用软件记录

    因为用 latex 写的原稿,提交审阅的时候有 Word 版本的要求,只好找软件来转换.折腾了一整天的 Linux 下latex2html, latex2rtf 等两个曲线救国的方式来生成 Word ...

  7. 更改星级评分条 RatingBar 的样式

    1.首先在布局中引用星级评分条: <RatingBar            android:id="@+id/room_ratingbar"            styl ...

  8. UAC在注册表中的对应位置

    UAC在注册表中的对应位置 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 相关键值设置: U ...

  9. Bootstrap <基础五>表格

    Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. <thead> 表格 ...

  10. 三角形-css

    /*箭头向上*/ .arrow-up { width:; height:; border-left:30px solid transparent; border-right:30px solid tr ...