当前位置:编程学习 > VB >>

400分求解“绝世难题”:关于服务器推技术在ASP程序中的应用问题,一个月无有用回贴,请求高手

如下“服务器推”的一个示例程序。
请高手帮忙研究一下,如何将之实际转换为一个消耗资源极少的ASP聊天室程序?
先谢谢了。

JScript code
<%@ Language="Javascript" codepage ="936" EnableSessionState=False %>
<html>
<head>
<title>ASP服务器推技术测试</title>
<script language=javascript runat=server>
/*
* 函数名: evlon.sleep(ms)
* 作者: evlon(阿牛) MSN:niukl@msn.com QQ:273352165
* 功能: 模拟 C 语言的 Sleep
* 用途: 用到时就有用了,最简单的情况就是在聊天室的服务端中,
* 通过循环把Application的内容写到客户端,但这样会CPU占用率过高
* 这时把这个函数加入,会几乎不占用CPU
*   
*/   
function Evlon()
{
this.xh = new ActiveXObject("Msxml2.ServerXMLHTTP");
this.lresolveTimeout = 0; // 解析DNS名字的超时时间
this.lconnectTimeout = 50000; // 建立Winsock连接的超时时间
this.lsendTimeout = 0 ; // 发送数据的超时时间
this.lreceiveTimeout = 0 ; // 接收response的超时时间
this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);
this.urlport = "http://127.0.0.1:1111";
}   
Evlon.prototype.sleep = function(ms)
{
var beg = new Date();
var count = Math.floor(ms / 500);
var lastms = ms % 500;
this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);

for(var i = 0 ;i< count + 1; ++i)
{
  //先看一下时间过了没有
  var now = new Date();
  if(ms < now - beg)
  {
  break;
  }
  else
  {
  if( i == count)
  {
  this.xh.setTimeouts(this.lresolveTimeout,lastms,this.lsendTimeout,this.lreceiveTimeout);
  }
  //Sleep
  try
  {
  this.xh.open("GET",this.urlport,false,null,null);
  this.xh.send();
  }
  catch(e){
  }
  }
}
}


</script>
<script language=javascript>
function cs(c)
{
with(document.getElementById("con"))
{
innerHTML = c + innerHTML;
}
}
</script>
</head>
<body>
<div id=con></div>

<script language=javascript runat=server>
//下面是测试程序,在指定时间内观查CPU占用率
function testSleep(timeSpan /*秒*/)
{
try
{
  var beg = new Date();
  var evlon = new Evlon();
  var nCount = 0;
  while(Response.IsClientConnected())
  {
  var end = new Date();
  Response.Write("<sc" + "ript>cs('" + end + "<br>');</sc" + "ript>\n");
  Response.Flush();
  var span = end - beg;
  if(span > timeSpan * 1000)
  {
  break;
  }
  nCount ++;
  evlon.sleep(200);
  }
  var end = new Date();
  var span = end - beg;
  var msg = '共运行' + nCount.toString() + '次\n占用时间' + span + '毫秒';
  Response.Write(msg);
}
catch(e)
{
  Response.Write(e.message);
}
}
testSleep(5);
</script>

[/code] ding. 发错版面了......
这里的sleep起个延时作用,有它肯定会大量占用资源 孤独剑改头像啦
引用 4 楼 liguicd 的回复:
孤独剑改头像啦

呵呵,才改的,这你也发现了 up~ 既然是"绝世难题",就不要发了,无解 不懂.....路过......帮顶..... 请联系“绝世高人”
电话: !@#$%^&*() 高人来吧
高人来吧. ....................
引用 11 楼 tiger_zhao 的回复:
请联系“绝世高人”
电话: !@#$%^&*()

.........

说实话,LZ的代码看不大懂. 不过既然提到vb版了,顺便说句,做个聊天室,循环应该用不上的.
用winsock 和DDE之类 还想学习下,这么快水了 以彼之道还施彼身。
楼主可以看这个:
http://hi.baidu.com/viewhainan/blog/item/932258b584f294c436d3ca58.html 无聊。客户端轮询即可。
不要和我说效率。这种长连接效率更低。 好像上一个贴子就跟你说过,Response.Flush就可以。你首先要明白什么是服务器推,什么是客户端拉。 这里讨论的是地地道道的“服务器推”技术。 这里讨论的是地地道道的“服务器推”技术。 这里讨论的是地地道道的“服务器推”技术。 在服务端使用C++编写的COM组件即可。
引用 23 楼 yunyu97 的回复:
在服务端使用C++编写的COM组件即可。


只能用ASP脚本吧? 只能用ASP脚本 http://hi.baidu.com/viewhainan/blog/item/932258b584f294c436d3ca58.html dddddddddddd
引用 25 楼 aamiila 的回复:
只能用ASP脚本

那为啥还要发在VB区....... 就这点破东西,还绝世难题,,哎,,我看LZ不适合做技术,适合去写书
引用 28 楼 myjian 的回复:
引用 25 楼 aamiila 的回复:
只能用ASP脚本

