ホームページ  >  記事  >  バックエンド開発  >  PHP でのソケットの使用: Usenet_PHP からファイルを取得するチュートリアル

PHP でのソケットの使用: Usenet_PHP からファイルを取得するチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:36:15748ブラウズ

作者:Armel Fauveau
原文地址:http://www.phpbuilder.net/columns/armel20010427.php3
译者:许立强feifengxlq@gmail.com
Http://www.phpobject.net/blog/


 
PHP能够打开远程或者本地服务器的sockets!这里是一个使用socket的简单的例子:连接到Usenet的新闻服务器,与服务器沟通,并从一个精确的新闻分组中下载一些文章。
 
使用PHP打开Socket
使用fsockopen()来打开一个Socket。这个函数在PHP3和PHP4中都存在。函数的原型如下:

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中,你可以在html">http://www.w3.org/Protocols/rfc977/rfc977.html中查看到。这个文档详细的描述了如何使用不同的命令来连接并且和NNTP服务器对话。
 
连接服务器
连接到NNTP服务器需要知道服务器的主机名(或者IP地址)和它将要监听的端口。另外建议你加上一个超时的时间,这样连接失败的时候就不会“冻结”程序。
$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 ";
exit();
}
else {
echo"Connected ";
$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。这丢失的文章或者从这服务器移除出去了,或者被他的作者取消了(是的,这是可能的,也是很容易实现的),或者是删除了。
小心起见,在选择新闻分组之前,服务器可能需要认证,当然这是由服务器是否公开或者私有来决定的。一般是允许任何人获取新闻,但发表新闻需要通过认证。
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup ="alt.php";
// identification required on private server
if($cfgUser) {
fputs($usenet_handle,"AUTHINFO USER".$cfgUser." ");
$tmp=fgets($usenet_handle,1024);
fputs($usenet_handle,"AUTHINFOPASS".$cfgPasswd." ");
$tmp=fgets($usenet_handle,1024);
// check error
if($tmp!="281Ok ") {
echo"502Authentication error ";
exit();
}
}
// select newsgroup
fputs($usenet_handle,"GROUP ".$cfgNewsGroup." ");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 Authentication required for command ") {
echo"$tmp ";
exit();
}
$info=split(" ",$tmp);
$first=$info[2];
$last=$info[3];

print"最初 : $first ";
print"最後 : $last ";
?>

いくつかの記事を取得します
最新の記事の A インデックス番号がわかったので、最新の 10 件の記事を簡単に取得できます。RFC977 は、ARTICLE コマンドを使用すると、次のインデックス番号と組み合わせることができると指摘しています。注意のため、記事のインデックス番号とメッセージ ID はニュース サーバーごとに異なるため、同じ記事でもニュースごとに異なります。サーバーはありますが、メッセージ ID Good は唯一のものです (記事のヘッダーに含まれています)
$cfgLimit =10;
// 最後の記事をアップロードします
$boucle=$last-$cfgLimit;
while ( $boucle<=$last) {
set_time_limit(0);
fputs($usenet_handle,"ARTICLE$boucle ");
$article="";
$tmp=fgets($usenet_handle,4096);
if(substr($tmp,0,3) !="220") {
echo"+----- ------------------+ ";
echo"記事 $boucle のエラー ";
エコー"+----------------------+ ";
}
elles {
") {
---+ ";
echo"記事$boucle ";
エコー"+----------------------+ ";
echo"$article ";}} B $ Boucle ++;
}
? & Gt;
このグループのグループから取得した最新ニュースは 10 件のみです。head コマンドを使用して記事の先頭情報を取得することも、Body コマンドを使用することもできます。ニュースのテキストを取得するには、

接続を閉じます。 もちろん、次のように、fclose() 関数を使用して、新しいファイルを作成することもできます:
// close connexion
fclose($usenet_handle);
?>
fclose() の詳細については、次を参照してください: http://www.php.net/manual/function.fclose.php

結論
この記事では、特定の状況下でソケット接続を開く、使用する、閉じる方法についてのみ説明します: NNTP サーバーに接続し、ニュース パケットから記事を取得します。POST コマンドを使用して NNTP サーバーに記事を公開することは、それほど複雑ではありません。次のステップは、記事を簡単に保存し、検索エンジン (htgid、http://www.htdig.org/ など) を使用してインデックスを作成できるニュース クライアントを作成することです (そして Netscape の一部を削除します)。WEB アプリケーションがあります。ニュース グループでキーワード検索を実行できる例を次に示します。http://www.phpindex.com/ng/ にアクセスしてダウンロードできます。



http://www.bkjia.com/PHPjc/508233.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/508233.html

技術記事著者: Armel Fauveau 元のアドレス: http://www.phpbuilder.net/columns/armel20010427.php3 翻訳者: Xu Liqiang feifengxlq@gmail.com Http://www.phpobject.net/blog/ PHP はリモート...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。