1. 程式人生 > >基於socketio實現webrtc視訊通話的流程

基於socketio實現webrtc視訊通話的流程

  1. 按照發起方A往下走流程,呼叫requestServerCreateRoom方法,在這個方法裡建立socket連線,將發起方A和接收方B的使用者id傳遞給伺服器,傳送事件為“videoChat”。
  2. 伺服器接收到videoChat事件,按照請求生成房間,並將房間號返回給發起方A。
  3. 發起方A收到房間號後,執行connectRoom方法;
  4. 進入connectRoom方法,進入addSocketHandles方法新增sockethandles.
  5. 新增的sockethandles用於一會接收伺服器的事件訊息,類似安卓新增點選事件一樣,如果你想響應點選,就必須先註冊 新增點選事件一個道理。加的sockethandles分別為:_peers、_ice_candidate、_new_peer、_remove_peer、_offer、_answer、cancelVideoChat;
  6. 新增完sockethandles之後進入joinRoom方法,通過socket給伺服器傳送__join事件,傳遞引數房間號。
  7. 伺服器收到__join事件後,會根據請求的房間號,來遍歷房間裡的所有socketid,由於剛建立房間,現在房間是空的,即curRoom是空的,所以第一次沒有觸發_new_peer事件,程式碼接著往下走,
  8. for迴圈執行完成後,會將當前連線socket物件即發起方A socket物件存入到房間裡。
  9. 接著8,伺服器會執行傳送_peers事件,由於我們現在在伺服器與發起方A的執行緒裡,所以當前的socket物件是發起方,所以代表給發起方A傳送_peers事件。由於connectionids現在長度為0,所以基本客戶端的peers事件方法裡沒有做什麼操作,只是把webrtc的本地流初始化。
  10. 接著第3條伺服器在發給發起方A房間號後,並給接收方B傳送videoChat事件。(與4--8並行執行)
  11. 接收方B收到videoChat事件,開啟視訊介面並將伺服器傳遞過來的引數傳遞給視訊介面。
  12. 視訊介面開啟判斷是接收方還是傳送方;由於現在是接收方B,所以是接收方,於是顯示接聽和拒絕按鈕。
  13. 接收方B在視訊介面點選同意按鈕,進入connectRoom方法,進入addSocketHandles方法新增sockethandles。
  14. 新增的sockethandles用於一會接收伺服器的事件訊息,類似安卓新增點選事件一樣,如果你想響應點選,就必須先註冊 新增點選事件一個道理。加的sockethandles分別為:_peers、_ice_candidate、_new_peer、_remove_peer、_offer、_answer、cancelVideoChat;
  15. 新增完sockethandles之後進入joinRoom方法,通過socket給伺服器傳送__join事件,傳遞引數房間號。
  16. 伺服器收到__join事件後,會根據請求的房間號,來遍歷房間裡的所有socketid,由於此時房間號rooms[房間號]裡有一條資訊,就是發起方A的socket物件,所以執行for迴圈的語句,向發起方A發起_new_peer事件,並將接收方B的socketid傳遞過去。
  17. 發起方A客戶端接收_new_peer事件,建立Peer連線,新增本地流,並將peer放到peers集合中。peers集合存放了所有的連線。
  18. 傳送完所有的_new_peer事件後,向接收方B傳送_peers事件,傳遞引數當前房間除自己外的所有socket連線陣列,還有自己的soeckedid;
  19. 接收方B客戶端接收_peers事件後,跟傳過來的所有socketid建立連線,新增連線流,生成offer,觸發peer物件的回撥方法onCreateSuccess,在這個方法裡傳送__offer事件給伺服器。這裡涉及到webrtc互動流程,參見
  20. 伺服器收到offer後,將該offer轉發給對應的客戶端(這裡就是接收方B對應的客戶端是發起方A)。
  21. 發起方A接收到offer後,加入一些引數後呼叫setRemoteDescription方法,呼叫成功後會回撥onCreateSuccess方法,在 向這個方法裡向伺服器傳送__answer,伺服器接收到__answer後轉發給接收方B。
  22. 接收方B接收到answer後,向stun伺服器獲取自己的ip地址,stun伺服器返回ip後,會回撥onIceCandidate方法,在這個 向方法裡,向signal伺服器(即上邊經常提到的  伺服器)傳送__ice_candidate事件,伺服器將事件轉發給發起方A,
  23. 發起方A收到_ice_candidate事件後,向stun伺服器查詢自己的ip,返回成功後,回撥onIceCandidate方法,這樣整體建立一個p2p連線,開始視訊。