介于本身的网络方面知识烂的一塌糊涂,因此准备写相关网络的文章,可是考虑所有写在一篇太长了,因此分开写,但愿你们能仔细看,最好能够指出个人错误,让我也能纠正。html
1.讲解相关的整个网络体系结构:web
2.讲解相关网络的重要知识点,好比不少人都听过相关网络方面的名词,可是仅限于听过而已,什么tcp ,udp ,socket ,websocket, http ,https ,而后webservice是啥,跟websocket很像,socket和websocket啥关系长的也很像,session,token,cookie又是啥。编程
Android技能树 — 网络小结(2)之TCP/UDPapi
Android技能树 — 网络小结(3)之HTTP/HTTPS浏览器
Android技能树 — 网络小结(4)之socket/websocket/webservice缓存
相关网络知识点小结- cookie/session/token(待写)bash
3.相关的第三方框架的源码解析,毕竟如今面试个大点的公司,okhttp和retrofit源码是必问的。服务器
Android技能树 — 网络小结(6)之 OkHttp超超超超超超超详细解析websocket
Android技能树 — 网络小结(7)之 Retrofit源码详细解析
咱们在网络体系结构小结中提过,TCP/IP的体系结构图为
在传输层中为TCP和UDP,解决了数据之间的运输,可是咱们不多直接去调用TCP和UDP,好比咱们如今是要用TCP传输数据,你要写代码去进行TCP的三次握手链接和四次挥手断开等,并且可能还要考虑什么滑动窗口,累积确认、分组缓存、流量控制等?因此咱们正须要某个类,这个类帮咱们封装好了TCP的链接,传输,断开等一系列相关各种操做,是否是就很方便了。没错,这个类就是Socket。
Socket 即套接字,是应用层 与 TCP/IP 协议族通讯的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API)
1.Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输)
2.即:经过Socket,咱们才能在Andorid平台上经过 TCP/IP协议进行开发
3.对用户来讲,只需调用Socket去组织数据,以符合指定的协议,便可通讯
关于Socket的使用,代码一搜一大把,这里我就快速经过,直接讲一下大体代码流程,咱们知道如今是为了把一个信息从一台设备到另一台设备,在网络体系结构小结中提过IP
是用来肯定信息最后到哪一个目标设备,因此咱们必定要知道IP
,到了目标设备后,目标设备可能开启了不少应用程序(多个进程),这时候怎么知道这个数据包到哪一个进程呢,这里也会涉及到端口,咱们日常写代码,有时候是否是会说某个端口被占用了。因此咱们同时除了ip
还要知道端口
。
因此初步是设备A的ip
,设备A的端口
,设备B的ip
,设备B的端口
,换成咱们日常的通俗说法就是客户端ip
,客户端端口
,服务端ip
,服务端端口
,外加上咱们的Socket用来操做TCP
,同时也能够操做 UDP
,因此同时还有一个协议
。因此最终涉及到这5个元素,socket 经过这5个元素来肯定。
具体的Socket代码就很少说了:
客户端:
public class ClientSocket {
public static void main(String args[]) {
String host = "127.0.0.1";
int port = 8919;
try {
Socket client = new Socket(host, port);
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("Hello From Client");
writer.flush();
writer.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
复制代码
服务端:
public class Server {
public static void main(String args[]) {
ServerSocket echoServer = null;
String line;
DataInputStream is;
PrintStream os;
Socket clientSocket = null;
try {
echoServer = new ServerSocket(9999);
}
catch (IOException e) {
System.out.println(e);
}
try {
clientSocket = echoServer.accept();
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
// As long as we receive data, echo that data back to the client.
while (true) {
line = is.readLine();
os.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
复制代码
看了代码,咱们发现Socket的一个很大的特色就是服务端和客户端能够相互传数据。
这和咱们平时的网络交互差异挺大的,毕竟咱们日常访问后台接口,不多说后台忽然经过这个接口发个数据给客户端是吧,通常都是客户端主动发送接口请求,而后才能拿到相关数据。
咱们在上面的Socket的相关介绍能够看到,Socket是在运输层作了一层抽象层,是TCP/UDP 的 api工具类,因此Socket不算是应用层类,而咱们在相关网络知识点小结- http/https提过Http/Https是属于应用层的,而咱们的WebSocket也是属于应用层的。因此说WebSocket和Http/Https是同一层级的。
而咱们也常常看到不少所谓的Http与WebSocket的区别文章等,好比:
而咱们在上面介绍Socket的时候提过,Socket能够双向通讯,因此WebSocket也是能够双向通讯的,而在没有双向通讯的时候,用Http来进行双向通讯更多的是使用长轮询。
在WebSocket API还没有被众多浏览器实现和发布的时期,开发者在开发须要接收来自服务器的实时通知应用程序时,不得不求助于一些“hacks”来模拟实时链接以实现实时通讯,最流行的一种方式是长轮询。长轮询主要是发出一个HTTP请求到服务器,而后保持链接打开以容许服务器在稍后的时间响应(由服务器肯定)。为了这个链接有效地工做,许多技术须要被用于确保消息不错过,如须要在服务器端缓存和记录多个的链接信息(每一个客户)。虽然长轮询是能够解决这一问题的,但它会耗费更多的资源,如CPU、内存和带宽等,要想很好的解决实时通讯问题就须要设计和发布一种新的协议。 WebSocket 是伴随HTML5发布的一种新协议。它实现了浏览器与服务器全双工通讯(full-duplex),能够传输基于消息的文本和二进制数据
WebSocket和长轮询之间的带宽消耗差别:
而WebSocket链接的时候,也会用到http,由于在最刚开始发出链接请求的时候,也是要借助于现有的HTTP协议,当链接成功后,其余时候直接基于TCP完成通讯。
1.首先,客户端发起http请求,通过3次握手后,创建起TCP链接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
2.而后,服务器收到客户端的握手请求后,一样采用HTTP协议回馈数据;
3.最后,客户端收到链接成功的消息后,开始借助于TCP传输信道进行全双工通讯。
固然若是只是了解大概的WebSocket和Http的区别,能够看这篇:WebSocket的原理,以及和Http的关系,用了通俗易懂的例子说明了,更加好记,可是并无说明具体的详细内容。
详细的能够看看这篇: 【腾云阁】WebSocket 浅析
那咱们既然是安卓开发,那咱们怎么样使用WebSocket呢,我想如今不少人都应该网络请求这块使用的是Okhttp吧,虽然咱们平时就是用Okhttp作简单的http/https请求,但其实它也是支持WebSocket的,具体你们能够直接搜索相关文章
![]()
首先若是有人作过相关的 WebService 的话,就会以为大致上其实和日常的 http 请求差很少,都是发送一个请求,而后接受相应的返回数据,可能最直观的差异是日常咱们用 http 发送请求,接收到请求/响应报文中的请求体都是 JSON,而WebService用的是 XML 的形式。其实的确是这样,由于Webservice就是采用了基于http的soap协议传输数据,因此简单理解为soap=http+xml。由于用了xml以后,更加的通用性,对于跨平台跨应用来讲都更好的相互通讯解析。
XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
咱们具体一项项来查看:
WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪一个方法,传递的参数是什么,以及服务对象的 返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于创建和易于分析外,XML主要的优势在于它既是平台无关的,又是厂商无关 的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
XSD又是什么呢,由于咱们日常写xml格式的内容,能够随便写,只要符合基本的xml格式就行,但实际上这样就没有一套标准的数据类型了。因此XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型
WebService经过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增长了一些特定的HTTP消息头,以说明 HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。
因此 SOAP协议 = HTTP协议 + XML数据格式
使用过WebService应该都知道这个,WebService务器端首先要经过一个WSDL文件来讲明有啥服务能够对外调用,服务是什么(服务中有哪些方法,方法接受 的参数是什么,返回值是什么),服务的网络地址用哪一个url地址表示,服务经过什么方式来调用。
好比下面这个是国内手机号码归属地查询WEB服务:
并且提供了soap1.1/soap1.2/get/post 四种方式来调用获取:
可是实际上可能没有写的这么详细,就是给咱们一个WSDL,里面的内容是这样的:
这里有些人可能不知道怎么来读懂这个文件,其实很简单,咱们一步步来看:
咱们先找到相应的service:
binding = "tns:MobileCodeWSSoap12"
,因此咱们查找相应的binding的值 咱们搜索到了MobileCodeWSSoap12
后发现是:
type="tns:MobileCodeWSSoap"
咱们搜索关键字:tns:MobileCodeWSSoap
后发现的是:
<wsdl:operation name="getMobileCodeInfo">
,因此咱们知道方法名字叫getMobileCodeInfo
,同时下面有 <wsdl:input message="tns:getMobileCodeInfoSoapIn"/> 和 <wsdl:output message="tns:getMobileCodeInfoSoapOut"/>
看字面意思就知道是输入参数和输出参数,而后继续对应关键字getMobileCodeInfoSoapIn
和getMobileCodeInfoSoapOut
搜下 搜到的结果为:
getMobileCodeInfo
和getMobileCodeInfoResponse
。 最终看到了具体的输入参数和输出参数。
mobileCode和userID
,输出参数是getMobileCodeInfoResult
,并且都是字符串类型。 整体来讲就是
<service>
-><binding>
-><type>
-><message>
-><element>
那么另一个问题来了,咱们从哪里获得WSDL呢?
WSDL 文件保存在Web服务器上,经过一个url地址就能够访问到它。客户端要调用一个WebService服务以前,要知道该服务的WSDL文件的地址。好比上面我贴图的WSDL内容就是只要访问:ws.webxml.com.cn/WebServices…就能够了。
WebService服务提供商能够经过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
补充1 :可能有些人会说WSDL的内容仍是看不懂,能够参考 WSDL 教程 及 WebService中的WSDL详细解析 学习。
![]()
补充2 : 刚提到了Soap1.1 和 Soap1.2:
![]()
![]()
![]()
emmmm.......轻喷便可。有错请留言,我能够进行修改。其中文章配图部分引自下面参考文章。
参考文章:
WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)