全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1392
推到 Plurk!
推到 Facebook!

在PHP中使用Sockets

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-30 01:58:12 IP:61.70.xxx.xxx 未訂閱
在PHP中使用Sockets PHP能打開遠端或本地主機上的Socket埠。本文是一個使用Socket的小例子:連接到一個Usenet新聞組伺服器,同伺服器對話,從新聞組中下載一些文章。 在php中打開一個socket 使用fsockopen()打開一個socket.這個函數在php3和php4種都可以使用。函數聲明是這樣的: int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout>) 這個函數將打開一個連接到主機hostname的port埠的TCP連接。hostname可以是一個有效的功能變數名稱,或者是一個ip地址。對於udp連接,你必須指定協定:udp://hostname. 對於unix域,主機名使用到socket的路徑,這種情況下,埠port必須置?0。可選的timeout參數用來設定等待打開一個socket的時間,單位?秒。 關於fsockopen()的更多資訊,請參考:http://www.php.net/manual/function.fsockopen.php 網路新聞傳輸協定 訪問新聞組伺服器需要通過稱?NNTP(網路新聞傳輸協定)的協定來進行。這個協定在rfc977中有詳細的細節,可以在http://www.w3.org/Protocols/rfc977/rfc977.html得到。這個文檔分別描述了怎樣連接到NNTP伺服器,怎樣同伺服器對話,以及完成這些任務的不同命令。 連接 連接到一個NNTP伺服器需要知道它的主機名(或者是ip位址)和它偵聽的埠。?了避免一個連接企圖失敗導致程式挂起,你應該使用timeout參數。 <?php $cfgServer = "your.news.host"; $cfgPort = 119; $cfgTimeOut = 10; //open a socket if(!$cfgTimeOut) // without timeout $usenet_handle = fsockopen($cfgServer, $cfgPort); else // with timeout $usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut); if(!$usenet_handle) { echo "Connection failed.\n"; exit(); } else { echo "Connected.\n"; $tmp = fgets($usenet_handle, 1024); } ?> 與伺服器對話 現在我們已經連接到了伺服器,可以通過前面打開的socket同伺服器對話了。比如說我們要從某個新聞組得到最近的10篇文章。RFC977指出,第一步要用GROUP命令選擇正確的新聞組: GROUP ggg 參數ggg是要選擇的新聞組的名字(比如說是"net.news"),這是必需的。可用的新聞組的列表可以用LIST命令得到。選擇新聞組的命令成功後,返回組中第一篇和最後一篇文章的文章編號,以及組中文章的數目。 下面是一個例子: chrome:~$ telnet my.news.host 119 Trying aa.bb.cc.dd... Connected to my.news.host. Escape character is '^]'. 200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok). GROUP alt.test 211 232 222996 223235 alt.test quit 205 . 接收到命令 GROUP alt.test 後,伺服器返回"211 232 222996 223235 alt.test". 211是RFC中定義的返回碼,指示命令已成功執行。返回資訊還指出,現在有232篇文章,最早的文章的編號是222996,最新的文章的編號是223235。我們看到,222996 232並不等於223235。丟失的7篇文章因?某種原因被從伺服器刪除了,可能是因?被它的合法作者取消了(這是可能的,而且很容易做到),或者因?是灌水文章而被刪。 需要注意的事,有些伺服器在選擇新聞組之前可能要求身份認證,這取決於這是一個公共的或者是私用的伺服器。也有可能伺服器允許任何人讀取文章,但發表文章需要身份驗證。 <?php //$cfgUser = "xxxxxx"; //$cfgPasswd = "yyyyyy"; $cfgNewsGroup = "alt.php"; //identification required on private server if($cfgUser) { fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."n"); $tmp = fgets($usenet_handle, 1024); fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n"); $tmp = fgets($usenet_handle, 1024); //check error if($tmp != "281 Okrn") { echo "502 Authentication errorn"; exit(); } } //select newsgroup fput($usenet_handle, "GROUP ".$cfgNewsGroup."n"); $tmp = fgets($usenet_handle, 1024); if($tmp == "480 Authentication required for commandrn") { echo $tmp; exit(); } $info = split(" ", $tmp); $first= $info[2]; $last = $info[3]; printf("First : %sn", $first); printf("Last : %lastn", $last); ?> 讀取文章 既然我們已經得到了最後一篇文章的文章編號,讀取最後的十篇文章就是很容易的事了。RFC977中說,ARTICLE命令既可以使用文章編號,也可以使用它的消息ID. 這裏要注意,文章編號跟它的消息ID是不同的,因?每個新聞伺服器分配自己的文章編號,所以同一篇文章在兩個不同的伺服器上的編號是不一樣的,而文章的消息ID,是包括在文章的頭資訊裏,並且是唯一的。 <?php $cfgLimit =10; //upload last articles $boucle = $last-$cfgLimit; while ($boucle<=$last) { set_time_limit(0); fputs($usenet_handle, "ARTICLE $bouclen"); $article=""; $tmp=fgets($usenet_handle, 4069); if(substr($tmp,0,3) != "220") { echo " ---------------------- n"; echo "Error on article $bouclen"; echo " ---------------------- n"; } else { while($tmp!=".rn") { $tmp = fgets($usenet_handle, 4096); $article .=$tmp; } echo " ---------------------- n"; echo "Article $bouclen"; echo " ---------------------- n"; echo "$articlen"; } $boucle ; } ?> 我們從伺服器的這個新聞組中讀取了最後的十篇文章,。也可以通過使用HEAD命令讀取文章的頭資訊,或者使用BODY命令讀取文章內容。 關閉連接 最後,通過調用fclose()函數關閉socket,結束同NNTP伺服器的對話。 <?php //close connection fclose($usenet_handle); ?> 關於fclose()的更多資訊,請參考 http://www.php.net/manual/function.fclose.php 結論 在上文中,我們看到了怎樣打開、使用然後關閉一個socket:連接到一個NNTP伺服器,取回一些文章。使用POST命令發表文章也複雜不到哪兒去。 下一步就是編寫一個基於WEB的新聞組用戶端了。 存儲這些文章,用某個搜索引擎(比如說http://www.htdig.org)對文章進行索引也是非常容易的。這樣,你有了一個基於web的搜索新聞組的程式了。 這樣的程式的一個例子可以在http://www.phpindex.com/ng/得到。
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-11-22 12:02:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!