久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

在PHP中使用Sockets:從Usenet中獲取文件

瀏覽:4日期:2024-02-24 17:51:29

作者:Armel Fauveau原文地址:http://www.phpbuilder.net/columns/armel20010427.php3譯者:許立強(qiáng)feifengxlq@gmail.comHttp://www.phpobject.net/blog/

PHP能夠打開遠(yuǎn)程或者本地服務(wù)器的sockets!這里是一個使用socket的簡單的例子:連接到Usenet的新聞服務(wù)器,與服務(wù)器溝通,并從一個精確的新聞分組中下載一些文章。使用PHP打開Socket使用fsockopen()來打開一個Socket。這個函數(shù)在PHP3和PHP4中都存在。函數(shù)的原型如下:<?php

intfsockopen (string hostname, int port[, int errno[, string errstr[, double timeout]]])?>對于網(wǎng)絡(luò)主機(jī),它將建立一個TCP的Socket的連接到主機(jī)名的端口上。主機(jī)名可以是域名或者IP地址。對于UDP連接,你需要明確指出其協(xié)議:udp://hostname。對于unix主機(jī),主機(jī)名將在socket的路徑中使用,在這個例子中端口必須設(shè)置成0。可選項(xiàng)timeout可以用來設(shè)置連接超時的秒數(shù)。關(guān)于fsockopen()的更多信息可以訪問http://www.php.net/manual/function.fsockopen.php網(wǎng)絡(luò)新聞傳輸協(xié)議(NNTP)訪問一個usenet新聞服務(wù)器需要用到一個特別的協(xié)議,稱作NNTP,即網(wǎng)絡(luò)新聞傳輸協(xié)議標(biāo)準(zhǔn)。這個協(xié)議的詳細(xì)資料在RFC977中,你可以在http://www.w3.org/Protocols/rfc977/rfc977.html中查看到。這個文檔詳細(xì)的描述了如何使用不同的命令來連接并且和NNTP服務(wù)器對話。連接服務(wù)器連接到NNTP服務(wù)器需要知道服務(wù)器的主機(jī)名(或者IP地址)和它將要監(jiān)聽的端口。另外建議你加上一個超時的時間,這樣連接失敗的時候就不會“凍結(jié)”程序。<?php$cfgServer;='your.news.host';$cfgPort;=119;$cfgTimeOut;=10;// open asocketif(!$cfgTimeOut) // without timeout $usenet_handle=fsockopen($cfgServer,$cfgPort);else // with timeout $usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);if(!$usenet_handle) { echo'Connexionfailedn'; exit();};else { echo'Connectedn'; $tmp=fgets($usenet_handle,1024);}?>與服務(wù)器交互現(xiàn)在我們已經(jīng)連接上服務(wù)器了,而且能夠通過先前打開的socket連接與服務(wù)器進(jìn)行交互。讓我們對服務(wù)器說“我們要從某一新聞分組中獲取到最新的10篇文章”。RFC977定義了如何選擇正確的新聞分組的命令,如下:GROUPggg必需的參數(shù)ggg是你將要選擇的新聞分組的名字,比如net.news。使用list命令你可以獲取到一組有效的新聞列表。成功選擇響應(yīng)會返回組中首尾兩篇新聞的新聞號以及對存檔新聞號估計。比如chrome:~$ telnetmy.news.host 119Trying aa.bb.cc.dd...Connected tomy.news.host.Escape character is'^]'.200 my.news.hostInterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok).GROUP alt.test211 232 222996 223235alt.testquit205 .在接受到命令“GROUP alt.test”,新聞服務(wù)器返回了“211232 222996 223235 alt.test”。其中211是RFC標(biāo)識碼(簡單的解釋說命令已經(jīng)成功的執(zhí)行—查看RFC你可以獲取更加詳細(xì)的資料),返回信息說明其中有232篇文章,其中最舊的新聞的索引號是222996,而最新的新聞索引號是223235。現(xiàn)在讓我們計算下:222996+232并不等于232235。這丟失的文章或者從這服務(wù)器移除出去了,或者被他的作者取消了(是的,這是可能的,也是很容易實(shí)現(xiàn)的),或者是刪除了。小心起見,在選擇新聞分組之前,服務(wù)器可能需要認(rèn)證,當(dāng)然這是由服務(wù)器是否公開或者私有來決定的。一般是允許任何人獲取新聞,但發(fā)表新聞需要通過認(rèn)證。<?php//$cfgUser;= 'xxxxxx';//$cfgPasswd;= 'yyyyyy';$cfgNewsGroup;='alt.php';// identification required on private serverif($cfgUser) { fputs($usenet_handle,'AUTHINFO USER'.$cfgUser.'n'); $tmp=fgets($usenet_handle,1024); fputs($usenet_handle,'AUTHINFOPASS'.$cfgPasswd.'n'); $tmp=fgets($usenet_handle,1024); // check error if($tmp!='281Okrn') { echo'502Authentication errorn'; exit(); };}// select newsgroupfputs($usenet_handle,'GROUP '.$cfgNewsGroup.'n');$tmp=fgets($usenet_handle,1024);if($tmp=='480 Authentication required for commandrn') { echo'$tmpn'; exit();};$info=split(' ',$tmp);$first=$info[2];$last=$info[3];

