OkHttp3的WebSocket个人理解

356 阅读2分钟

前提

此文档仅仅表示个人看法,存在错误的地方,还望谅解,欢迎留言指正。

1、WebSocket是什么?

定义:基于TCP连接上的双向通信的应用层协议。

有三个点:

1、TCP,

2、双向通信(客户端-->服务的,服务端-->客户端),

3、应用层协议(和Http同层协议)。

2、简简单单的demo代码

1646741959215.png

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()方法。

1646742463654.png

步骤1、call真正的实现类是RealCall。call.enqueue()就是调用了异步执行请求,这个使用过okhttp应该是知道的,正常写法,并且也是请求了http协议进行服务器连接。

1646742889443.png

1646742956520.png

这个就是http请求的相同方法了,拦截器的使用,所以说webSocket的请求连接,首先还是请求了http。

1646742973824.png

步骤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方法就好。

\