分享

在PHP中使用Ajax和Web服务来即时检测QQ在线状态

 python_diango 2012-03-25
看到标题,是不是感觉很有意思呢?的确很这样的。本文来教你实现通过调用 Web 服务和使用 Ajax 技术来实现查询某个 QQ 的在线状态。先作一下本次实例的相关介绍:

        使用技术:Ajax、PHP 调用 Web 服务

        目的:实时查询指定 QQ 号的在线状态,程序会每 10 秒检测一次该 QQ 的状态信息

        思路:通过 Ajax 来请求 PHP 程序, PHP 程序再去调用查询 QQ 状态的 Web 服务,并将返回的结果以 Ajax 请求的响应文本送回到原始请求页面。

        效果图:

 
 本例要调用的 Web 服务信息如下:

                腾讯QQ在线状态 WEB 服务 
                Endpoint: http://www./webservices/qqOnlineWebService.asmx
                Disco: http://www./webservices/qqOnlineWebService.asmx?disco
                WSDL: http://www./webservices/qqOnlineWebService.asmx?wsdl

        要想了解如果何用该 Web 服务,您可以打开上面的 Endpoint 查看它的使用方法。如果您对 PHP 调用 Web 服务还不太了解,请查看我之前写的这篇文章:在 PHP 中使用 SOAP 协议调用 Web服务(WebService)

        OK,万事俱备,来看编码。本例一共包括两个文件,一个是 qq.htm,另外是一个是 qq.php。qq.htm 负责显示表单以及查询结果,而 qq.php 则负责后台请求。qq.htm 的代码如下:

<head>
<style type="text/css">
   body{font-family:Tahoma;font-size:13px;}
   input,button{border:1px solid gray;}
   .tip{color:gray}
   p{line-height:5px}
</style>
<script type="text/javascript">
   var timer=null;   //定义一个计时器

   function runajax(objId,serverPage){
    var xmlhttp=false;
    if(window.XMLHttpRequest){
     xmlhttp=new XMLHttpRequest();
    }
    else{    
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   
 
    }   
   
    xmlhttp.open("GET",serverPage);     
    xmlhttp.onreadystatechange=function(){     
     if(xmlhttp.readyState==4 && xmlhttp.status==200){
      //将返回的结果不断添加到显示结果列表中。  
      document.getElementById(objId).innerHTML +="<p>" + 
xmlhttp.responseText + "</p>";
     }
    }
    xmlhttp.send(null); 
   }
  
//进行查询
   function doquery(){
    var qqNo=document.getElementById("qq").value;   
    if(qqNo == ""){
     alert("请先输入QQ号!");
     return false;
    }   
    runajax("showStatus","qq.php?qqNo=" + qqNo);   
   //每 10 秒会检测一次,这里的 第二个参数是以毫秒为单位的
    timer=setTimeout("doquery()",10000);     
 
   }  

   //停止查询
   function stopquery(){
    window.clearTimeout(timer);
   }
</script>
</head>
<body>
<form method="GET" action="qq.php" onsubmit="doquery(); return false" >
请输入要查询的 QQ 号:<input type="text" name="qq" />
<input type="submit" value="查询" /> <button id="stopbtn" onclick="stopquery();">停
止</button><span class="tip" style="margin-left:20px">程序会每隔 10 秒检测一次该 QQ 号的状态</span>
</form> 
<div id="showStatus">
</div>
</body>

        由于程序要实现每隔 10 秒检测一次这样的功能。所以使用 window.setTimeout 这个函数来解决这个问题。另外,由于程序要记录一个列表,所以需要将每次查询的结果添加到状态列表中,并且不能覆盖原来的文本,所以在显示 Ajax 响应时,需要注意源码中的这一句:
            document.getElementById(objId).innerHTML +="<p>" + xmlhttp.responseText + "</p>";

        来看 qq.php 的代码:

<?php
//前三行代码的作用是禁用 PHP 的缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Pragma: no-cache");

   //各种状态码及它们对应代码的意义(这里还加入了 HTML 标记,以加上颜色信息)
$status=array("Y"=>"<font color=green>Online</font>",
      "N"=>"<font color=blue>Offline</font>",
      "E"=>"<font color=red>Error QQ NO</font>",
      "V"=>"<font color=red>Your free times have been ran out!</p>"
);

if(isset($_GET['qqNo'])==TRUE){  
   //实例化并开始请求远程 Web 服务
   $client=new SoapClient("http://www./webservices/qqOnlineWebService.asmx?wsdl");
   $resultObj=$client->qqCheckOnline(array('qqCode'=>$_GET['qqNo']));

//获取状态码
   $resultCode=$resultObj->qqCheckOnlineResult;
  
   $curTime=date("H:i:s", time()); //时间信息

   switch($resultCode){
    case "Y": 
     echo $curTime." This QQ now is ".$status["Y"]; break; //当前在线
    case "N": 
     echo $curTime." This QQ now is ".$status["N"]; break; //当前离线
    case "E": 
     echo $curTime." This QQ is an ".$status["E"]; break; //错误的QQ号
    case "V":
     echo $curTime." ".$status["V"]; break;    //免费用户超过数量
    default:   
     echo $curTime." Other error has occured!!";   //其它错误
   }
}
?>

        该程序首先禁用了 PHP 的缓存功能,如果不禁用,那么“即时”这种效果就无法实现。在判断过 GET 变量之后,程序开始请求远程 Web 服务,之后对返回的状态码进行了判断,并作出了相应的显示。

        您已经看到了,由于该 Web 服务的返回结果中,有一个 V 的状态码,它说明了“免费用户超过数量”,我在测试时,也发现了这一点。它的意思应该是这样的:针对某个 IP 而言,使用该服务的数量是有限的,一旦你的免费次数用完了,再访问时,就会返回这样的信息。

        如果您对本文中介绍的方法有何意见或建议,请留下您的高见,欢迎交流。本文由 NBWD 原创,请放心转载。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多