• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
     首頁 > 新聞 > 專家觀點 >

    利用Phoenix代理進(jìn)行P2P WebRTC開發(fā)

    2015-08-21 10:08:10   作者:   來源:InfoQ中文站   評論:0  點擊:


      WebRTC(Web實時通信)的創(chuàng)建主要是為了視頻和音頻通信,但它也有在兩個瀏覽器之間傳遞二進(jìn)制數(shù)據(jù)的API。這為創(chuàng)建更多的點對點Web應(yīng)用程序帶來了許多機(jī)會,而且已經(jīng)有許多有趣的應(yīng)用程序是使用它創(chuàng)建的,如WebTorrent、UberConference。

      Zohaib Rauf是一名軟件工程師,他正在學(xué)習(xí)Elixir語言。為了更好地理解WebRTC,他使用它創(chuàng)建了一個P2P文件分享應(yīng)用程序,目標(biāo)是實現(xiàn)點對點的文件分享,而不需要任何中間人。文件發(fā)送者添加文件,并將唯一URL分享給接收者。接收者訪問唯一URL就可以看到分享的文件并下載,如下圖所示:

      在該應(yīng)用程序中,Zohaib使用Phoenix框架實現(xiàn)了一個用于初次握手的代理。近日,他發(fā)表了一篇博文,簡要介紹了該代理的設(shè)計決策過程。

      代理的作用

      為了創(chuàng)建點對點的連接,發(fā)起者會創(chuàng)建一個包含其網(wǎng)絡(luò)信息和其它媒體相關(guān)信息的握手請求。接收者在收到請求后會創(chuàng)建應(yīng)答和它自己的申請并發(fā)送回發(fā)起者。發(fā)起者接收到應(yīng)答后完成初次握手。至此,發(fā)起者和接收者就可以進(jìn)行點對點通信了。在這個過程中,需要有一種方式交換握手請求信息,這就是代理的用途所在了。

      代理的實現(xiàn)要滿足如下兩個要求:

      1.它應(yīng)該能夠通過WebSocket使用對等節(jié)點的ID與其通信;
      2.它需要維護(hù)已接入的對等節(jié)點的信息。

      每個對等節(jié)點在接入Zohaib的Web應(yīng)用時都會獲得一個唯一ID,并在收到唯一ID后將自己進(jìn)行注冊。

      使用對等節(jié)點ID進(jìn)行通信

      對于第一點要求,Zohaib嘗試了兩種方法。第一種方法是為對等節(jié)點ID和與它相關(guān)連的Socket維護(hù)一個通用的映射。當(dāng)需要同某個對等節(jié)點通信時,就使用對等節(jié)點的唯一ID檢索出Socket,并將消息推送給它。第二種方法是每個對等節(jié)點連接到一個唯一的主題,當(dāng)需要向那個節(jié)點發(fā)送消息時,只需將消息廣播到那個主題。有且只有一個對等節(jié)點會注冊到那個主題,所以,其它對等節(jié)點不會獲得這條消息。Zohaib采用了第二種方法,因為第一種方法需要一個Elixir代理存儲映射。這樣,每個通信請求都需要向該代理發(fā)送消息獲取Socket,它會成為瓶頸,而且不可擴(kuò)展。而在第二種方法中,當(dāng)向WebSocket注冊時,節(jié)點會連接到唯一的主題(比如peer:20dd48ca-fdcf-41c9-9a3b-f192f77650f9)。這時,就可以使用函數(shù)ApplicationName.Endpoint.broadcast(topic,event,payload)向該主題發(fā)送消息。

      對等節(jié)點信息維護(hù)

      對于第二點要求,Zohaib同樣嘗試了兩種方法。第一種方法是同上文描述的一樣,保存一個通用的映射。但當(dāng)Socket連接關(guān)閉或Socket進(jìn)程結(jié)束時,代理需要自己維護(hù)映射關(guān)系。第二種方法是使用Elixir/Erlang的全局名稱注冊功能。這種方式可以將一個全局名稱注冊到對應(yīng)的PID。當(dāng)進(jìn)程崩潰或終止時,該名稱會自動解除注冊。而且,這種方法可以擴(kuò)展到多個節(jié)點。因此,Zohaib采用了第二種方法。當(dāng)節(jié)點注冊時,它會啟動一個簡單的GenServer,后者維護(hù)與節(jié)點相關(guān)的信息,并為節(jié)點分配一個像peer_state:<UUID>這樣的全局名稱。該進(jìn)程會鏈接到Socket進(jìn)程,如果Socket關(guān)閉或崩潰,那么該進(jìn)程也會終止并解除注冊。在這種方式中,代理不需要自己維護(hù)映射。

      交換WinRTC請求

      有了代理,就可以交換握手請求了。例如,發(fā)送者將一個像http://epicshare.zohaib.me/?peer_id=20dd48ca-fdcf-41c9-9a3b-f192f77650f9這樣URL的分享,其中包含對等節(jié)點的ID。接收者打開該URL后會獲得一個唯一ID,并像上文描述的那樣將自己注冊到代理。那樣,兩個對等節(jié)點就都通過Web Socket連接到代理了。下一步,它們就可以發(fā)送和接收握手請求了,過程如下所示:

      感興趣的讀者可以試用Zohaib的程序,或者下載源代碼。

      另外,從Hacker News網(wǎng)友的討論中得知,使用WebRTC在兩個瀏覽器之間交換請求/應(yīng)答可以不借助任何服務(wù)器。

    分享到: 收藏

    專題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 梅河口市| 陕西省| 寻乌县| 潜山县| 靖西县| 宝丰县| 搜索| 浠水县| 黑龙江省| 江门市| 普陀区| 宜黄县| 新昌县| 绥棱县| 浦城县| 固始县| 淮滨县| 唐山市| 三都| 平塘县| 册亨县| 平江县| 保靖县| 武冈市| 荥经县| 武胜县| 闵行区| 宁阳县| 工布江达县| 革吉县| 肇州县| 彭州市| 青神县| 台安县| 阳东县| 新龙县| 武定县| 靖边县| 吉隆县| 许昌市| 肇东市| http://444 http://444 http://444 http://444 http://444 http://444