首页 / 网页编程 / PHP / 在PHP中使用Sockets:从Usenet中获取文件
在PHP中使用Sockets:从Usenet中获取文件2009-11-05 Armel FauveauPHP能够打开远程或者本地服务器的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
";
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 .