在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 相关文章推荐
基于mysql的bbs设计(二)
Oct 09 PHP
隐性调用php程序的方法
Mar 09 PHP
php array的学习笔记
May 10 PHP
php实现邮件发送并带有附件
Jan 24 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
Yii配置文件用法详解
Dec 04 PHP
php生成curl命令行的方法
Dec 14 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
PHP遍历数组的6种方式总结
Nov 17 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
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
python使用matplotlib绘制柱状图教程
2017/02/08 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python3爬虫之设计签名小程序
2018/06/19 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
python名片管理系统开发
2020/06/18 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
J2EE相关知识面试题
2013/08/26 面试题
基于Python 函数和方法的区别说明
2021/03/24 Python
护士思想汇报
2014/01/12 职场文书
运动会入场解说词300字
2014/01/25 职场文书
小学生检讨书大全
2014/02/06 职场文书
合作协议书
2014/04/23 职场文书
关于安全的标语
2014/06/10 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
生活部的活动方案
2014/08/19 职场文书
老公保证书
2015/01/17 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
六一儿童节致辞
2015/07/31 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书