print'First : $firstn';print'Last : $lastn';?>獲取一些文章現(xiàn)在我們已經(jīng)有最新文章的A索引號,那就能很容易的獲取最新的十篇文章。RFC977指出使用ARTICLE命令可以和文章的索引號或者消息的ID一起使用。為了小心起見,在這里,文章的索引號和消息ID是不同的,因?yàn)槊總€新聞服務(wù)器定義不同,所以在不同的新聞服務(wù)器上相同文章的索引號都會不一樣的,但是消息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,4096); if(substr($tmp,0,3) !='220') { echo'+----------------------+n'; echo'Error onarticle $bouclen'; echo'+----------------------+n'; } else { while($tmp!='.rn') { $tmp=fgets($usenet_handle,4096); $article=$article.$tmp; };;;;; echo'+----------------------+n'; echo'Article$bouclen'; echo'+----------------------+n'; echo'$articlen'; }; $boucle++;}?>我們僅僅從這個服務(wù)器的這個分組上獲取了十條最新的新聞。你也可以使用HEAD命令來至獲取文章的頭部信息,或者使用BODY命令來獲取新聞的正文。關(guān)閉連接使用fclose()函數(shù)你就可以結(jié)束與NNTP服務(wù)器之間的會話,當(dāng)然你可以些一個新的文件,如下:<?php// close connexionfclose($usenet_handle);?>更多關(guān)于fclose()的信息,請看:http://www.php.net/manual/function.fclose.php結(jié)論本文中,我們只說明了在確定的情況下如何打開、使用和關(guān)閉一個socket連接:連接上一個NNTP服務(wù)器然后從新聞分組中取回一些文章。使用POST命令在NNTP服務(wù)器上發(fā)表一篇文章并不復(fù)雜多少。因此,下一步就是編寫一個新聞客戶端(并去掉一些Netscape),它需要能很容易的保存文章,并使用一些搜索引擎(比如htgid,http://www.htdig.org/)來索引這些文章,而且要有一個WEB應(yīng)用程序能進(jìn)行新聞分組下的關(guān)鍵字搜索。這里有一個例子,你可以訪問http://www.phpindex.com/ng/去下載。

標(biāo)簽: PHP
主站蜘蛛池模板: 虎林市| 巩义市| 永年县| 东光县| 华亭县| 辛集市| 宁海县| 怀远县| 沂水县| 安图县| 长岭县| 泊头市| 宁都县| 兴和县| 澄江县| 湘潭县| 治县。| 浑源县| 洛阳市| 隆德县| 玉山县| 察雅县| 内黄县| 榕江县| 山阴县| 新宁县| 永靖县| 偏关县| 利川市| 临湘市| 汉川市| 曲水县| 五家渠市| 商河县| 通化市| 黑山县| 贵州省| 宣威市| 沂水县| 辽阳市| 略阳县|