那为啥还要发在VB区.......


VB区多高手。
引用 29 楼 m60a1 的回复:
就这点破东西,还绝世难题,,哎,,我看LZ不适合做技术,适合去写书

这点破东西也没解决啊?
引用 31 楼 aamiila 的回复:
这点破东西也没解决啊?

楼上有不少人在帮你出主意,你不领情也就算了,还把人家BS一顿,冲你这态度的话,也难以让懂的人再出手了.

帮你顶顶吧. 实话实说,一个多月过去了,CSDN还没人能解决这点破东西。 那这还是“破东西”吗? gslb 页面1:<%@ Language="Javascript" codepage ="936" EnableSessionState=False %>
<script language=javascript runat=server>
/*
* 函数名: evlon.sleep(ms)
* 作者: evlon(阿牛) MSN:niukl@msn.com QQ:273352165
* 功能: 模拟 C 语言的 Sleep
* 用途: 用到时就有用了,最简单的情况就是在聊天室的服务端中,
* 通过循环把Application的内容写到客户端,但这样会CPU占用率过高
* 这时把这个函数加入,会几乎不占用CPU
*   
*/   
function Evlon()
{
this.xh = new ActiveXObject("Msxml2.ServerXMLHTTP");
this.lresolveTimeout = 0; // 解析DNS名字的超时时间
this.lconnectTimeout = 50000; // 建立Winsock连接的超时时间
this.lsendTimeout = 0 ; // 发送数据的超时时间
this.lreceiveTimeout = 0 ; // 接收response的超时时间
this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);
this.urlport = "http://127.0.0.1:1111";
}   
Evlon.prototype.sleep = function(ms)
{
var beg = new Date();
var count = Math.floor(ms / 500);
var lastms = ms % 500;
this.xh.setTimeouts(this.lresolveTimeout,this.lconnectTimeout,this.lsendTimeout,this.lreceiveTimeout);

for(var i = 0 ;i< count + 1; ++i)
{
  //先看一下时间过了没有
  var now = new Date();
  if(ms < now - beg)
  {
  break;
  }
  else
  {
  if( i == count)
  {
  this.xh.setTimeouts(this.lresolveTimeout,lastms,this.lsendTimeout,this.lreceiveTimeout);
  }
  //Sleep
  try
  {
  this.xh.open("GET",this.urlport,false,null,null);
  this.xh.send();
  }
  catch(e){
  }
  }
}
}


</script>
<script language=javascript runat=server>
//下面是测试程序,在指定时间内观查CPU占用率
function testSleep(timeSpan /*秒*/)
{
try
{
  var beg = new Date();
  var evlon = new Evlon();
  var nCount = 0;
  while(Response.IsClientConnected())
  {
  var end = new Date();
  Response.Write("<sc" + "ript>cs('" + end + "<br>');</sc" + "ript>\n");
  Response.Flush();
  var span = end - beg;
  if(span > timeSpan * 1000)
  {
  break;
  }
  nCount ++;
  evlon.sleep(200);
  }
  var end = new Date();
  var span = end - beg;
  var msg = '共运行' + nCount.toString() + '次\n占用时间' + span + '毫秒';
  Response.Write(msg);
}
catch(e)
{
  Response.Write(e.message);
}
}
testSleep(5);
</script>
页面2
<html>    
<head>    
<title>Asp.net Server Push</title>    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">  
var i;  
i=0;
function cs(str)
{

if (str!=""){
i=i+1;
document.getElementById("div1").innerHTML=document.getElementById("div1").innerHTML+i+':'+str+"<br>";
}
/*if(i==10){
i=0;
document.getElementById("div1").innerHTML="";
}*/
}
function getdivmsg(divname){
alert(document.getElementById(divname).innerHTML);
}
function onload(){    

var ifrpush = new ActiveXObject("htmlfile"); // 创建对象    
ifrpush.open(); //打开 
ifrpush.write("<html>");    
var ifrDiv = ifrpush.createElement("div"); //添加一个DIV    
ifrpush.appendChild(ifrDiv); //添加到 htmlfile    
ifrpush.parentWindow.cs=cs; //注册 javascript 方法     
ifrDiv.innerHTML="<iframe src='push2.asp'></iframe>"; //在div里添加 iframe 
ifrpush.write("</html>");
ifrpush.close(); //关闭    
setInterval(function () { }, 10000); //加上这行不会自动断开
}    
onload();
</script>     
</head>    
<body>    
<div style=" float:left"></div>   
<input type="button" name="btndiv" id="btndiv" onclick="getdivmsg('div1')" value="test"> 
<div id="div1" width="600" height="600"></div>    
</body>    
</html> 其中页面1中 var end = new Date();
end 的值就是要输出的数据.你可以var end="要输出的数据"; onload 中引入htmlfile组件是为了解决IE进度条问题 
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,