网络知识总结

前言

这年头不懂些网络知识都不好说自己是程序员,所以今天将自己了解到的网络知识总结一下

TCP与UDP

TCP和UDP属于传输协议层,TCP比UDP较为可靠。TCP提供IP环境下的数据可靠传输而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP如果需要连接的话就需要进行3次握手(即先于对方建立了连接),而UDP只需要发送数据给你,管你有没有接收到,所以UDP协议有可能丢失数据。

差别

本段参考百度百科

TCP3次握手和四次挥手

我只是大致了解一下 简化版

TCP的3次握手

  1. 客户端先发送信号到服务端
  2. 服务端接收到信号 处理信号变为信号2然后发送给客户端,
  3. 客户端接收到后处理然后把确认信号3发给服务端

就是有一个确认序号来判断服务端和客户端的连接,这样就算建立了连接。而其中会发送3个包。

TCP的四次挥手,分为主动方和被动方

  1. 主动方发送请求到被动方请求断开连接附信号
  2. 被动方接收到之后为了让主动方确定 发送信息给主动方
  3. 被动方然后发送信号给主动方
  4. 主动方收到信号后告诉被动方

详细请参考

Https和Socket

Android的网络编程分为2种:基于http协议的,和基于socket的

一、HTTP协议

基于TCP/IP协议之上的协议

1.1HttpURLConnection连接URL

1)创建一个URL对象

URL url = new URL(http://www.baidu.com);

2)利用HttpURLConnection对象从网络中获取网页数据

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3)设置连接超时

conn.setConnectTimeout(6*1000);

4)对响应码进行判断

if (conn.getResponseCode() != 200) //从Internet获取网页,发送请求,将网页以流的形式读回来

throw new RuntimeException(“请求url失败”);

5)得到网络返回的输入流

InputStream is = conn.getInputStream();
6)String result = readData(is, “GBK”); //文件流输入出文件用outStream.write
7)conn.disconnect();

总结:
–记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
–返回的响应码200,是成功.
–在Android中对文件流的操作和Java SE上面是一样的.
–在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
–操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
–对文件流操作完,要记得及时关闭.

1.2向服务器端发送请求参数

步骤:
1)创建URL对象:URL realUrl = new URL(requestUrl);
2)通过HttpURLConnection对象,向网络地址发送请求

HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
3)设置容许输出:conn.setDoOutput(true);
4)设置不使用缓存:conn.setUseCaches(false);
5)设置使用POST的方式发送:conn.setRequestMethod(“POST”);
6)设置维持长连接:conn.setRequestProperty(“Connection”, “Keep-Alive”);
7)设置文件字符集:conn.setRequestProperty(“Charset”, “UTF-8”);
8)设置文件长度:conn.setRequestProperty(“Content-Length”, String.valueOf(data.length));
9)设置文件类型:conn.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);

10)设置HTTP请求头

conn.setRequestProperty(“Accept“,” image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /“);

设置语言:conn.setRequestProperty(“Accept-Language“,”zh-CN”);

conn.setRequestProperty(“

conn.setRequestProperty(”
11)以流的方式输出.
总结:
–发送POST请求必须设置允许输出
–不要使用缓存,容易出现问题.
–在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头.

1.3.向服务器端发送xml数据(也称为实体Entity)

XML格式是通信的标准语言,Android系统也可以通过发送XML文件传输数据.
1)将生成的XML文件写入到byte数组中,并设置为UTF-8:byte[] xmlbyte = xml.toString().getBytes(“UTF-8”);
2)创建URL对象,并指定地址和参数:URL url = new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml);
3)获得链接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
4)设置连接超时:conn.setConnectTimeout(6* 1000);
5)设置允许输出conn.setDoOutput(true);
6)设置不使用缓存:conn.setUseCaches(false);
7)设置以POST方式传输:conn.setRequestMethod(“POST”);
8)维持长连接:conn.setRequestProperty(“Connection”, “Keep-Alive”);
9)设置字符集:conn.setRequestProperty(“Charset”, “UTF-8”);
10)设置文件的总长度:conn.setRequestProperty(“Content-Length”, String.valueOf(xmlbyte.length));
11)设置文件类型:conn.setRequestProperty(“Content-Type”,”text/xml; charset=UTF-8”);
12)以文件流的方式发送xml数据:outStream.write(xmlbyte);
总结:
–我们使用的是用HTML的方式传输文件,这个方式只能传输一般在5M一下的文件.
–传输大文件不适合用HTML的方式,传输大文件我们要面向Socket编程.确保程序的稳定性
–将地址和参数存到byte数组中:byte[] data = params.toString().getBytes();

使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。另外,还需要设置所使用的字符集。

基于Socket通信

Socket编程比基于URL的网络编程提供了更高的传输效率,更强大的功能和更灵活的控制。在Java中已经是层次最低的网络编程接口,在Java中要直接操作协议中更低的层次,那就只有使用JNI了,那基本属于本地语言的范畴。

Android开发实现TCP和UDP android tcp和udp的区别_键值对

Android开发实现TCP和UDP android tcp和udp的区别_Android开发实现TCP和UDP_02

至于上面参考的我找不到地址了 对不起了

一个说得比较详细的网址

长连接和短连接
  1. 长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 流行的是心跳包
  2. 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
    比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
    其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

说得较为详细的 http://www.jianshu.com/p/584707554ed7

补充 socket主动断开io.disconnect() 重新连接io.socket.reconnect()

Post和Get
GET vs POST

Http协议支持的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的还是GET和POST操作,下面我们看一下GET和POST的区别。

GET:

GET请求可以被缓存。
我们之前提到,当发送键值对信息时,可以在URL上面直接追加键值对参数。当用GET请求发送键值对时,键值对会随着URL一起发送的。
由于GET请求发送的键值对时随着URL一起发送的,所以一旦该URL被黑客截获,那么就能看到发送的键值对信息,所以GET请求的安全性很低,不能用GET请求发送敏感的信息(比如用户名密码)。
由于URL不能超过2048个字符,所以GET请求发送数据是有长度限制的。
由于GET请求较低的安全性,我们不应该用GET请求去执行增加、删除、修改等的操作,应该只用它获取数据。

POST:

POST请求从不会被缓存。
POST请求的URL中追加键值对参数,不过这些键值对参数不是随着URL发送的,而是被放入到请求体中发送的,这样安全性稍微好一些。
应该用POST请求发送敏感信息,而不是用GET。
由于可以在请求体中发送任意的数据,所以理论上POST请求不存在发送数据大小的限制。
当执行增减、删除、修改等操作时,应该使用POST请求,而不应该使用GET请求。

参考