Heim >Backend-Entwicklung >PHP-Tutorial >在php中使用sockets:从新闻组中获取文章_PHP

在php中使用sockets:从新闻组中获取文章_PHP

WBOY
WBOYOriginal
2016-06-01 12:39:20822Durchsuche

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()的更多信息,请参考:h
ttp://www.php.net/manual/function.fsockopen.php

网络新闻传输协议
访问新闻组服务器需要通过称为NNTP(网络新闻传输协议)的协议来进行。这个协议
在rfc977中有详细的细节,可以在http://www.w3.org/Protocols/rfc977/rfc977.html
得到。这个文档分别描述了怎样连接到NNTP服务器,怎样同服务器对话,以及完成这
些任务的不同命令。

连接
连接到一个NNTP服务器需要知道它的主机名(或者是ip地址)和它侦听的端口。为了
避免一个连接企图失败导致程序挂起,你应该使用timeout参数。
$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篇文章因为某种原因被从服务器删除了,可能
是因为被它的合法作者取消了(这是可能的,而且很容易做到),或者因为是灌水文
章而被删。
需要注意的事,有些服务器在选择新闻组之前可能要求身份认证,这取决于这是一个
公共的或者是私用的服务器。也有可能服务器允许任何人读取文章,但发表文章需要
身份验证。


//$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);

?>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:函式:preg_match_all()_PHPNächster Artikel:Whois的PHP代码_PHP