一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

作者:Armel Fauveau 
原文地址:http://www.phpbuilder.NET/columns/armel20010427.php3
php能夠打開遠程或者本地服務器的sockets!這里是一個使用socket的簡單的例子:連接到UseNET的新聞服務器,與服務器溝通,并從一個精確的新聞分組中下載一些文章。

使用php打開Socket
使用fsockopen()來打開一個Socket。這個函數在php3和php4中都存在。函數的原型如下:
<?php

intfsockopen 
    (string hostname, 
        int port [, 
        int errno [, 
        string errstr [, 
        double timeout]]])
?>
對于網絡主機,它將建立一個TCP的Socket的連接到主機名的端口上。主機名可以是域名或者IP地址。對于UDP連接,你需要明確指出其協議:udp://hostname。對于unix主機,主機名將在socket的路徑中使用,在這個例子中端口必須設置成0。可選項timeout可以用來設置連接超時的秒數。
關于fsockopen()的更多信息可以訪問http://www.php.NET/manual/function.fsockopen.php

網絡新聞傳輸協議(NNTP)
訪問一個useNET新聞服務器需要用到一個特別的協議,稱作NNTP,即網絡新聞傳輸協議標準。這個協議的詳細資料在RFC977中,你可以在http://www.w3.org/Protocols/rfc977/rfc977.html中查看到。這個文檔詳細的描述了如何使用不同的命令來連接并且和NNTP服務器對話。

連接服務器
連接到NNTP服務器需要知道服務器的主機名(或者IP地址)和它將要監聽的端口。另外建議你加上一個超時的時間,這樣連接失敗的時候就不會“凍結”程序。
<?php
$cfgServer    = "your.news.host";
$cfgPort    = 119;
$cfgTimeOut    = 10;
// open asocket
if(!$cfgTimeOut)
    // without timeout
    $useNET_handle = fsockopen($cfgServer, $cfgPort);
else
    // with timeout
    $useNET_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);
if(!$useNET_handle) {
    echo"Connexionfailed/n";
    exit();
}    
else {
    echo"Connected/n";
    $tmp = fgets($useNET_handle, 1024);
}
?>

服務器交互
現在我們已經連接上服務器了,而且能夠通過先前打開的socket連接與服務器進行交互。讓我們對服務器說“我們要從某一新聞分組中獲取到最新的10篇文章”。RFC977定義了如何選擇正確的新聞分組的命令,如下:
GROUPggg
必需的參數ggg是你將要選擇的新聞分組的名字,比如NET.news。使用list命令你可以獲取到一組有效的新聞列表。成功選擇響應會返回組中首尾兩篇新聞的新聞號以及對存檔新聞號估計。
比如

chrome:~$ telNETmy.news.host 119
Trying 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.test
211 232 222996 223235alt.test
quit
205 .
在接受到命令“GROUP alt.test”,新聞服務器返回了“211232 222996 223235 alt.test”。其中211是RFC標識碼(簡單的解釋說命令已經成功的執行―查看RFC你可以獲取更加詳細的資料),返回信息說明其中有232篇文章,其中最舊的新聞的索引號是222996,而最新的新聞索引號是223235。現在讓我們計算下:222996+232并不等于232235。這丟失的文章或者從這服務器移除出去了,或者被他的作者取消了(是的,這是可能的,也是很容易實現的),或者是刪除了。
小心起見,在選擇新聞分組之前,服務器可能需要認證,當然這是由服務器是否公開或者私有來決定的。一般是允許任何人獲取新聞,但發表新聞需要通過認證。
<?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 != "281Ok/r/n") {
        echo "502Authentication error/n";
        exit();
    }    
}
// select newsgroup
fputs($useNET_handle, "GROUP ".$cfgNewsGroup."/n");
$tmp = fgets($useNET_handle, 1024);
if($tmp == "480 Authentication required for command/r/n") {
    echo "$tmp/n";
    exit();
}    
$info = split(" ", $tmp);
$first = $info[2];
$last = $info[3];

print "First : $first/n";
print "Last : $last/n";
?>

獲取一些文章
現在我們已經有最新文章的A索引號,那就能很容易的獲取最新的十篇文章。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$boucle/n");    
    $article="";
    $tmp = fgets($useNET_handle, 4096);
    if(substr($tmp,0,3) != "220") {
        echo "+----------------------+/n";
        echo "Error onarticle $boucle/n";
        echo "+----------------------+/n";
    }
    else {
        while($tmp!="./r/n") {
            $tmp = fgets($useNET_handle, 4096);
            $article = $article.$tmp;
        }        
        echo "+----------------------+/n";
        echo "Article$boucle/n";
        echo "+----------------------+/n";
        echo "$article/n";
    }    
    $boucle++;
}
?>
我們僅僅從這個服務器的這個分組上獲取了十條最新的新聞。你也可以使用HEAD命令來至獲取文章的頭部信息,或者使用BODY命令來獲取新聞的正文。

關閉連接
使用fclose()函數你就可以結束與NNTP服務器之間的會話,當然你可以些一個新的文件,如下:
<?php
// close connexion
fclose($useNET_handle);
?>
更多關于fclose()的信息,請看:http://www.php.NET/manual/function.fclose.php

結論
本文中,我們只說明了在確定的情況下如何打開、使用和關閉一個socket連接:連接上一個NNTP服務器然后從新聞分組中取回一些文章。使用POST命令在NNTP服務器上發表一篇文章并不復雜多少。
因此,下一步就是編寫一個新聞客戶端(并去掉一些NETscape),它需要能很容易的保存文章,并使用一些搜索引擎(比如htgid, http://www.htdig.org/)來索引這些文章,而且要有一個WEB應用程序能進行新聞分組下的關鍵字搜索。這里有一個例子,你可以訪問http://www.phpindex.com/ng/去下載。

php技術在PHP中使用Sockets 從Usenet中獲取文件,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 日韩毛片免费视频一级特黄 | 日韩在线一区二区三区免费视频 | 国产小视频在线免费观看 | 天天综合天天色 | 日韩免费视频一区二区 | 欧美第一页草草影院浮力 | 日本aⅴ日本高清视频影片www | 国产成人精品日本亚洲直接 | 丁香视频在线 | 日韩avv| 国产欧美一区二区三区在线 | 激情中文字幕 | 性欧美www| 九九精品视频在线观看 | 大胸国产精品视频 | 7777精品伊人久久久大香线蕉 | 婷婷色亚洲| 久久好看视频 | 日本一区深夜影院深a | 国产真实伦视频在线视频 | 国产精品视频无圣光一区 | 国产情侣普通话刺激对白 | 2020久久精品亚洲热综合一本 | 99超级碰碰成人香蕉网 | 免费看91| 福利视频欧美 | 午夜免费视频观看 | 中文字幕在线一区二区在线 | 久久久国产一区二区三区丝袜 | 久久久五月 | 国产成人鲁鲁免费视频a | 91热成人精品国产免费 | 在线欧美视频 | 色色色资源站 | 成人福利网 | 5月丁香婷婷 | 91最新视频在线观看 | 中文字幕一区在线观看视频 | 久久国产乱子伦精品在 | 国产真实乱子伦精品视手机观看 | 2019天天干天天操 |