<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          局域網(wǎng)發(fā)布共享文件xml-rpc 實現(xiàn)的文件共享

          聯(lián)合創(chuàng)作 · 2023-09-30 00:12

          xml-rpc 實現(xiàn)的文件共享

          這個項目取材與http://www.the5fire.com/python-project8-xml-rpc.html 。是python基礎(chǔ)教程中的十個例子中的第八個。主要的實現(xiàn)原理如下:

          每一個客戶端都是一個節(jié)點。每一個節(jié)點,都啟動一個 xml-rpc服務(wù)器。在 xml-rpc服務(wù)器中,維護著一個所有節(jié)點的集合。原文的例子,功能太少,只能下載。后來我加了一個ls 命令,可以查看包括自己的和所有節(jié)點的文件。原項目中的節(jié)點列表,必須是手動給出的,相當麻煩,是通過一個叫urlfile的文件來維護的。在我的這個項 目中,維護 節(jié)點的信息是通過程序自己學習到的。每當一個節(jié)點啟動的時候,該節(jié)點就會把自己的xml-rpc服務(wù)器的訪問url,通過udp廣播的方式,廣播給某一個 端口。同時每一個節(jié)點,只要它啟動后,會監(jiān)聽某一個端口上的,有關(guān)xml-rpc服務(wù)器的訪問url的監(jiān)聽。只要收到信息,就把它寫入到節(jié)點列表中。通過 fetch下載文件時,如果發(fā)現(xiàn)了異常,則從節(jié)點列表中刪除它。

          現(xiàn)在假如有兩個節(jié)點(啟動了client.py文件的機器) a和b,a中的節(jié)點列表中有b,同樣b中也有,當a嘗試著fetch 一個文件時,如果沒有在a中查找到的話,則會去找b,但是b中的節(jié)點列表是a,b會去找a。。。。。這樣就形成了阻塞。原項目中,是通過一個url列表來 維護的。但是這個項目中,a機器對于自己的url是localhost,b也是localhost,但是對于a來講b就不是localhost。所以我的 項目中,是通過維護一個secret列表來判斷,下一個要查找的節(jié)點是不是已經(jīng)被查過了。但是同時得先知道下一個節(jié)點的secret值,但是如果下一節(jié)點 就是上一個節(jié)點的話,還是會有阻塞,所以把xml-rpc做成多線程就很必要了。新構(gòu)建一個類class ThreadRPC(ThreadingMixIn, SimpleXMLRPCServer) 。這樣ThreadRPC就變成了多線程的SimpleXMLRPCServer。

          本來文件的傳輸是使用了xml-rpc。后來我把它獨立出來了。單獨作為一個文件傳輸服務(wù),TranServer。這個文件傳輸,不使用xml- rpc,而是直接用socket。用了SocketServer框架。本來是想用asynchat的。但是后來發(fā)現(xiàn),這個異步框架,有點蛋疼。比如說它的 push方法。是會把數(shù)據(jù)放到叫producer_fifo的fifo數(shù)據(jù)結(jié)構(gòu)中。這個做會出現(xiàn)一個大問題。我讀本地的文件速度遠遠快于發(fā)送的數(shù)度,當體 積大的時候,更是如此。所以使用push傳輸,會發(fā)現(xiàn)內(nèi)存占用越來越大,越來越大。。。如果不使用push,而是使用send,會發(fā)現(xiàn)數(shù)據(jù)不同步.鑒于這 些問題,所以我沒有采用異步,而是使用了多線程的SocketServer, ThreadingMixIn

          配置文件

          [global]

          # 監(jiān)聽節(jié)點的端口

          listen_port = 1111

          # 數(shù)據(jù)傳送的端口

          data_port = 1234

          # 要共享的目錄

          share_dir = /tmp/a

          使用方法

          啟動節(jié)點 : python client.py

          獲取文件列表: ls

          下載文件: fetch xxx

          查看文件內(nèi)容: cat xxx [要查看的前n位]

          瀏覽 24
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人精品A | 色色婷婷五月天 | 久久久久黄色片 | 国产一级操逼大黄视频 | 麻豆视频在线观看 |