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


Posted in PHP onOctober 09, 2006

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

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

连接
   连接到一个NNTP服务器需要知道它的主机名(或者是ip地址)和它侦听的端口。为了避免一个连接企图失败导致程序挂起,你应该使用timeout参数。
    <?php
      $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篇文章因为某种原因被从服务器删除了,可能是因为被它的合法作者取消了(这是可能的,而且很容易做到),或者因为是灌水文章而被删。
   

需要注意的事,有些服务器在选择新闻组之前可能要求身份认证,这取决于这是一个公共的或者是私用的服务器。也有可能服务器允许任何人读取文章,但发表文章需要身份验证。

    <?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 != "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);

?>

 

PHP 相关文章推荐
图形数字验证代码
Oct 09 PHP
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
php表单敏感字符过滤类
Dec 08 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
php发送http请求的常用方法分析
Nov 08 PHP
php 判断IP为有效IP地址的方法
Jan 28 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
15个小时----从修改程序到自己些程序
Oct 09 #PHP
用PHP编程开发“虚拟域名”系统
Oct 09 #PHP
在Windows中安装Apache2和PHP4的权威指南
Oct 09 #PHP
自定义PHP分页函数
Oct 09 #PHP
用PHP实现WEB动态网页静态
Oct 09 #PHP
用libtemplate实现静态网页生成
Oct 09 #PHP
初探PHP5
Oct 09 #PHP
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
PHP修改session_id示例代码
2014/01/08 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
详解Python如何生成词云的方法
2018/06/01 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
数据员岗位职责
2013/11/19 职场文书
大二学期个人自我评价
2014/01/13 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
Golang 入门 之url 包
2022/05/04 Golang