前提
此文档仅仅表示个人看法,存在错误的地方,还望谅解,欢迎留言指正。
1、WebSocket是什么?
定义:基于TCP连接上的双向通信的应用层协议。
有三个点:
1、TCP,
2、双向通信(客户端-->服务的,服务端-->客户端),
3、应用层协议(和Http同层协议)。
2、简简单单的demo代码
3、跟着这个简简单单的代码,简简单单的看看源码吧
// 启动连接服务器
okHttpClient.newWebSocket(request, new WebSocketListener() {})
/** * Uses {@code request} to connect a new web socket. */
@Override
public WebSocket newWebSocket(Request request, WebSocketListener listener) { RealWebSocket webSocket = new RealWebSocket(request, listener, new Random(), pingInterval); webSocket.connect(this);
return webSocket;
}
new出真正的webSocket类,并调用了connect(),下面接着看connect()方法。
步骤1、call真正的实现类是RealCall。call.enqueue()就是调用了异步执行请求,这个使用过okhttp应该是知道的,正常写法,并且也是请求了http协议进行服务器连接。
这个就是http请求的相同方法了,拦截器的使用,所以说webSocket的请求连接,首先还是请求了http。
步骤2和3、看注解是将http流升级为socket流,并创建了socket,且生成流Stream对象,此对象中包括了socket的输入流和输出流的封装。
// 对连接的sokcet返回的输入输出流进行再封装
initReaderAndWriter()
步骤4、这个就比较熟悉了,就是已经开始调用,简单demo中的回调了,说明已经连接上了。
最后就调用loopReader(),开始读取服务器的数据,若服务器没来数据,就会阻塞。
public void loopReader() throws IOException {
while (receivedCloseCode == -1) {
// This method call results in one or more onRead* methods being called on this thread.
reader.processNextFrame();
}
}
中间发杂的协议处理,就先不看了,但总体来说还是输入输出流读取到字节数据中,并根据协议进行拆分处理。
总结说明
1、建立websocket之前会先请求一次http。
2、建立连接后还是会进行socket的创建并对输入输出流进行封装
3、数据会分成一帧一帧的传输,数据头中会有标识是否已经是最后一帧,这个都是okhttp给封装好的,使用时只要关注onMeasege方法和send方法就好。
\