在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 相关文章推荐
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
php 删除记录实现代码
Mar 12 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
php自定义加密与解密程序实例
Dec 31 PHP
PHP版微信公众平台红包API
Apr 02 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
PDO::rollBack讲解
Jan 29 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默认安装产生系统漏洞
2006/10/09 PHP
PHP与SQL注入攻击[一]
2007/04/17 PHP
php遍历数组的方法分享
2012/03/22 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
python编程线性回归代码示例
2017/12/07 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Python实现的建造者模式示例
2018/08/06 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
竞争上岗演讲稿
2014/01/05 职场文书
户外拓展活动方案
2014/02/11 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
活着观后感
2015/06/03 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers