返回主页

我要飞翔--郝叶飞

叶子也能飞

  • 博客园
  • 闪存
  • 首页
  • 新随笔
  • 联系
  • 管理
  • 订阅 订阅
随笔- 16  文章- 1  评论- 2 
2008年7月15日
c#.net下简单的Ajax例子
我们需要两个页面a.aspx、b.aspx,a页面代码如下(就用最常见的,两个下拉列表连动的例子):
<body>
    
<form id="Form1" method="post" runat="server">
    
<select id="AList" onchange="SetBList()">
        
<option value="0">A</option>
        
<option value="1">B</option>
        
<option value="3">C</option>
    
</select>
    
<select id="BList"></select>
     
</form>
  
</body>
当a页面触发onchange事件后,我们进入写在a页面的SetBList()方法中,这里将完整的js列出来:
<script language="javascript">
var xmlHttp;

function SetBList() ...{
    
var avalue = document.getElementById("AList").value;

    
var url = "b.aspx?Avalue=" + avalue;
     createXMLHttpRequest();  
// 创建xmlHttp对象
     xmlHttp.onreadystatechange = handleStateChange;  // 当xmlHttp状态码发生改变时,调用handleStateChage方法
     xmlHttp.open("GET", url, true);   // GET方法发送请求
     xmlHttp.send(null);
}

function BListInitial() ...{
    
// 先清空一下BList的option
     clearBList();

    
var blist = document.getElementById("BList");  // 获取BList对象
    var rs = xmlHttp.responseXML.getElementsByTagName("City");  // 从返回xml文档中,读取<City>标签的数据
    // 这个循环取值的地方,卡了我一会,将xmlHttp.responseXML创建成一个xml文档,然后找读文档的方法,但问题是不同浏览器创建xml文档的方法不一样
    for(var i=0;i<rs.length;i++) {
        
var option = document.createElement("OPTION");
         option.text
= rs[i].getElementsByTagName("CityName");
         option.value
= rs[i].getElementsByTagName("CityCode");
         blist.options.add(option);
     }
}

function clearBList() ...{
    
var ven = document.getElementById("VendorList");
    
while(ven.options.length > 0)
         ven.removeChild(ven.childNodes[
0]);
}

function handleStateChange() ...{
    
if(xmlHttp.readyState == 4) ...{
        
if(xmlHttp.status == 200) ...{
             BListInitial();
         }
     }
}

function createXMLHttpRequest() ...{
    
// IE
    if (window.ActiveXObject) ...{
         xmlHttp
= new ActiveXObject("Microsoft.XMLHTTP");
     }
    
// Mozilla
    else if (window.XMLHttpRequest) ...{
         xmlHttp
= new XMLHttpRequest();
     }
}
</script>
b.aspx页面将html部分全部删除,仅仅留一行:
<%@ Page language="c#" Codebehind="b.aspx.cs" AutoEventWireup="false" Inherites="Test.Ajax" %>
原因是我们a页面要求返回的xml文档,因此,我们将Html标签部分删除。然后在b页面的Page_Load方法中,对数据库进行操作,然后数据写成xml的格式,例如
// 数据库操作,得到DataTable dt

string xml = "<Data>";
foreach(DataRow row in dt.Rows)   {
     xml
+= "<City>";
     xml
+= "<CityName>" + row["CityName"] + "</CityName>";
     xml
+= "<CityCode>" + row["CityCode"] + "</CityCode>";
     xml
+= "</City>";
}
xml
+= "</Data>";

//   清页面格式,写xml
Response.ClearContent();
Response.Cache.SetNoStore();
Response.ContentType
= "text/xml";
Response.ContentEncoding
= System.Text.Encoding.UTF8;
Response.Write(xml);

在整体运行之前可以先将b页面测试一下,如果得到类似如下结果,则说明,数据部分是没问题的

- <Data>
     -
<Vendor>
        
<VendorId>7</VendorId>
       
<VendorName>千千</VendorName>
   
</Vendor>
</Data>

posted @ 2008-07-15 14:19 叶子飞起来了 阅读(93) 评论(0) 编辑
2008年7月11日
ASP.NET Application,Session,Cookie和ViewState等对象用法和区别

ASP.NET Application,Session,Cookie和ViewState等对象用法和区别

在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等。下面分别介绍它们的用法和区别。

 

1.Application对象

        Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合. 下面我们做个在线用户统计的例子来说明这个问题:

    (以文件的形式存放网站总访问量)

Global.asax类

using System;

using System.Collections;

using System.ComponentModel;

using System.Web;

using System.Web.SessionState;

using System.IO;

/// Global 的摘要说明。

public

class Global : System.Web.HttpApplication

    {

///

必需的设计器变量。

private System.ComponentModel.IContainer components = null;

        private FileStream fileStream;

        private StreamReader reader;//读字符流

private StreamWriter writer;//写字符流

       

        public Global()

        {

            InitializeComponent();

        }   

        protected

void Application_Start(Object sender, EventArgs e)

        {

            Application["CurrentGuests"]=0;//初始花为0;

            fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,创建文件

            reader = new StreamReader(fileStream);//要读取的完整路径

            Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //从当前流中读取一行字符并将数据作为字符串返回

            reader.Close();//关闭流

        }

        protected

void Session_Start(Object sender, EventArgs e)//当用户访问网站时,在线用户+1,总访问数+1

        {

            Application.Lock();//同步,避免同时写入

           

            Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//总在线用户数

            Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//访问网站的总用户数

            fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);//

            writer = new StreamWriter(fileStream);//实现一个写入流,使其以一种特定的编码向流中写入字符

            writer.WriteLine(Application["AllGuests"].ToString());//把访问网站的总用户数再次写入到文件

            writer.Close();//关闭写入流

            Application.UnLock();//同步结束

        }

        protected

void Session_End(Object sender, EventArgs e)//当前用户退出网站时,在线用户数量-1,

        {

            Application.Lock();

            Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//总在线用户数量-1

            Application.UnLock();   

        }

    (2) WebForm1.aspx

    private

void Page_Load(object sender, System.EventArgs e)

        {

            this.Label1.Text = "正在访问站点的用户数:" + Application["CurrentGuests"].ToString();   

            this.Label2.Text ="访问过站点的总用户数:" + Application["AllGuests"].ToString();

        }

2.Session对象

      Session用于保存每个用户的专用信息.每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择.使用Session对象保存信息的代码如下:

//存放信息

Session["key"]="value"

//读取数据

string UserName=Session["key"].ToString();

3.Cookie对象

    Cookie用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性.使用Cookie对象保存的代码如下:

//存放信息

Response.Cookies["key"].Value="value";

//读取信息

string UserID=Response.Cookies["key"].Value;

4.ViewState对象

    ViewState 常用于保存单个用户的状态信息,有效期等于页面的生存期。跟隐藏控件相似。viewstate是在本页面之内各函数间进行传值的 , 至于为什么要使用这种方法是因为在一个事件发生之后 , 页面可能会刷新 , 如果定义全局变量会被清零 , 所以要使用 viewstate. ViewState容器可以保持大量的数据,但是必须谨慎使用,因为过多使用会影响应用程序的性能。所有Web服务器控件都使用ViewState在页面回发期音保存自己的状态信息。如果某个控件不需要在回发期间保存状态信息,最好关闭该对象的ViewState,避免不必要的资源浪费。通过给@Page指令添加“EnableViewState=false”属性可以禁止整个页面的ViewState。使用ViewState对象保存信息的代码如下。

//存放信息

  ViewState["key"]="value";

  //读取信息

  string NameID=ViewState["nameID"].ToString();

5.Cache对象

  Cache对象用于在HTTP请求间保存页面或数据。该对象的使用可以极大地提高整个应用程序的效率。常用于将频繁访问的大量服务器资源存储在内存中,当用户发出相同的请求后服务器不再次处理而是将Cache中保存的信息返回给用户,节省了服务器处理请求的时间。其生存期依赖于该应用程序的生存期。当重新启动应用程序时,将重新创建其Cache对象的实例。使用Cache对象保存信息的代码如下。

//存放信息

  Cache["nameID"]="0001";

//存放信息

  Cache.Insert("nameID","0001"1);

  //读取信息

  string NameID=Cache["nameID"].ToString();

  6.隐藏域

  Hidden控件是属于HTML类型的服务器控件,使用此控件可以实现隐藏域的功能。其实此控件和其它服务器控件的使用没有太大区别,只是它不会在用户端的浏览器中显示,始终处于隐藏状态。但是每次页面提交的时候,此控件和其它服务器控件一同提交到服务器端,因此在服务器端可以使用Value属性获取或保存一些数据信息。使用Hidden控件保存信息的代码如下。

//存放信息

  Hidden.Value="0001";

  //获取信息

  string NameID=Hidden.Value;

  7.查询字符串

查询字符串的方式是将要传递的值连接在URL后面,然后通过Response.Redirect方法实现客户端的重定向。这种方式可以实现在两个页面之间传递信息。由于URL的长度有一定的限制,因此不能传递太大的信息,加外安全性也不是很好。

  传递信息如下。

问号后面格式 key1=value1&key2=value2

Response.Redirect("List.aspx?nameID=0001&gradeID=002");

  //执行上面的语句后在IE地址栏显示的URL的代码如下。

  http://localhost/List.aspx?nameID=0001&grade=002

  //当跳转到List.aspx后,可以通过以下代码获得所传递的信息。

string NameID.GradeID;

  NameID=Request.Params["nameID"];

  GradeID=Request.Params["gradeID"];

posted @ 2008-07-11 21:03 叶子飞起来了 阅读(117) 评论(0) 编辑
CURL --- 命令行浏览器

CURL --- 命令行浏览器CURL

 
CURL --- 命令行浏览器
CURL? 嗯,说来话长了~~~~

这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑

1)
二话不说,先从这里开始吧!

curl http://www.yahoo.com

回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了~~~~~

2)
嗯,要想把读过来页面存下来,是不是要这样呢?
curl http://www.yahoo.com > page.html

当然可以,但不用这么麻烦的!
用curl的内置option就好,存下http的结果,用这个option: -o
curl -o page.html http://www.yahoo.com

这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就OK咯

3)
什么什么?!访问不到?肯定是你的proxy没有设定了。
使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x
curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com


4)
访问有些网站的时候比较讨厌,他使用cookie来记录session信息。
像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....
我们来学习这个option: -D <-- 这个是把http的response里面的cookie信息存到一个特别的文件中去
curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了


5)
那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,
来判断你是不是不按规矩访问他们的网站的。
这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b
curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com

这样,我们就可以几乎模拟所有的IE操作,去访问网页了!


6)
稍微等等~~~~~我好像忘记什么了~~~~~
对了!是浏览器信息~~~~

有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本~~~~
NND,哪里有时间为了它去找这些怪异的浏览器呢!?

好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的IE6.0,嘿嘿嘿,其实也许你用的是苹果机呢!

而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台PC上跑着的Linux,用的是Netscape 4.73,呵呵呵


7)
另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不 是首页的地址,就可以断定那是个盗连了~~~~~

讨厌讨厌~~~我就是要盗连~~~~~!!
幸好curl给我们提供了设定referer的option: -e
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com

这样,就可以骗对方的服务器,你是从mail.yahoo.com点击某个链接过来的了,呵呵呵


8)
写着写着发现漏掉什么重要的东西了!----- 利用curl 下载文件

刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。
比如, curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
这里教大家一个新的option: -O
大写的O,这么用: curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
这样,就可以按照服务器上的文件名,自动存在本地了!

再来一个更好用的。
如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?
不干!
在curl里面,这么写就可以了:
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

呵呵呵,厉害吧?!~~~

9)
再来,我们继续讲解下载!
curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

这样产生的下载,就是
~zzh/001.JPG
~zzh/002.JPG
...
~zzh/201.JPG
~nick/001.JPG
~nick/002.JPG
...
~nick/201.JPG

够方便的了吧?哈哈哈

咦?高兴得太早了。
由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了~~~

没关系,我们还有更狠的!
curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

--这是.....自定义文件名的下载?
--对头,呵呵!

#1是变量,指的是{zzh,nick}这部分,第一次取值zzh,第二次取值nick
#2代表的变量,则是第二段可变部分---[001-201],取值从001逐一加到201
这样,自定义出来下载下来的文件名,就变成了这样:
原来: ~zzh/001.JPG ---> 下载后: 001-zzh.JPG
原来: ~nick/001.JPG ---> 下载后: 001-nick.JPG

这样一来,就不怕文件重名啦,呵呵


9)
继续讲下载
我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。
curl在这些方面也不输给谁,嘿嘿

比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传
curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

当然,你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~

分块下载,我们使用这个option就可以了: -r
举例说明
比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载(赵老师的电话朗诵 :D )
我们就可以用这样的命令:
curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

这样就可以分块下载啦。
不过你需要自己把这些破碎的文件合并起来
如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以
如果用的是Windows,用copy /b 来解决吧,呵呵


上面讲的都是http协议的下载,其实ftp也一样可以用。
用法嘛,
curl -u name:passwd ftp://ip:port/path/file
或者大家熟悉的
curl ftp://name:passwd@ip:port/path/file



10)
说完了下载,接下来自然该讲上传咯
上传的option是 -T

比如我们向ftp传一个文件: curl -T localfile -u name:passwd ftp://upload_site:port/path/

当然,向http服务器上传文件也可以
比如 curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi
注意,这时候,使用的协议是HTTP的PUT method

刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢!
GET和POST都不能忘哦。

http提交一个表单,比较常用的是POST模式和GET模式

GET模式什么option都不用,只需要把变量写在url里面就可以了
比如:
curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345

而POST模式的option则是 -d

比如,curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi
就相当于向这个站点发出一次登陆申请~~~~~

到底该用GET模式还是POST模式,要看对面服务器的程序设定。

一点需要注意的是,POST模式下的文件上的文件上传,比如
<form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">
<input type=file name=upload>
<input type=submit name=nick value="go">
</form>
这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:
curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法
比如 https的时候使用本地证书,就可以这样
curl -E localcert.pem https://remote_server

再比如,你还可以用curl通过dict协议去查字典~~~~~
curl dict://dict.org/d:computer
posted @ 2008-07-11 15:41 叶子飞起来了 阅读(84) 评论(0) 编辑
PHP中的CURL函数库

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

<?php
$ch = curl_init("http://www.baidu.com/");
curl_exec($ch);
curl_close($ch);
?>

curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的

<?php
print_r(curl_version())
?>

curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:

<?php
$ch = curl_init("http://www.baidu.com/");
print_r(curl_getinfo($ch));
?>

可选的常量包括:

CURLINFO_EFFECTIVE_URL
最后一个有效的url地址

CURLINFO_HTTP_CODE
最后一个收到的HTTP代码

CURLINFO_FILETIME
远程获取文档的时间,如果无法获取,则返回值为“-1”

CURLINFO_TOTAL_TIME
最后一次传输所消耗的时间

CURLINFO_NAMELOOKUP_TIME
名称解析所消耗的时间

CURLINFO_CONNECT_TIME
建立连接所消耗的时间

CURLINFO_PRETRANSFER_TIME
从建立连接到准备传输所使用的时间

CURLINFO_STARTTRANSFER_TIME
从建立连接到传输开始所使用的时间

CURLINFO_REDIRECT_TIME
在事务传输开始前重定向所使用的时间

CURLINFO_SIZE_UPLOAD
上传数据量的总值

CURLINFO_SIZE_DOWNLOAD
下载数据量的总值

CURLINFO_SPEED_DOWNLOAD
平均下载速度

CURLINFO_SPEED_UPLOAD
平均上传速度

CURLINFO_HEADER_SIZE
header部分的大小

CURLINFO_HEADER_OUT
发送请求的字符串

CURLINFO_REQUEST_SIZE
在HTTP请求中有问题的请求的大小

CURLINFO_SSL_VERIFYRESULT
Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER

CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length: field中读取的下载内容长度

CURLINFO_CONTENT_LENGTH_UPLOAD
上传内容大小的说明

CURLINFO_CONTENT_TYPE
下载内容的“Content-type”值,NULL表示服务器没有发送有效的“Content-Type: header”

curl_setopt()函数的作用是为一个curl设置会话参数。curl_setopt_array()函数的作用是以数组的形式为一个curl设置会话参数。

<?php
$ch = curl_init();
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
$options = array(
    
CURLOPT_URL => 'http://www.baidu.com/',
    
CURLOPT_HEADER => false
    
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

可设置的参数有:

CURLOPT_AUTOREFERER
自动设置header中的referer信息

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER时候将获取数据返回

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认为true。

CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
TRUE to use EPRT (and LPRT) when doing active FTP downloads. Use FALSE to disable EPRT and LPRT and use PORT only.
Added in PHP 5.0.0.

CURLOPT_FTP_USE_EPSV
TRUE to first try an EPSV command for FTP transfers before reverting back to PASV. Set to FALSE to disable EPSV.

CURLOPT_FTPAPPEND
TRUE to append to the remote file instead of overwriting it.

CURLOPT_FTPASCII
An alias of CURLOPT_TRANSFERTEXT. Use that instead.

CURLOPT_FTPLISTONLY
TRUE to only list the names of an FTP directory.

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
讲curl函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的body部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为true

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认打开。

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE

CURLOPT_RETURNTRANSFER
讲curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

CURLOPT_SSL_VERIFYPEER
FALSE to stop cURL from verifying the peer's certificate. Alternate certificates to verify against can be specified with the CURLOPT_CAINFO option or a certificate directory can be specified with the CURLOPT_CAPATH option. CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default as of cURL 7.10. Default bundle installed as of cURL 7.10.

CURLOPT_TRANSFERTEXT
TRUE to use ASCII mode for FTP transfers. For LDAP, it retrieves data in plain text instead of HTML. On Windows systems, it will not set STDOUT to binary mode.

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。

CURLOPT_UPLOAD
启用时允许文件传输

CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小,这个值每次都会被填满。

CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个,但是curl暂时还不支持。.

CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间,如果设置为0,则不等待。

CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间,默认为120秒。

CURLOPT_FTPSSLAUTH
The FTP authentication method (when is activated): CURLFTPAUTH_SSL (try SSL first), CURLFTPAUTH_TLS (try TLS first), or CURLFTPAUTH_DEFAULT (let cURL decide).

CURLOPT_HTTP_VERSION
设置curl使用的HTTP协议,CURL_HTTP_VERSION_NONE(让curl自己判断),CURL_HTTP_VERSION_1_0(HTTP/1.0),CURL_HTTP_VERSION_1_1(HTTP/1.1)

CURLOPT_HTTPAUTH
使用的HTTP验证方法,可选的值有:CURLAUTH_BASIC,CURLAUTH_DIGEST,CURLAUTH_GSSNEGOTIATE,CURLAUTH_NTLM,CURLAUTH_ANY,CURLAUTH_ANYSAFE,可以使用“|”操作符分隔多个值,curl让服务器选择一个支持最好的值,CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM,CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM

CURLOPT_INFILESIZE
设定上传文件的大小

CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_LOW_SPEED_TIME
The number of seconds the transfer should be below CURLOPT_LOW_SPEED_LIMIT for PHP to consider the transfer too slow and abort.
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_MAXCONNECTS
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接

CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT
一个可选的用来指定连接端口的量

CURLOPT_PROXYAUTH
The HTTP authentication method(s) to use for the proxy connection. Use the same bitmasks as described in CURLOPT_HTTPAUTH. For proxy authentication, only CURLAUTH_BASIC and CURLAUTH_NTLM are currently supported.

CURLOPT_PROXYPORT
The port number of the proxy to connect to. This port number can also be set in CURLOPT_PROXY.

CURLOPT_PROXYTYPE
Either CURLPROXY_HTTP (default) or CURLPROXY_SOCKS5.

CURLOPT_RESUME_FROM
在恢复传输时传递一个字节偏移量(用来断点续传)

CURLOPT_SSL_VERIFYHOST
1 to check the existence of a common name in the SSL peer certificate.
2 to check the existence of a common name and also verify that it matches the hostname provided.

CURLOPT_SSLVERSION
The SSL version (2 or 3) to use. By default PHP will try to determine this itself, although in some cases this must be set manually.

CURLOPT_TIMECONDITION
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADER为true,则返回一个"304 Not Modified"的header,CURLOPT_HEADER为false,则使用CURL_TIMECOND_ISUNMODSINCE,默认值为CURL_TIMECOND_IFMODSINCE

CURLOPT_TIMEOUT
设置curl允许执行的最长秒数

CURLOPT_TIMEVALUE
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

CURLOPT_CAINFO
The name of a file holding one or more certificates to verify the peer with. This only makes sense when used in combination with CURLOPT_SSL_VERIFYPEER.

CURLOPT_CAPATH
A directory that holds multiple CA certificates. Use this option alongside CURLOPT_SSL_VERIFYPEER.

CURLOPT_COOKIE
设定HTTP请求中“Set-Cookie:”部分的内容。

CURLOPT_COOKIEFILE
包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

CURLOPT_COOKIEJAR
连接关闭以后,存放cookie信息的文件名称

CURLOPT_CUSTOMREQUEST
A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request. This is useful for doing "DELETE" or other, more obscure HTTP requests. Valid values are things like "GET", "POST", "CONNECT" and so on; i.e. Do not enter a whole HTTP request line here. For instance, entering "GET /index.html HTTP/1.0\r\n\r\n" would be incorrect.
Note: Don't do this without making sure the server supports the custom request method first.

CURLOPT_EGBSOCKET
Like CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket.

CURLOPT_ENCODING
header中“Accept-Encoding: ”部分的内容,支持的编码格式为:"identity","deflate","gzip"。如果设置为空字符串,则表示支持所有的编码格式

CURLOPT_FTPPORT
The value which will be used to get the IP address to use for the FTP "POST" instruction. The "POST" instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a hostname, a network interface name (under Unix), or just a plain '-' to use the systems default IP address.

CURLOPT_INTERFACE
在外部网络接口中使用的名称,可以是一个接口名,IP或者主机名。

CURLOPT_KRB4LEVEL
KRB4(Kerberos 4)安全级别的设置,可以是一下几个值之一:"clear","safe","confidential","private"。默认的值为"private",设置为null的时候表示禁用KRB4,现在KRB4安全仅能在FTP传输中使用。

CURLOPT_POSTFIELDS
在HTTP中的“POST”操作。如果要传送一个文件,需要一个@开头的文件名

CURLOPT_PROXY
设置通过的HTTP代理服务器

CURLOPT_PROXYUSERPWD
连接到代理服务器的,格式为“[username]:[password]”的用户名和密码。

CURLOPT_RANDOM_FILE
设定存放SSL用到的随机数种子的文件名称

CURLOPT_RANGE
设置HTTP传输范围,可以用“X-Y”的形式设置一个传输区间,如果有多个HTTP传输,则使用逗号分隔多个值,形如:"X-Y,N-M"。

CURLOPT_REFERER
设置header中"Referer: " 部分的值。

CURLOPT_SSL_CIPHER_LIST
A list of ciphers to use for SSL. For example, RC4-SHA and TLSv1 are valid cipher lists.

CURLOPT_SSLCERT
传递一个包含PEM格式证书的字符串。

CURLOPT_SSLCERTPASSWD
传递一个包含使用CURLOPT_SSLCERT证书必需的密码。

CURLOPT_SSLCERTTYPE
The format of the certificate. Supported formats are "PEM" (default), "DER", and "ENG".

CURLOPT_SSLENGINE
The identifier for the crypto engine of the private SSL key specified in CURLOPT_SSLKEY.

CURLOPT_SSLENGINE_DEFAULT
The identifier for the crypto engine used for asymmetric crypto operations.

CURLOPT_SSLKEY
The name of a file containing a private SSL key.

CURLOPT_SSLKEYPASSWD
The secret password needed to use the private SSL key specified in CURLOPT_SSLKEY.
Note: Since this option contains a sensitive password, remember to keep the PHP script it is contained within safe.

CURLOPT_SSLKEYTYPE
The key type of the private SSL key specified in CURLOPT_SSLKEY. Supported key types are "PEM" (default), "DER", and "ENG".

CURLOPT_URL
需要获取的URL地址,也可以在PHP的curl_init()函数中设置。

CURLOPT_USERAGENT
在HTTP请求中包含一个”user-agent”头的字符串。

CURLOPT_USERPWD
传递一个连接中需要的用户名和密码,格式为:“[username]:[password]”。

CURLOPT_HTTP200ALIASES
设置不再以error的形式来处理HTTP 200的响应,格式为一个数组。

CURLOPT_HTTPHEADER
设置一个header中传输内容的数组。

CURLOPT_POSTQUOTE
An array of FTP commands to execute on the server after the FTP request has been performed.

CURLOPT_QUOTE
An array of FTP commands to execute on the server prior to the FTP request.

CURLOPT_FILE
设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。

CURLOPT_INFILE
在上传文件的时候需要读取的文件地址,值是一个资源类型。

CURLOPT_STDERR
设置一个错误输出地址,值是一个资源类型,取代默认的STDERR。

CURLOPT_WRITEHEADER
设置header部分内容的写入的文件地址,值是一个资源类型。

CURLOPT_HEADERFUNCTION
设置一个回调函数,这个函数有两个参数,第一个是curl的资源句柄,第二个是输出的header数据。header数据的输出必须依赖这个函数,返回已写入的数据大小。

CURLOPT_PASSWDFUNCTION
设置一个回调函数,有三个参数,第一个是curl的资源句柄,第二个是一个密码提示符,第三个参数是密码长度允许的最大值。返回密码的值。

CURLOPT_READFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是读取到的数据。数据读取必须依赖这个函数。返回读取数据的大小,比如0或者EOF。

CURLOPT_WRITEFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是写入的数据。数据写入必须依赖这个函数。返回精确的已写入数据的大小

curl_copy_handle()函数的作用是拷贝一个curl连接资源的所有内容和参数

<?php
$ch = curl_init("http://www.baidu.com/");
$another = curl_copy_handle($ch);
curl_exec($another);
curl_close($another);
?>

curl_error()函数的作用是返回一个包含当前会话错误信息的字符串。
curl_errno()函数的作用是返回一个包含当前会话错误信息的数字编号。

curl_multi_init()函数的作用是初始化一个curl批处理句柄资源。
curl_multi_add_handle()函数的作用是向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_exec()函数的作用是解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。
curl_multi_remove_handle()函数表示移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_close()函数的作用是关闭一个批处理句柄资源。

<?php
$ch1 = curl_init();
$ch2 = curl_init();
 
curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
 
$mh = curl_multi_init();
 
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
 
do {
    
curl_multi_exec($mh,$flag);
} while ($flag > 0);
 
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
?>

curl_multi_getcontent()函数的作用是在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()函数的作用是获取当前解析的curl的相关传输信息。

curl_multi_select()
Get all the sockets associated with the cURL extension, which can then be "selected"

 

One Response to “PHP中的CURL函数库(Client URL Library Function)”

posted @ 2008-07-11 13:42 叶子飞起来了 阅读(209) 评论(0) 编辑
2008年7月10日
lucene使用与优化
1 lucene简介
1.1 什么是lucene
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

1.2 lucene能做什么
要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据库表的若干个字段索引起来,那就不用再担心因为“%like%”而锁表了;你也可以写个自己的搜索引擎……

1.3 你该不该选择lucene
下面给出一些测试数据,如果你觉得可以接受,那么可以选择。
测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。
测试二:37000记录,索引数据库中的两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。

2 lucene的工作方式
lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。

2.1写入流程
源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。
将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。
将索引写入存储器,存储器可以是内存或磁盘。

2.2读出流程
用户提供搜索关键词,经过analyzer处理。
对处理后的关键词搜索索引找出对应的Document。
用户根据需要从找到的Document中提取需要的Field。

3 一些需要知道的概念
lucene用到一些概念,了解它们的含义,有利于下面的讲解。

3.1 analyzer
Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、 “the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。

3.2 document
用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。

3.3 field
一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。
Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:
还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

3.4 term
term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

3.5 tocken
tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。

3.6 segment
添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。
 
4 lucene的结构
lucene包括core和sandbox两部分,其中core是lucene稳定的核心部分,sandbox包含了一些附加功能,例如highlighter、各种分析器。
Lucene core有七个包:analysis,document,index,queryParser,search,store,util。
4.1 analysis
Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的StandardAnalyzer。
4.2 document
Document包含文档的数据结构,例如Document类定义了存储文档的数据结构,Field类定义了Document的一个域。
4.3 index
Index包含了索引的读写类,例如对索引文件的segment进行写、合并、优化的IndexWriter类和对索引进行读取和删除操作的 IndexReader类,这里要注意的是不要被IndexReader这个名字误导,以为它是索引文件的读取类,实际上删除索引也是由它完成, IndexWriter只关心如何将索引写入一个个segment,并将它们合并优化;IndexReader则关注索引文件中各个文档的组织形式。
4.4 queryParser
QueryParser包含了解析查询语句的类,lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。 Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种 Query类查找出结果。
4.5 search
Search包含了从索引中搜索结果的各种类,例如刚才说的各种Query类,包括TermQuery、BooleanQuery等就在这个包里。
4.6 store
Store包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。
4.7 util
Util包含一些公共工具类,例如时间和字符串之间的转换工具。
5 如何建索引
5.1 最简单的能完成索引的代码片断

IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();

下面我们分析一下这段代码。
首先我们创建了一个writer,并指定存放索引的目录为“/data/index”,使用的分析器为StandardAnalyzer,第三个参数说明如果已经有索引文件在索引目录下,我们将覆盖它们。
然后我们新建一个document。
我们向document添加一个field,名字是“title”,内容是“lucene introduction”,对它进行存储并索引。
再添加一个名字是“content”的field,内容是“lucene works well”,也是存储并索引。
然后我们将这个文档添加到索引中,如果有多个文档,可以重复上面的操作,创建document并添加。
添加完所有document,我们对索引进行优化,优化主要是将多个segment合并到一个,有利于提高索引速度。
随后将writer关闭,这点很重要。

对,创建索引就这么简单!
当然你可能修改上面的代码获得更具个性化的服务。

5.2 将索引直接写在内存
你需要首先创建一个RAMDirectory,并将其传给writer,代码如下:

Directory dir = new RAMDirectory();
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();

5.3 索引文本文件
如果你想把纯文本文件索引起来,而不想自己将它们读入字符串创建field,你可以用下面的代码创建field:

Field field = new Field("content", new FileReader(file));

这里的file就是该文本文件。该构造函数实际上是读去文件内容,并对其进行索引,但不存储。

6 如何维护索引
索引的维护操作都是由IndexReader类提供。

6.1 如何删除索引
lucene提供了两种从索引中删除document的方法,一种是

void deleteDocument(int docNum)

这种方法是根据document在索引中的编号来删除,每个document加进索引后都会有个唯一编号,所以根据编号删除是一种精确删除,但是这个编号是索引的内部结构,一般我们不会知道某个文件的编号到底是几,所以用处不大。另一种是

void deleteDocuments(Term term)

这种方法实际上是首先根据参数term执行一个搜索操作,然后把搜索到的结果批量删除了。我们可以通过这个方法提供一个严格的查询条件,达到删除指定document的目的。
下面给出一个例子:

Directory dir = FSDirectory.getDirectory(PATH, false);
IndexReader reader = IndexReader.open(dir);
Term term = new Term(field, key);
reader.deleteDocuments(term);
reader.close();

6.2 如何更新索引
lucene并没有提供专门的索引更新方法,我们需要先将相应的document删除,然后再将新的document加入索引。例如:

Directory dir = FSDirectory.getDirectory(PATH, false);
IndexReader reader = IndexReader.open(dir);
Term term = new Term(“title”, “lucene introduction”);
reader.deleteDocuments(term);
reader.close();

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene is funny", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();
7 如何搜索
lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。你或许会不自觉地拿它跟SQL语句进行比较:“lucene能执行and、or、order by、where、like ‘%xx%’操作吗?”回答是:“当然没问题!”

7.1 各种各样的Query
下面我们看看lucene到底允许我们进行哪些查询操作:

7.1.1 TermQuery
首先介绍最基本的查询,如果你想执行一个这样的查询:“在content域中包含‘lucene’的document”,那么你可以用TermQuery:

Term t = new Term("content", " lucene";
Query query = new TermQuery(t);

7.1.2 BooleanQuery
如果你想这么查询:“在content域中包含java或perl的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:

TermQuery termQuery1 = new TermQuery(new Term("content", "java");
TermQuery termQuery 2 = new TermQuery(new Term("content", "perl");
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(termQuery 1, BooleanClause.Occur.SHOULD);
booleanQuery.add(termQuery 2, BooleanClause.Occur.SHOULD);

7.1.3 WildcardQuery
如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:

Query query = new WildcardQuery(new Term("content", "use*");

7.1.4 PhraseQuery
你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:

PhraseQuery query = new PhraseQuery();
query.setSlop(5);
query.add(new Term("content ", “中”));
query.add(new Term(“content”, “日”));

那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中国某高层领导说日本欠扁”。

7.1.5 PrefixQuery
如果你想搜以‘中’开头的词语,你可以用PrefixQuery:

PrefixQuery query = new PrefixQuery(new Term("content ", "中");

7.1.6 FuzzyQuery
FuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟‘wuzza’相似的词语,你可以:

Query query = new FuzzyQuery(new Term("content", "wuzza");

你可能得到‘fuzzy’和‘wuzzy’。

7.1.7 RangeQuery
另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery:

RangeQuery query = new RangeQuery(new Term(“time”, “20060101”), new Term(“time”, “20060130”), true);

最后的true表示用闭合区间。

7.2 QueryParser
看了这么多Query,你可能会问:“不会让我自己组合各种Query吧,太麻烦了!”当然不会,lucene提供了一种类似于SQL语句的查询语句,我们姑且叫它lucene语句,通过它,你可以把各种查询一句话搞定,lucene会自动把它们查分成小块交给相应Query执行。下面我们对应每种Query演示一下:
TermQuery可以用“field:key”方式,例如“content:lucene”。
BooleanQuery中‘与’用‘+’,‘或’用‘ ’,例如“content:java contenterl”。
WildcardQuery仍然用‘?’和‘*’,例如“content:use*”。
PhraseQuery用‘~’,例如“content:"中日"~5”。
PrefixQuery用‘*’,例如“中*”。
FuzzyQuery用‘~’,例如“content: wuzza ~”。
RangeQuery用‘[]’或‘{}’,前者表示闭区间,后者表示开区间,例如“time:[20060101 TO 20060130]”,注意TO区分大小写。
你可以任意组合query string,完成复杂操作,例如“标题或正文包括lucene,并且时间在20060101到20060130之间的文章”可以表示为:“+ (title:lucene content:lucene) +time:[20060101 TO 20060130]”。代码如下:

Directory dir = FSDirectory.getDirectory(PATH, false);
IndexSearcher is = new IndexSearcher(dir);
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
Query query = parser.parse("+(title:lucene content:lucene) +time:[20060101 TO 20060130]";
Hits hits = is.search(query);
for (int i = 0; i < hits.length(); i++)
{
Document doc 
= hits.doc(i);
System.out.println(doc.get("title");
}
is.close();

首先我们创建一个在指定文件目录上的IndexSearcher。
然后创建一个使用StandardAnalyzer作为分析器的QueryParser,它默认搜索的域是content。
接着我们用QueryParser来parse查询字串,生成一个Query。
然后利用这个Query去查找结果,结果以Hits的形式返回。
这个Hits对象包含一个列表,我们挨个把它的内容显示出来。

7.3 Filter
filter的作用就是限制只查询索引的某个子集,它的作用有点像SQL语句里的where,但又有区别,它不是正规查询的一部分,只是对数据源进行预处理,然后交给查询语句。注意它执行的是预处理,而不是对查询结果进行过滤,所以使用filter的代价是很大的,它可能会使一次查询耗时提高一百倍。
最常用的filter是RangeFilter和QueryFilter。RangeFilter是设定只搜索指定范围内的索引;QueryFilter是在上次查询的结果中搜索。
Filter的使用非常简单,你只需创建一个filter实例,然后把它传给searcher。继续上面的例子,查询“时间在20060101到20060130之间的文章”除了将限制写在query string中,你还可以写在RangeFilter中:

Directory dir 
= FSDirectory.getDirectory(PATH, false);
IndexSearcher is 
= new IndexSearcher(dir);
QueryParser parser 
= new 
QueryParser("content", new StandardAnalyzer());
Query query 
= parser.parse("title:lucene 
content:lucene";
RangeFilter filter 
= new 
RangeFilter("time", "20060101", "20060230", true, true);
Hits hits 
= is.search(query, 
filter);
for (int i 
i < hits.length(); i++)
{
Document doc 
= hits.doc(i);
System.out.println(doc.get("title");
}
is.close();

7.4 Sort
有时你想要一个排好序的结果集,就像SQL语句的“order by”,lucene能做到:通过Sort。
Sort sort 
Sort(“time”); //相当于SQL的“order by time”
Sort sort 
= new 
Sort(“time”, true); // 相当于SQL的“order by time desc”
下面是一个完整的例子:

Directory dir 
= FSDirectory.getDirectory(PATH, 
false);
IndexSearcher is 
= new 
IndexSearcher(dir);
QueryParser parser 
= new 
QueryParser("content", new StandardAnalyzer());
Query query 
= parser.parse("title:lucene 
content:lucene";
RangeFilter filter 
= new 
RangeFilter("time", "20060101", "20060230", true, true);
Sort sort 
= new 
Sort(“time”);
Hits hits 
= is.search(query, 
filter, sort);
for (int i 
= 0; i < hits.length(); i++)
{
Document doc 
= hits.doc(i);
System.out.println(doc.get("title");
}
is.close();

8 分析器
在前面的概念介绍中我们已经知道了分析器的作用,就是把句子按照语义切分成一个个词语。英文切分已经有了很成熟的分析器: StandardAnalyzer,很多情况下StandardAnalyzer是个不错的选择。甚至你会发现StandardAnalyzer也能对中文进行分词。
但是我们的焦点是中文分词,StandardAnalyzer能支持中文分词吗?实践证明是可以的,但是效果并不好,搜索“如果”会把“牛奶不如果汁好喝”也搜索出来,而且索引文件很大。那么我们手头上还有什么分析器可以使用呢?core里面没有,我们可以在sandbox里面找到两个: ChineseAnalyzer和CJKAnalyzer。但是它们同样都有分词不准的问题。相比之下用StandardAnalyzer和 ChineseAnalyzer建立索引时间差不多,索引文件大小也差不多,CJKAnalyzer表现会差些,索引文件大且耗时比较长。
要解决问题,首先分析一下这三个分析器的分词方式。StandardAnalyzer和ChineseAnalyzer都是把句子按单个字切分,也就是说 “牛奶不如果汁好喝”会被它们切分成“牛 奶 不 如 果 汁 好 喝”;而CJKAnalyzer则会切分成“牛奶 奶不 不如 如果 果汁 汁好好喝”。这也就解释了为什么搜索“果汁”都能匹配这个句子。
以上分词的缺点至少有两个:匹配不准确和索引文件大。我们的目标是将上面的句子分解成“牛奶 不如 果汁好喝”。这里的关键就是语义识别,我们如何识别“牛奶”是一个词而“奶不”不是词语?我们很自然会想到基于词库的分词法,也就是我们先得到一个词库,里面列举了大部分词语,我们把句子按某种方式切分,当得到的词语与词库中的项匹配时,我们就认为这种切分是正确的。这样切词的过程就转变成匹配的过程,而匹配的方式最简单的有正向最大匹配和逆向最大匹配两种,说白了就是一个从句子开头向后进行匹配,一个从句子末尾向前进行匹配。基于词库的分词词库非常重要,词库的容量直接影响搜索结果,在相同词库的前提下,据说逆向最大匹配优于正向最大匹配。
当然还有别的分词方法,这本身就是一个学科,我这里也没有深入研究。回到具体应用,我们的目标是能找到成熟的、现成的分词工具,避免重新发明车轮。经过网上搜索,用的比较多的是中科院的ICTCLAS和一个不开放源码但是免费的JE-Analysis。ICTCLAS有个问题是它是一个动态链接库, java调用需要本地方法调用,不方便也有安全隐患,而且口碑也确实不大好。JE-Analysis效果还不错,当然也会有分词不准的地方,相比比较方便放心。
= new 
= 0; 
9 性能优化
一直到这里,我们还是在讨论怎么样使lucene跑起来,完成指定任务。利用前面说的也确实能完成大部分功能。但是测试表明lucene的性能并不是很好,在大数据量大并发的条件下甚至会有半分钟返回的情况。另外大数据量的数据初始化建立索引也是一个十分耗时的过程。那么如何提高lucene的性能呢?下面从优化创建索引性能和优化搜索性能两方面介绍。

9.1 优化创建索引性能
这方面的优化途径比较有限,IndexWriter提供了一些接口可以控制建立索引的操作,另外我们可以先将索引写入RAMDirectory,再批量写入FSDirectory,不管怎样,目的都是尽量少的文件IO,因为创建索引的最大瓶颈在于磁盘IO。另外选择一个较好的分析器也能提高一些性能。

9.1.1 通过设置IndexWriter的参数优化索引建立
setMaxBufferedDocs(int maxBufferedDocs)
控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度,默认为10。
setMaxMergeDocs(int maxMergeDocs)
控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。
setMergeFactor(int mergeFactor)
控制多个segment合并的频率,值较大时建立索引速度较快,默认是10,可以在建立索引时设置为100。

9.1.2 通过RAMDirectory缓写提高性能
我们可以先把索引写入RAMDirectory,达到一定数量时再批量写进FSDirectory,减少磁盘IO次数。

FSDirectory fsDir 
= FSDirectory.getDirectory("/data/index", true);
RAMDirectory ramDir 
= new RAMDirectory();
IndexWriter fsWriter 
= new IndexWriter(fsDir, new StandardAnalyzer(), true);
IndexWriter ramWriter 
= new IndexWriter(ramDir, new StandardAnalyzer(), true);
while (there are documents to index)
{
... create Document ...
ramWriter.addDocument(doc);
if (condition for flushing memory to disk has been met)
{
fsWriter.addIndexes(new Directory[] { ramDir });
ramWriter.close();
ramWriter 
= new IndexWriter(ramDir, new StandardAnalyzer(), true);
}
}

9.1.3 选择较好的分析器
这个优化主要是对磁盘空间的优化,可以将索引文件减小将近一半,相同测试数据下由600M减少到380M。但是对时间并没有什么帮助,甚至会需要更长时间,因为较好的分析器需要匹配词库,会消耗更多cpu,测试数据用StandardAnalyzer耗时133分钟;用MMAnalyzer耗时150分钟。

9.2 优化搜索性能
虽然建立索引的操作非常耗时,但是那毕竟只在最初创建时才需要,平时只是少量的维护操作,更何况这些可以放到一个后台进程处理,并不影响用户搜索。我们创建索引的目的就是给用户搜索,所以搜索的性能才是我们最关心的。下面就来探讨一下如何提高搜索性能。

9.2.1 将索引放入内存
这是一个最直观的想法,因为内存比磁盘快很多。Lucene提供了RAMDirectory可以在内存中容纳索引:

Directory fsDir 
= FSDirectory.getDirectory(“/data/index/”, false);
Directory ramDir 
= new 
RAMDirectory(fsDir);
Searcher searcher 
= new 
IndexSearcher(ramDir);

但是实践证明RAMDirectory和FSDirectory速度差不多,当数据量很小时两者都非常快,当数据量较大时(索引文件400M)RAMDirectory甚至比FSDirectory还要慢一点,这确实让人出乎意料。
而且lucene的搜索非常耗内存,即使将400M的索引文件载入内存,在运行一段时间后都会out of memory,所以个人认为载入内存的作用并不大。


9.2.2 优化时间范围限制
既然载入内存并不能提高效率,一定有其它瓶颈,经过测试发现最大的瓶颈居然是时间范围限制,那么我们可以怎样使时间范围限制的代价最小呢?
当需要搜索指定时间范围内的结果时,可以:
1、用RangeQuery,设置范围,但是RangeQuery的实现实际上是将时间范围内的时间点展开,组成一个个BooleanClause加入到 BooleanQuery中查询,因此时间范围不可能设置太大,经测试,范围超过一个月就会抛BooleanQuery.TooManyClauses,可以通过设置 BooleanQuery.setMaxClauseCount(int maxClauseCount)扩大,但是扩大也是有限的,并且随着maxClauseCount扩大,占用内存也扩大
2、用RangeFilter代替RangeQuery,经测试速度不会比RangeQuery慢,但是仍然有性能瓶颈,查询的90%以上时间耗费在 RangeFilter,研究其源码发现RangeFilter实际上是首先遍历所有索引,生成一个BitSet,标记每个document,在时间范围内的标记为true,不在的标记为false,然后将结果传递给Searcher查找,这是十分耗时的。
3、进一步提高性能,这个又有两个思路:
a、缓存Filter结果。既然RangeFilter的执行是在搜索之前,那么它的输入都是一定的,就是IndexReader,而 IndexReader是由Directory决定的,所以可以认为RangeFilter的结果是由范围的上下限决定的,也就是由具体的 RangeFilter对象决定,所以我们只要以RangeFilter对象为键,将filter结果BitSet缓存起来即可。lucene API已经提供了一个CachingWrapperFilter类封装了Filter及其结果,所以具体实施起来我们可以cache CachingWrapperFilter对象,需要注意的是,不要被CachingWrapperFilter的名字及其说明误导, CachingWrapperFilter看起来是有缓存功能,但的缓存是针对同一个filter的,也就是在你用同一个filter过滤不同 IndexReader时,它可以帮你缓存不同IndexReader的结果,而我们的需求恰恰相反,我们是用不同filter过滤同一个 IndexReader,所以只能把它作为一个封装类。
b、降低时间精度。研究Filter的工作原理可以看出,它每次工作都是遍历整个索引的,所以时间粒度越大,对比越快,搜索时间越短,在不影响功能的情况下,时间精度越低越好,有时甚至牺牲一点精度也值得,当然最好的情况是根本不作时间限制。
下面针对上面的两个思路演示一下优化结果(都采用800线程随机关键词随即时间范围):
第一组,时间精度为秒:
方式 直接用RangeFilter 使用cache 不用filter
平均每个线程耗时 10s 1s 300ms

第二组,时间精度为天
方式 直接用RangeFilter 使用cache 不用filter
平均每个线程耗时 900ms 360ms 300ms

由以上数据可以得出结论:
1、 尽量降低时间精度,将精度由秒换成天带来的性能提高甚至比使用cache还好,最好不使用filter。
2、 在不能降低时间精度的情况下,使用cache能带了10倍左右的性能提高。

9.2.3 使用更好的分析器
这个跟创建索引优化道理差不多,索引文件小了搜索自然会加快。当然这个提高也是有限的。较好的分析器相对于最差的分析器对性能的提升在20%以下。

10 一些经验

10.1关键词区分大小写
or AND TO等关键词是区分大小写的,lucene只认大写的,小写的当做普通单词。

10.2 读写互斥性
同一时刻只能有一个对索引的写操作,在写的同时可以进行搜索

10.3 文件锁
在写索引的过程中强行退出将在tmp目录留下一个lock文件,使以后的写操作无法进行,可以将其手工删除

10.4 时间格式
lucene只支持一种时间格式yyMMddHHmmss,所以你传一个yy-MM-dd HH:mm:ss的时间给lucene它是不会当作时间来处理的

10.5 设置boost
有些时候在搜索时某个字段的权重需要大一些,例如你可能认为标题中出现关键词的文章比正文中出现关键词的文章更有价值,你可以把标题的boost设置的更大,那么搜索结果会优先显示标题中出现关键词的文章(没有使用排序的前题下)。使用方法:
Field. setBoost(float boost);默认值是1.0,也就是说要增加权重的需要设置得比1大。

posted @ 2008-07-10 15:54 叶子飞起来了 阅读(190) 评论(1) 编辑
Zend Studio 实用快捷键一览表
注:本文省略“通用快捷键”描述,诸如:ctrl+N=新建,ctrl+O=打开,ctrl+C=复制,ctrl+V,ctrl+X……等等几乎所有软件 都通用的一组快捷键,而着重介绍zde独有的快捷键,了解并灵活运用这些快捷键以后,一定能帮助您在实际的项目操作中更加游刃有余。
编辑功能
组合键 实现功能 适用条件
Ctrl+/ 单行注释。当前为php代码时,则在光标所在行添加双斜杠行注释,选择多行则每一行都添加双斜杠;而当代码为html时则在行前后添加<!-- -->注释,选中多行将在选区前后添加<!-- -->注释,而非每行添加 PHP代码、html代码全部适用,不适用于CSS部分
Ctrl+Shift+/ 块注释,为选择的PHP代码添加/* */块注释,如果没有选择任何代码,则将光标所在行添加块注释 PHP代码适用,对HTML代码其功能与Ctrl+/相同
Ctrl+U 选择的代码片段全部转换为大写 php、html等均适用
Ctrl+L 选择的代码片段全部转换为小写 php、html等均适用
Ctrl+D 复制光标所在行 所有代码均适用
Ctrl+E 删除光标所在行 所有代码均适用
Tab/Shift+Tab 按tab增加代码缩进,默认为4个空格位置,可在首选项中进行设置,Shift+Tab则减少缩进,此操作对多行操作同样有效。即多行同时增加/减少缩进。 所有代码均适用
Ctrl+Alt+F 在文件中查找,打开“在文件中查找”对话框 整个ZDE环境适用
Ctrl+BackSpace 删除光标前一个单词,或者一个符号,注意这里的“一个单词”是由ZDE自行理解的,与英文中的一个单词有一定出入 所有代码均适用
Ctrl+G 转到行。打开转到行对话框,填写行数字即可转到相应行,此为通用快捷键 整个ZDE环境适用
Alt+ →,← 右箭头是定位到光标的下一个位置,左箭头则是定位到光标的上一个位置。 整个ZDE环境适用

环境切换
组合键 实现功能 适用条件
Esc 隐藏辅助窗口,以便让编辑区域最大,而文件管理器窗口不会隐藏 整个ZDE环境适用
Ctrl+W 切换自动换行,即当代码超长时是否出现横向滚动条
Ctrl+Tab 在各个编辑器标签页之间切换,也可描述为在多个打开的文件窗口间切换
Ctrl+F4 关闭当前标签页,Alt+F4是关闭整个ZDE环境,注意下区别

HTML标记
组合键 实现功能 适用条件
Ctrl+1,2,3 分别添加一对<h1>、<h2>、<h3> html标签, 所有代码部分
Ctrl+Enter 断行,即产生一个<br />标签,这里注意ZDE自动产生的为<br>标签,不符合web标准
Ctrl+~ 空格即一个 注意:~键位于PC键盘数字1左侧,tab键上方
Ctrl+B 粗体,产生一对<b>标签,web标准似乎提倡使用<strong></strong>
Alt+I 斜体,产生一对<i>标签

书签操作
组合键 实现功能 适用条件
F2 添加/删除书签 所有代码部分
Ctrl+F2 跳到当前文件的下一个书签
Alt+F2 在当前项目的所有书签间切换
Ctrl+Shift+F2 删除所有书签
Ctrl+Shift+M 显示书签对话框

Zend Studio调试快捷键列表
组合键 实现功能 适用条件
F9 添加/删除断点 所有代码部分
F10 逐过程。单步执行调试文件到下一行
F5 开始执行。执行调试文件,直到遇到断点。
F8 调试URL。打开调试URL对话框
F12 概要文件URL。打开profile URL对话框
Shift+F8 添加监视点。打开添加监视点对话框
Shift+F11 跳出。单步执行到返回后执行的第一行
F11 逐语句。单步执行到下一被执行的行
Shift+F10 执行到光标行。执行代码到光标所在行。
Ctrl+F5 无中断的执行脚本
Shift+F5 停止调试器
Ctrl+Alt+B 在浏览器中显示
注:调试快捷键只有在调试代码的时候才会用到,关于如何在Zend Studio 调试脚本,以及如何搭建调试服务器等内容,在后续教程中将做详细的讲解。
posted @ 2008-07-10 11:39 叶子飞起来了 阅读(115) 评论(0) 编辑
2008年7月9日
经典武林外传(搞笑)
1.世界如此美妙,我却如此暴躁!这样不好,不好!

2.俄最开始就不该嫁到这里来~

俄不来俄地夫君就不会死~

俄地夫君不死俄就不会沦落到这个伤心的地方~

3.关门放小郭

4.华山很近的出门左拐打个驴的就到了

5.你是没长脑袋,还是脑袋长了霉!!

6.照顾好我七舅老爷。。。

7.帮我照顾好七舅姥爷家三外甥女

8.你这个月饼在月饼界的确是独一无二,可是在馒头界可是遍地都是啊~~!

9.看见你的呆样我就想野蛮

10.两个月前我和你一样。两个月后你和我一样。

11.葵花点穴手

  葵花解穴手

12.你肯定一定以及确定吗?

  我肯定一定以及确定。

13.亲娘咧,搞不好影响仕途喂!

14.我不做盗圣好多年

15.你撕鹅滴心,你撕鹅滴肝,你撕鹅生命的四分姿三

16.湘玉:展堂你愿意娶饿吗?展堂:不愿意。展堂:你愿意嫁给我吗?

  湘玉:饿````不```愿意````众人群殴之:地球人都知道你在说慌```

17.着些年俄命再苦没有怪过政府,点在背也没怨过社会!!!

18.把咱们华山派的镇派之宝拿上来。——糖葫芦

19.PUPU(巴掌声)A型、B型、O型、AB型都有

20.无情无耻无理取闹

21.郭:说个褒义的成语。莫:出水芙蓉。郭:不错,再来一个。莫:入土为安~

22.。。。。。是谁杀了我,而我又杀了谁。。。。。。

23.我上面有人!

24.大嘴:xxx我姑父是知县……大嘴:低调低调!!!!

25.帮我照顾我师兄老婆的小姑子!~~~~~~~~~~~~~~~`

26.天那!她到底喜欢我那一点我改还不行吗?

27.祝无双:非礼了。老白:敢在我的地盘上采花。

  那边:葵花点穴手

  老白。。。。。。。。。。。

28.子曾经曰过:知识就是力量!!!(秀才说滴!!)

29.再苦再累就当自己是250,再难再险就当自己是二皮脸

  与君共勉!

30.兄弟是蜈蚣的手足,妻子是过冬的衣服!
31.非常极其特别的好啦~~

32.一般.一般,港姐第三!!

33.手里捧着窝窝头,菜里没有一滴油.

34.我姑父是知县,跟我过不去就是跟我姑父过不去,

  跟我姑父过不去就是跟朝廷过不去,大家都低调!低调!

35.康桑啊米达,muice……

36.本判官有点渴了要去趟厕所

37.路漫漫其修远兮,我将上下东西南北中发白,无不所向披靡而求索

38.以迅雷不及掩耳盗铃之势如破足

39.“人在江湖飘,谁能不挨刀?白驼山壮骨粉,内用外服均有奇效。挨了刀涂一包,还想再挨第二刀,闪了腰吃一包,活到二百不显老。白驼山壮骨粉,青春的粉,友谊的粉,华山论剑指定营养品,本镇各大药铺医馆均有销售,购买时,请认准黑蛤蟆防伪标志,呱,呱……”

40.六儿,仨儿死了就死了。嘛仨儿?六儿!六儿啊。

安息吧。。你就没说对过!

41.别人有别人的长处,你有你的短处嘛~!

42.额的秀才啊!额那聪明能干物美价廉的秀才啊~~~~~!

43.家里几口人,人均几亩地,地里几头牛,说说说说

44.小郭:你给我哥温~~滚,(gun)

45.江湖永远比你们想象的深

46.掌拒的。你敢跟我玩双重标准!

47.没感觉就是没感觉,还是没感觉!!!!

48.行了观众明白就行了,真的,人家早明白了

49.子阿快带我走吧

50.贤惠,闲在家里什么都不会

51.额滴神啊!

52.这就是一个捕头的心声

53.。。。。。。。。。。江湖不相信眼泪。。。。。。。。。

54.玉不琢不成器,棍棒底下出孝女。

55.大嘴杂胆量不大,驾不住饭量大啊。大嘴吃吧!!

我看大嘴就是一个饭桶!

56.秀才:她可从来没有亲过我啊!(在某一集里秀才说了127遍)

57.非常及其以及渺茫。

58.黄天在上黄土在下。

59.这可渴死我了哪啥井在哪呢?

60.大嘴。大到吃八方的嘴。

  大嘴出发。一个顶八。
61.我真的不是演技派。。。。。。。。。。。。。。。我是偶像派

62.白展堂:"大嘴,其实我是个女的!”

63.挠我心。还是抠我心。。

  偷我心。。(刚看的。)

64.YOYOYOcheckitOUT道可道非常道想问你知道不知道

  我等的花儿也谢了

65.走自己的路。让他们打的去吧!

66.像超人一样消失!(小六儿)

67.饿爱的就是你呀!你说你咋就不知道了乜?饿伤心咧啊

68.生活再苦,我没怨过政府;生活再累,我没混过黑社会^^

69.这桌子够结实不?我啪一掌下去。。。。哎呀妈呀!~咋啥事没有!~?

70.嗖嗖嗖嗖,上去80多个锦衣卫,当时就把房梁踩塌了。

  到底我也没弄明白,上边有什么人呢。

71.秀才说的”你是谁?......如果我是你的话,那么你又是谁呢?”

72.我崇拜了you我服了you我输了you

73.送你四个字:洗洗睡吧

74.我不否认否决以及否定

75.是你选择了世界还是世界选择了你

76.衣冠禽兽,兽,寿比南山(成语接龙)

77.说谁呢~~~谁是演技派啊~~咋污辱人呢~~~

  我是演技派吗?我是偶像派~~~~~~~~

78.激情燃烧?俄又不是石光荣!……

79.神啊,主啊,莎士比亚,亚力士多德

80.要是道歉有用还要捕头干吗

81.诶~~~客官,打京还是住店啊?

82.我是女人。。。女人中的女人。。。回头率百分之三百

83.男人就应该对自己狠一点

84.你可千万不能死,你死了谁借我钱花?

85.俄就不信还叫不来他(佟掌柜坐),吭,发钱啦……(大嘴急奔出)

86.洋文谁不会说啊!我还会"泰瑞宝,旺得福"呢...

87.多行不义必自弊,必有一款适合你.

  春蚕到死丝方尽,蜡炬成灰泪始干,千舟已过万重山

88.老天爷啊你是得了近视散光青光眼外带老花啊

  你怎么不去做个视网膜手术啊

89.不就是一二三嘛~它再恶能恶过小郭吗!!

90.少爷的身子,跑堂的命。
91.小郭被掌柜的骂了怒气冲冲的冲了出去,碰到了看书的秀才。

  小郭说:“你脑袋上没长眼睛?”

  秀才很有理的说:“脑袋上长眼睛的是杨戬。”

  小郭说:“谁?”秀才:“二狼神啊”

92.我姓黄,草头黄,黄是黄豆豆地黄,豆是黄豆豆地豆

93.康桑阿米达MUSIC,1。2。3。4HEREWEGO

  电视机前的观众朋友们,跟着一起做!

94.哎呀你气质还硬拉?回去撞柱子去!

95.我一巴掌…………糊我自己脸上!~~

96.我就想跟你磨叽磨叽!

97.姑奶奶今天不把你打的桃花满天红,你就不知道姑奶奶心花为谁开!

98.破案有时候就是这么简单

99.前面的观众跟上哦,对,跟着我做(展堂教钱老板点穴时的经典动作加语句)

100.菜刀门。。。。。。。。。。菜刀门。。。。。。。。。(撞枕头)

101.反正是恶心死人不偿命!……

  手里那,捧着窝窝头……

102.老板娘,工钱什么时候给?

  发工钱?世界上还有这回事吗?

103.你长成这样还要不要人活拉~~~~~~~~

104.郎君啊~~~~你是不是饿的慌,浪个一个哟,你要是饿滴慌啊,

  你就对XX讲,XX给你溜肥肠~~

105.“我谢谢你,谢你大爷,谢你全家,谢你祖宗十八代”

106.别拉拉扯扯的.跟你不熟.跟你不熟。

107.一次张嘴,两次砍腿,第三次让你变成刀下鬼。

108.站在天堂看地狱,人生就象情景剧,站在地狱看天堂,为谁辛苦为谁忙
posted @ 2008-07-09 19:53 叶子飞起来了 阅读(165) 评论(0) 编辑
ArrayList用法

System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。

一.优点

1。支持自动改变大小的功能
2。可以灵活的插入元素
3。可以灵活的删除元素

二.局限性

跟一般的数组比起来,速度上差些

三.添加元素

1.publicvirtualintAdd(objectvalue);

将对象添加到ArrayList的结尾处

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
内容为abcde

2.publicvirtualvoidInsert(intindex,objectvalue);

将元素插入ArrayList的指定索引处

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Insert(0,"aa");

结果为aaabcde

3.publicvirtualvoidInsertRange(intindex,ICollectionc);

将集合中的某个元素插入ArrayList的指定索引处

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
ArrayListlist2=newArrayList();
list2.Add("tt");
list2.Add("ttt");
aList.InsertRange(2,list2);

结果为abtttttcde

四.删除

a)publicvirtualvoidRemove(objectobj);

从ArrayList中移除特定对象的第一个匹配项,注意是第一个

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Remove("a");

结果为bcde

2.publicvirtualvoidRemoveAt(intindex);

移除ArrayList的指定索引处的元素

aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.RemoveAt(0);

结果为bcde

3.publicvirtualvoidRemoveRange(intindex,intcount);

从ArrayList中移除一定范围的元素。Index表示索引,count表示从索引处开始的数目

aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.RemoveRange(1,3);

结果为ae

4.publicvirtualvoidClear();

从ArrayList中移除所有元素。

五.排序

a)publicvirtualvoidSort();

对ArrayList或它的一部分中的元素进行排序。

ArrayListaList=newArrayList();
aList.Add("e");
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();

结果为eabcd

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Sort();//排序
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();

结果为abcde

b)publicvirtualvoidReverse();

将ArrayList或它的一部分中元素的顺序反转。

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Reverse();//反转
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();
结果为edcba

六.查找

a)publicvirtualintIndexOf(object);
b)publicvirtualintIndexOf(object,int);
c)publicvirtualintIndexOf(object,int,int);

返回ArrayList或它的一部分中某个值的第一个匹配项的从零开始的索引。没找到返回-1。

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
intnIndex=aList.IndexOf(“a”);//1
nIndex=aList.IndexOf(“p”);//没找到,-1
d)publicvirtualintLastIndexOf(object);
e)publicvirtualintLastIndexOf(object,int);
f)publicvirtualintLastIndexOf(object,int,int);

返回ArrayList或它的一部分中某个值的最后一个匹配项的从零开始的索引。

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("a");//同0
aList.Add("d");
aList.Add("e");
intnIndex=aList.LastIndexOf("a");//值为2而不是0

g)publicvirtualboolContains(objectitem);

确定某个元素是否在ArrayList中。包含返回true,否则返回false

七.其他

1.publicvirtualintCapacity{get;set;}

获取或设置ArrayList可包含的元素数。

2.publicvirtualintCount{get;}

获取ArrayList中实际包含的元素数。
Capacity是ArrayList可以存储的元素数。Count是ArrayList中实际包含的元素数。Capacity总是大于或等于Count。如果在添加元素时,Count超过Capacity,则该列表的容量会通过自动重新分配内部数组加倍。
如果Capacity的值显式设置,则内部数组也需要重新分配以容纳指定的容量。如果Capacity被显式设置为0,则公共语言运行库将其设置为默认容量。默认容量为16。
在调用Clear后,Count为0,而此时Capacity切是默认容量16,而不是0

3.publicvirtualvoidTrimToSize();

将容量设置为ArrayList中元素的实际数量。
如果不向列表中添加新元素,则此方法可用于最小化列表的内存系统开销。
若要完全清除列表中的所有元素,请在调用TrimToSize之前调用Clear方法。截去空ArrayList会将ArrayList的容量设置为默认容量,而不是零。

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");//Count=5,Capacity=16,
aList.TrimToSize();//Count=Capacity=5;

posted @ 2008-07-09 12:02 叶子飞起来了 阅读(61) 评论(0) 编辑
系统正常运行进程
先全面的说说系统要正常运行需要哪些进程!
smss.exe Session Manager
csrss.exe 子系统服务器进程
winlogon.exe 管理用户登录
services.exe 包含很多系统服务
lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。(系统服务) 产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)
svchost.exe 包含很多系统服务
svchost.exe
SPOOLSV.EXE 将文件加载到内存中以便迟后打印。(系统服务)
explorer.exe 资源管理器
internat.exe 托盘区的拼音图标
附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少)
mstask.exe 允许程序在指定时间运行。(系统服务)
regsvc.exe 允许远程注册表操作。(系统服务)
winmgmt.exe 提供系统管理信息(系统服务)。
inetinfo.exe 通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)
tlntsvr.exe 允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务)
允许通过 Internet 信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)
tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)
termsrv.exe 提供多会话环境允许客户端设备访问虚拟的 Windows 2000
Professional 桌面会话以及运行在服务器上的基于 Windows 的程序。(系统服务)
dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)
以下服务很少会用到,上面的服务都对安全有害,如果不是必要的应该关掉:
tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows2000 Professional 的能力。(系统服务)
支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。(系统服务)
ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)
ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)
wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS名称服务。(系统服务)
llssrv.exe License Logging Service(system service)
ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
locator.exe 管理 RPC 名称服务数据库。(系统服务)
lserver.exe 注册客户端许可证。(系统服务)
dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
clipsrv.exe 支持"剪贴簿查看器",以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)
faxsvc.exe 帮助您发送和接收传真。(系统服务)
cisvc.exe Indexing Service(system service)
dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)
netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)
smlogsvc.exe 配置性能日志和警报。(系统服务)
rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)
RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)
RsFsa.exe 管理远程储存的文件的操作。(系统服务)
grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务)
SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)
snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序。(系统服务)
UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)
现在一个一个说
[system Idle Process]
进程文件: [system process] or [system process]
进程名称: Windows内存处理系统进程
描 述: Windows页面内存管理进程,拥有0级优先。
介 绍:该进程作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。它的cpu占用率越大表示可供分配的CPU资源越多,数字越小则表示CPU资源紧张。
System Idle Process为何物
问:在使用Windows XP的过程中,按"Ctrl+Alt+Del"键调出任务管理器,在进程中我发现一个名为"System Idle Process"的进程,它往往占用了大部分CPU资源,经常是80%以上,请问为什么它占用了那么多资源?
答:你误解了"System Idle Process"进程的意思了,这里的80%并不是你所想的占用CPU的资源,恰恰相反的是这里的80%以上是CPU资源空闲了出来的。这里的数字越大表示CPU可用资源越多,数字越小则表示CPU资源越紧张。该进程是系统必须的,不能禁止哦。
[csrss.exe]
进程文件: csrss or csrss.exe
进程名称: Client/Server Runtime Server Subsystem
描 述: 客户端服务子系统,用以控制Windows图形相关子系统。
介 绍: 这个是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss用于维持Windows的控制,创建或者删除线程和一些16位的虚拟MS-DOS环境。
纯手工查杀木马csrss.exe
注意:csrss.exe进程属于系统进程,这里提到的木马csrss.exe是木马伪装成系统进程
前两天突然发现在C:\Program Files\下多了一个rundll32.exe文件。这个程序记得是关于登录和开关机的,不应该在这里,而且它的图标是98下notepad.exe的老记事本图标,在我的2003系统下面很扎眼。但是当时我没有在意。因为平时没有感到系统不稳定,也没有发现内存和CPU大量占用,网络流量也正常。
这两天又发现任务管理器里多了这个rundll32.exe和一个csrss.exe的进程。它和系统进程不一样的地方是用户为Administrator,就是我登录的用户名,而非system,另外它们的名字是小写的,而由SYSTEM启动的进程都是大写的RUNDLL32.EXE和CSRSS.EXE,觉得不对劲。
然后按F3用资源管理器的搜索功能找csrss.exe,果然在C:\Windows下,大小52736字节,生成时间为12月9日12:37。而真正的csrss.exe只有4k,生成时间是2003年3月27日12:00,位于C:\Windows\Syetem32下。
于是用超级无敌的UltraEdit打开它,发现里面有kavscr.exe,mailmonitor一类的字符,这些都是金山毒霸的进程名。在该字符前面几行有SelfProtect的字符。自我保护和反病毒软件有关的程序,不是病毒就是木马了。灭!
试图用任务管理器结束csrss.exe进程失败,称是系统关键进程。先进注册表删除[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]和v[Runservice]下相应值,注销重登录,该进程消失,可见它没有象3721那样加载为驱动程序。
然后要查找和它有关的文件。仍然用系统搜索功能,查找12月9日生成的所有文件,然后看到12:37分生成的有csrss.exe、rundll32.exe和kavsrc.exe,但kavsrc.exe的图标也是98下的记事本图标,它和rundll32.exe的大小都是33792字节。
此后在12:38分生成了一个tmp.dat文件,内容是
@echo off
debug C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.dat C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.out
copy C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.dat C:\WINDOWS\system32\netstart.exe>C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.out
del C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.dat >C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.out
del C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.in >C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmp.out
C:\WINDOWS\system32\netstart.exe
好像是用debug汇编了一段什么程序,这年头常用debug的少见,估计不是什么善茬,因为商业程序员都用Delphi、PB等大程序写软件。
汇编大约进行了1分钟,在12:39生成了netstart.exe、WinSocks.dll、netserv.exe和一个0字节的tmp.out文件。netstart.exe大小117786字节,另两个大小也是52736字节。前两个位于C:\Windows\System32下,后两个在当前用户的Temp文件夹里。
这样我就知道为什么我的系统没有感染的表现了。netstart.exe并没有一直在运行,因为我在任务管理器中没有见过它。把这些文件都删除,我的办法是用winrar压缩并选中完成后删除源文件,然后在rar文件注释中做说明,放一个文件夹里,留待以后研究。这个监狱里都是我的战利品,不过还很少。
现在木马已经清除了。使用搜索引擎查找关于csrss.exe的内容,发现结果不少,有QQ病毒,传奇盗号木马,新浪游戏病毒,但是文件大小和我中的这个都不一样。搜索netstart.exe只有一个日文网站结果,也是一个木马。
这个病毒是怎么进入我的电脑的呢?搜索时发现在12月9日12:36分生成了一个快捷方式,名为dos71cd.zip,它是我那天从某网站下载的DOS7.11版启动光盘,但是当时下载失败了。现在看来根本就不是失败,是因为这个网站的链接本来就是一段网页注入程序,点击后直接把病毒下载来了。
[dllhost.exe]
进程文件: dllhost or dllhost.exe
进程名称: DCOM DLL Host进程
描 述: DCOM DLL Host进程支持基于COM对象支持DLL以运行Windows程序。
介 绍:com代理,系统附加的dll组件越多,则dllhost占用的cpu资源和内存资源就越多,而8月的"冲击波杀手"大概让大家对它比较熟悉吧。
解决Web服务器出现的dllhost.exe错误
我的Web服务器出了问题。一个弹出话框显示"dllhost.exe出现错误"。当我查看应用事件日志时发现有很多Active Server Pages Event 5这样的错误。它们在错误信息中显示为"line 0内存溢出"。这种错误以前每隔几天就发生一次,但现在是每隔几小时就发生一次。重启后也只能维持一阵子。你对此有什么看法吗?
我还没碰到过这种问题,但我在微软的参考信息中看到Exchange Outlook Web Access使用过程中描述过这样的错误。(
http://support.microsoft.com/?kbid=224327)
该链接建议你安装最新的Exchange升级版。如果你在使用Exchange,不妨尝试一下。如果没有,我就要给你一些建议,它们同那些存在ASP 3.0方面问题的人的建议一样:
确保你有所有最新升级版和服务包。
在每个Web应用中允许进程隔离。
将应用程序升级到ASP.NET。
将Web 服务器升级到Windows Server 2003。
dllhost.exe是什么?
dllhost.exe是运行COM+的组件,即COM代理,运行Windows中的Web和FTP服务器必须有这个东西。
什么时候会出现dllhost.exe?
运行COM+组件程序的时候就会出现。
冲击波杀手又是怎么一回事?
冲击波杀手借用了dllhost.exe作为进程名,但是由于Windows不允许同一个目录下有同名文件的存在,因此,冲击波杀手把病毒体:dllhost.exe放到了C:\Windows\System32\Wins目录里面(Windows 2000是C:\WINNT\System32\Wins,全部假设系统安装在C盘),但是真正的dllhost.exe应该放 在C:\Windows\System32(Windows 2000是C:\WINNT\System32)
换句话说就是:冲击波(Worm.WelChia)为了迷惑用户,避免病毒的执行体被进程管理器终止,采用了dllhost.e xe这个和Windows组件一样的名字,但是并不是说进程里面出现dllhost.exe就等于感染了worm.welchi a
再看看这里的FAQ吧
第一个误区----进程出现Dllhost.exe就等于中了病毒
Dllhost.exe是系统文件,但是进程里面出现Dllhost.exe进程不等于中了病毒
第二个误区----一见Dllhost.exe进程就杀死
其实这样做是不好的。很多程序都需要Dllhost.exe
之所以大家恐惧Dllhost.exe进程,恐怕是由于冲击波(杀手)的问题。
其实冲击波(杀手)只不过采取了一个偷梁换柱的方法。因为任务管理器里面无法看出进程中exe文件的路径,所以让大家在分析问题 的时候出现一些偏差。
感染冲击波(杀手)的典型特征不是进程中出现Dllhost.exe,而是RPC服务出现问题(冲击波)和System32\w ins目录里面出现svchost.exe和dllhost.exe文件(冲击波杀手)。注意路径!!
那么,Dllhost.exe是什么呢?Dllhost.exe是 COM+ 的主进程。正常下应该位于system32目录里面和system32\dllcache目录里面。而system32\win s目录里面是不会有dllhost.exe文件的。
[inetinfo.exe]
进程文件: inetinfo or inetinfo.exe
进程名称: IIS Admin Service Helper
描 述: InetInfo是Microsoft Internet Infomation Services (IIS)的一部分,用于Debug调试除错。
介 绍:IIS服务进程,蓝码正是利用的inetinfo.exe的缓冲区溢出漏洞。
inetinfo.exe占用了100%的cpu解决方案
当我们在使用iis时,如果这时错误关机(停电等),重启机器后,再次使用iis,经常发现inetinfo.exe占用了100%的cpu,重装iis后,还是没用
这个问题很多人的解决方案就是重装机器,之前我也是那么做的,只是我是从ghost恢复,但老这样做,似乎很麻烦。终无我忍无可忍(这样的情况太多了,而且我的同时也经常碰到这样的问题)
我就想,既然国内资料没法找到解决方案,国外的也可以试试吧。经过两个多小时的努力,找到了解决方法:其实很简单,使用windows update更新一下电脑一下就行
原文在:
http://www.eggheadcafe.com/ng/mi ... misc/post210106.asp
inetinfo.exe进程占用高达100%
进程文件: inetinfo or inetinfo.exe
进程名称: IIS Admin Service Helper
InetInfo是Microsoft Internet Infomation Services (IIS)的一部分,用于Debug调试除错。
可能原因很多:
1、IIS溢出入侵
默认情况下,IIS 5.0服务器存在一个后缀为"printer"的应用程序映射,这个映射使用位于WINNTSystem32下的名为 msw3prt.dll 的动态库文件。这个功能是用于基于Web控制的网络打印的,是Windows2000为Internet Printing Protocol(IPP)协议而设置的应用程序功能。不幸的是,这个映射存在一个缓冲区溢出错误,可以导致inetinfo.exe出错
解决方法:删除printer的应用程序映射
2、shtml.dll
在Frontpage Extention Server/Windows2000 Server上输入一个不存在的文件将可以得到web目录的本地路径信息:
http://www.victim.com/_vti_bin/shtml.dll/something.html
这样将返回以下信息:
Cannot open "d:inetpubwwwrootpostinfo1.html": no such file or folder.
但是如果我们请求并非HTML、SHTML或者ASP后缀的文件,我们将会得到不同的信息:
http://207.69.190.42/_vti_bin/shtml.dll/something.exe
shtml.dll对较长的带html后缀的文件名都会进行识别和处理,利用这一点,可以对IIS服务器执行DOS攻击,使目标服务器的CPU占用率达到 100%
解决方法:禁用Frontpage扩展。
Inetinfo.exe 进程停止响应
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;311517
[kernel32.dll]
进程文件: kernel32 or kernel32.dll
进程名称: Windows壳进程
描 述: Windows壳进程用于管理多线程、内存和资源。
介 绍:kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Win_dows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。
[mdm.exe]
进程文件: mdm or mdm.exe
进程名称: Machine Debug Manager
描 述: Debug除错管理用于调试应用程序和Microsoft Office中的Microsoft Script Editor脚本编辑器。
介 绍:Mdm.exe的主要工作是针对应用软件进行排错(Debug),说到这里,扯点题外话,如果你在系统见到fff开头的0字节文件,它们就是mdm.exe在排错过程中产生一些暂存文件,这些文件在操作系统进行关机时没有自动被清除,所以这些fff开头的怪文件里是一些后缀名为CHK的文件都是没有用的文件,只要系统中有Mdm.exe存在,就有可能产生以fff开头的怪文件。可以按下面的方法让系统停止运行Mdm.exe来彻底删除以fff开头的怪文件:首先按"Ctrl+Alt+Del"组合键,在弹出的"关闭程序"窗口中选中"Mdm",按"结束任务"按钮来停止Mdm.exe在后台的运行,接着把Mdm.exe(在C:\Windows\System目录下)改名为Mdm.bak。运行msconfig程序,在启动页中取消对"Machine Debug Manager"的选择。这样可以不让Mdm.exe自启动,然后点击"确定"按钮,结束msconfig程序,并重新启动电脑。另外,如果你使用IE 5.X以上版本浏览器,建议禁用脚本调用(点击"工具→Internet选项→高级→禁用脚本调用"),这样就可以避免以fff开头的怪文件再次产生。
OFF:如何关闭计算机调试管理器 Mdm.exe
found.000文件夹的问题
问:我的电脑有的时候在C盘或D盘的根目录下有个名为found.000的文件夹,里面有一些后缀名为CHK的文件。在c:\windows下有很多以fff开头的怪文件,而且大小全部为0字节。请问这些是什么文件?能否将它们删除?
答:found.000文件夹里面的一些后缀名为CHK的文件是你在使用"磁盘碎片整理程序"整理硬盘后所产生的"丢失簇的恢复文件"。在c:\windows下有很多以fff开头的文件是由Mdm.exe(Machine Debug Manager)这个程序产生的。Mdm.exe的主要工作是针对应用软件进行排错(Debug),在排错过程中会产生一些暂存文件,这些文件在操作系统进行关机时没有自动被清除,所以这些fff开头的怪文件和found.000文件夹里面的一些后缀名为CHK的文件都是没有用的:s33文件,可以任意删除而不会对系统产生不良影响。
但只要系统中有Mdm.exe存在,那么以fff开头的怪文件就又有可能产生。你可以按下面的方法让系统停止运行Mdm.exe来彻底删除以fff开头的怪文件:首先按"Ctrl+Alt+Del"组合键,在弹出的"关闭程序"窗口中选中"Mdm",按"结束任务"按钮来停止Mdm.exe在后台的运行,接着把Mdm.exe(在C:\Windows\System目录下)改名为Mdm.bak。运行msconfig程序,在启动页中取消对"Machine Debug Manager"的选择。这样可以不让Mdm.exe自启动,然后点击"确定"按钮,结束msconfig程序,并重新启动电脑。另外,如果你使用IE 5.X,建议禁用脚本调用(点击"工具→Internet选项→高级→禁用脚本调用"),这样就可以避免以fff开头的怪文件再次产生。
[regsvc.exe]
进程文件: regsvc or regsvc.exe
进程名称: 远程注册表服务
描 述: 远程注册表服务用于访问在远程计算机的注册表。可在控制面板,管理工具,服务中禁止相关的服务
[services.exe]
进程文件: services or services.exe
进程名称: Windows Service Controller
描 述: 管理Windows服务。
介 绍:大多数的系统核心模式进程是作为系统进程在运行。打开管理工具中的服务,可以看到有很多服务都是在调用%systemroot%\system32\service.exe
"Worm.NetSky"病毒解决方案
1、使用安全工具软件杀掉病毒;
2、不要轻易点击陌生人的邮件以及下载和运行其所带附件,在运行可疑附件前最好先用毒霸扫描;
3、手工解决方案:
对于系统是Windows9x,WindowsMe:
步骤一,删除病毒主程序
请使用干净的系统软盘引导系统到纯DOS模式,然后转到系统目录(默认的系统目录为C:\windows),分别输入以下命令,以便删除病毒程序:
C:\windows\>del services.exe
完毕后,取出系统软盘,重新引导到Windows系统。
如果手中没有系统软件盘,可以在引导系统时按"F5"键也可进入纯DOS模式。
步骤二,清除病毒在注册表里添加的项
打开注册表编辑器: 点击开始>运行, 输入REGEDIT, 按Enter;
在左边的面板中, 双击(按箭头顺序查找,找到后双击):
HKEY_LOCAL_MACHINE > Software > Microsoft > Windows >CurrentVersion>Run在右边的面板中, 找到并删除如下项目:
"service" = "%Windir%\services.exe -serv"
关闭注册表编辑器。
对于系统是Windows NT,Windows2000,Windows XP,Windows 2003 sever:
步骤一,使用进程序管里器结束病毒进程
右键单击任务栏,弹出菜单,选择"任务管理器",调出"Windows任务管理器"窗口。在任务管理器中,单击"进程"标签,在例表栏内找到病毒进程"services.exe",单击"结束进程按钮",点击"是",结束病毒进程,然后关闭"Windows任务管理器";
步骤二,查找并删除病毒程序
通过"我的电脑"或"资源管理器"进入系统目录(Winnt或windows),找到文件services.exe",将它们删除;
步骤三,清除病毒在注册表里添加的项
打开注册表编辑器: 点击开始>运行, 输入REGEDIT, 按Enter;
在左边的面板中, 双击(按箭头顺序查找,找到后双击):
HKEY_LOCAL_MACHINE > Software > Microsoft > Windows > CurrentVersion > Run在右边的面板中, 找到并删除如下项目:
"service" = "%Windir%\services.exe -serv"
关闭注册表编辑器。
Services.exe 中的 CPU 使用率增至 100%
症状
在基于 Windows 2000 的计算机上,Services.exe 中的 CPU 使用率可能间歇性地达到 100 %,并且计算机可能停止响应(挂起)。出现此问题时,连接到该计算机(如果它是文件服务器或域控制器)的用户会被断开连接。您可能还需要重新启动计算机。如果 Esent.dll 错误地处理将文件刷新到磁盘的方式,则会出现此症状。
解决方案
Service Pack 信息
要解决此问题,请获取最新的 Microsoft Windows 2000 Service Pack。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
修复程序信息
Microsoft 提供了受支持的修补程序,但该程序只是为了解决本文所介绍的问题。只有计算机遇到本文提到的特定问题时才可应用此修补程序。此修补程序可能还会接受其他一些测试。因此,如果这个问题没有对您造成严重的影响,Microsoft 建议您等待包含此修补程序的下一个 Windows 2000 Service Pack。
要立即解决此问题,请与"Microsoft 产品支持服务"联系,以获取此修补程序。有关"Microsoft 产品支持服务"电话号码和支持费用信息的完整列表,请访问下面的 Microsoft Web 站点:
http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS
注意 :特殊情况下,如果 Microsoft 支持专业人员确定某个特定的更新程序能够解决您的问题,可免收通常情况下收取的电话支持服务费用。对于特定更新程序无法解决的其他支持问题和事项,将正常收取支持费用。
下表列出了此修补程序的全球版本的文件属性(或更新的属性)。这些文件的日期和时间按协调通用时间 (UTC) 列出。查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用"控制面板"中的"日期和时间"工具中的 时区 选项卡。
状态
Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题。 此问题最初是在 Microsoft Windows 2000 Service Pack 4 中更正的。
[snmp.exe]
进程文件: snmp or snmp.exe
进程名称: Microsoft SNMP Agent
描 述: Windows简单的网络协议代理(SNMP)用于监听和发送请求到适当的网络部分。
简 介:负责接收SNMP请求报文,根据要求发送响应报文并处理与WinsockAPI的接口。包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。
[spoolsv.exe]
进程文件: spoolsv or spoolsv.exe
进程名称: Printer Spooler Service
描 述: Windows打印任务控制程序,用以打印机就绪。
介 绍:缓冲(spooler)服务是管理缓冲池中的打印和传真作业。
Spoolsv.exe→打印任务控制程序,一般会先加载以供列表机打印前的准备工作
Spoolsv.exe,如果常增高,有可能是病毒感染所致
目前常见的是:
Backdoor/Byshell(又叫隐形大盗、?/td>
posted @ 2008-07-09 10:33 叶子飞起来了 阅读(230) 评论(0) 编辑
ASP.NET面试题

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。
答 . private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。

2 .列举ASP.NET 页面之间传递值的几种方式。
答. 1.使用QueryString, 如....?id=1; response. Redirect()....
      2.使用Session变量
      3.使用Server.Transfer

3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}

4.C#中的委托是什么?事件是不是一种委托?
答 :
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
是,是一种特殊的委托

5.override与重载的区别
答 :
override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要
Override 是进行基类中函数的重写。为了适应需要。

6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
答 :
this.Server.Transfer

7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}

8.请编程实现一个冒泡排序算法?
答:
int [] array = new int

  • ;
    int temp = 0 ;
    for (int i = 0 ; i < array.Length - 1 ; i++)
    {
    for (int j = i + 1 ; j < array.Length ; j++)
    {
    if (array[j] < array[i])
    {
    temp = array[i] ;
    array[i] = array[j] ;
    array[j] = temp ;
    }
    }
    }

    9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
    答:不是。可以用任意类型。

    10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
    答:
    int Num = this.TextBox1.Text.ToString() ;
    int Sum = 0 ;
    for (int i = 0 ; i < Num + 1 ; i++)
    {
    if((i%2) == 1)
    {
    Sum += i ;
    }
    else
    {
    Sum = Sum - I ;
    }
    }
    System.Console.WriteLine(Sum.ToString());
    System.Console.ReadLine() ;

    11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
    答:一般为3层
    数据访问层,业务层,表示层。
    数据访问层对数据库进行增删查改。
    业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
    表示层为了与用户交互例如用户添加表单。
    优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
    缺点: 增加成本。

    12.在下面的例子里
    using System;
    class A
    {
    public A()
    {
    PrintFields();
    }
    public virtual void PrintFields(){}
    }
    class B:A
    {
    int x=1;
    int y;
    public B()
    {
    y=-1;
    }
    public override void PrintFields()
    {
    Console.WriteLine("x={0},y={1}",x,y);
    }
    当使用new B()创建B的实例时,产生什么输出?
    答:X=1,Y=0;x= 1 y = -1

    13.什么叫应用程序域?
    答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

    14.CTS、CLS、CLR分别作何解释?
    答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

    15.什么是装箱和拆箱?
    答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。

    16.什么是受管制的代码?
    答:unsafe:非托管代码。不经过CLR运行。

    17.什么是强类型系统?
    答:RTTI:类型识别系统。

    18.net中读写数据库需要用到那些类?他们的作用?
    答:DataSet:数据存储器。
    DataCommand:执行语句命令。
    DataAdapter:数据的集合,用语填充。

    19.ASP.net的身份验证方式有哪些?分别是什么原理?
    答:10。Windwos(默认)用IIS...From(窗体)用帐户....Passport(密钥)

    20.什么是Code-Behind技术?
    答:代码后植。

    21.在.net中,配件的意思是?
    答:程序集。(中间语言,源数据,资源,装配清单)

    22.常用的调用WebService的方法有哪些?
    答:1.使用WSDL.exe命令行工具。
    2.使用VS.NET中的Add Web Reference菜单选项

    23..net Remoting 的工作原理是什么?
    答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。

    24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
    答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

    25.请详述在dotnet中类(class)与结构(struct)的异同?
    答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.

    26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
    namespace test
    {
    public delegate void OnDBOperate();
    public class UserControlBase : System.Windows.Forms.UserControl
    {
    public event OnDBOperate OnNew;
    privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
    {
    if(e.Button.Equals(BtnNew))
    {
    //请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
    }
    }
    }
    答:if( OnNew != null )
    OnNew( this, e );

    27.分析以下代码,完成填空
    string strTmp = "abcdefg某某某";
    int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
    int j= strTmp.Length;
    以上代码执行完后,i= j=
    答:i=13,j=10

    28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
    答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

    29.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
    public void test(int i)
    {
    lock(this)
    {
    if (i>10)
    {
    i--;
    test(i);
    }
    }
    }
    答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

    30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
    答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

    31. 公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时, 能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
    答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

    32.给定以下XML文件,完成算法流程图。

    < DriverC >







    请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。
    答:
    void FindFile( Directory d )
    {
    FileOrFolders = d.GetFileOrFolders();
    foreach( FileOrFolder fof in FileOrFolders )
    {
    if( fof is File )
    You Found a file;
    else if ( fof is Directory )
    FindFile( fof );
    }
    }

    33.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
    答:解1: select top 10 * from A where id not in (select top 30 id from A)
    解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

    34.面向对象的语言具有________性、_________性、________性
    答:封装、继承、多态。

    35.能用foreach遍历访问的对象需要实现 ________________接口或声明________________方法的类型。
    答:IEnumerable 、 GetEnumerator。

    36.GC是什么? 为什么要有GC?
    答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
    System.gc()
    Runtime.getRuntime().gc()

    37.String s = new String("xyz");创建了几个String Object?
    答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

    38.abstract class和interface有什么区别?
    答:
    声 明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
    接 口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有 程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。 然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到 接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

    39.启动一个线程是用run()还是start()?
    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

    40.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
    答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

    41.构造器Constructor是否可被override?
    答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

    42.是否可以继承String类?
    答:String类是final类故不可以继承。

    43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    答:会执行,在return前执行。

    44.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    答:不对,有相同的hash code。

    45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

    47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    不能,一个对象的一个synchronized方法只能由一个线程访问。

    48.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
    答:都不能。

    49.List, Set, Map是否继承自Collection接口?
    答:List,Set是Map不是

    50.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
    答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

    51.数组有没有length()这个方法? String有没有length()这个方法?
    答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

    52.sleep() 和 wait() 有什么区别?
    答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
    (b)正在运行的线程因为其它原因而阻塞。
    wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

    53.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

    54.谈谈final, finally, finalize的区别。
    答:
    final —修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载
    finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。
    finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

    55.如何处理几十万条并发数据?
    答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.

    56.Session有什么重大BUG,微软提出了什么方法加以解决?
    答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。

    57.进程和线程的区别?
    答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。

    58.堆和栈的区别?
    答:
    栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
    堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

    59.成员变量和成员函数前加static的作用?
    答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

    60.ASP。NET与ASP相比,主要有哪些进步?
    答:asp解释形,aspx编译型,性能提高,有利于保护源码。

    61.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
    int[] intArr=new int[100];
    ArrayList myList=new ArrayList();
    Random rnd=new Random();
    while(myList.Count<100)
    {
    int num=rnd.Next(1,101);
    if(!myList.Contains(num))
    myList.Add(num);
    }
    for(int i=0;i<100;i++)
    intArr[i]=(int)myList[i];

    62.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
    答:session(viewstate) 简单,但易丢失
    application 全局
    cookie 简单,但可能不支持,可能被伪造
    input ttype="hidden" 简单,可能被伪造
    url参数 简单,显示于地址栏,长度有限
    数据库 稳定,安全,但性能相对弱

    63.请指出GAC的含义?
    答:全局程序集缓存。

    64.向服务器发送请求有几种方式?
    答:get,post。get一般为链接方式,post一般为按钮方式。

    65.DataReader与Dataset有什么区别?
    答:一个是只能向前的只读游标,一个是内存中的表。

    66.软件开发过程一般有几个阶段?每个阶段的作用?
    答:需求分析,架构设计,代码编写,QA,部署

    67.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。
    答:using 引入名称空间或者使用非托管资源
    new 新建实例或者隐藏父类方法

    68.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
    答:string inputStr=" xx xx ";
    inputStr=Regex.Replace(inputStr.Trim()," *"," ");

    69.下面这段代码输出什么?为什么?
    int i=5;
    int j=5;
    if (Object.ReferenceEquals(i,j))
    Console.WriteLine("Equal");
    else
    Console.WriteLine("Not Equal");
    答:不相等,因为比较的是对象

    70.什么叫做SQL注入,如何防止?请举例说明。
    答:利用sql关键字对网站进行攻击。过滤关键字'等

    71.什么是反射?
    答:动态获取程序集信息

    72.用Singleton如何写设计模式
    答:static属性里面new ,构造函数private

    73.什么是Application Pool?
    答:Web应用,类似Thread Pool,提高并发性能。

    74.什么是虚函数?什么是抽象函数?
    答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

    75.什么是XML?
    答: XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的 标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到 的有XML、XSL和XPath等。

    76.什么是Web Service?UDDI?
    答:Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
    UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

    77.什么是ASP.net中的用户控件?
    答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多。

    78.列举一下你所了解的XML技术及其应用
    答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config

    79.ADO.net中常用的对象有哪些?分别描述一下。
    答:Connection 数据库连接对象
    Command 数据库命令
    DataReader 数据读取器
    DataSet 数据集

    80.什么是code-Behind技术。
    答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.

    81.什么是SOAP,有哪些应用。
    答:simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范Web Service使用的协议..

    82.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
    答:一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质

    83.XML 与 HTML 的主要区别
    答:1. XML是区分大小写字母的,HTML不区分。
    2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略

    或者之类的结束 标记。在XML中,绝对不能省略掉结束标记。
    3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
    4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
    5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

    84.c#中的三元运算符是?
    答:?:。

    85.当整数a赋值给一个object对象时,整数a将会被?
    答:装箱。

    86.类成员有_____种可访问形式?
    答:this.;new Class().Method;

    87.public static const int A=1;这段代码有错误么?是什么?
    答:const不能用static修饰。

    88.float f=-123.567F; int i=(int)f;i的值现在是_____?
    答:-123。

    89.委托声明的关键字是______?
    答:delegate.

    90.用sealed修饰的类有什么特点?
    答:密封,不能继承。

    91.在Asp.net中所有的自定义用户控件都必须继承自________?
    答:Control。

    92.在.Net中所有可序列化的类都被标记为_____?
    答:[serializable]

    93.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?
    答:GC。

    94.下面的代码中有什么错误吗?_______
    using System;
    class A
    {
    public virtual void F(){
    Console.WriteLine("A.F");
    }
    }
    abstract class B:A
    {
    public abstract override void F(); 答:abstract override 是不可以一起修饰.
    } // new public abstract void F();

    95.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的任何实例。
    答:不可以,不可以。

    96.下面这段代码有错误么?
    switch (i){
    case(): 答://case()条件不能为空
    CaseZero();
    break;
    case 1:
    CaseOne();
    break;
    case 2:
    dufault; 答://wrong,格式不正确
    CaseTwo();
    break;
    }

    97.在.Net中,类System.Web.UI.Page 可以被继承么?
    答:可以。

    98..net的错误处理机制是什么?
    答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

    99.利用operator声明且仅声明了==,有什么错误么?
    答:要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="

    100.在.net(C# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息。
    答:在form中重载DefWndProc函数来处理消息:
    protected override void DefWndProc ( ref System.WinForms.Message m )
    {
    switch(m.msg)
    {
    case WM_Lbutton :
    ///string与MFC中的CString的Format函数的使用方法有所不同
    string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);
    MessageBox.Show(message);///显示一个消息框
    break;
    case USER:
    处理的代码
    default:
    base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
    break;
    }
    }

    101.在.net(C# or vb.net)中如何取消一个窗体的关闭。
    答:private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    e.Cancel=true;
    }

    102.在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
    答:一个是退出整个应用程序,一个是关闭其中一个form。

    103. 在C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国 用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22
    答:System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
    //System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型
    decimal y = 9999999999999999999999999999m;
    string str = String.Format(MyCulture,"My amount = {0:c}",y);

    104.某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:
    (1) 密码单词的最小长度是两个字母,可以相同,也可以不同
    (2) K不可能是单词的第一个字母
    (3) 如果L出现,则出现次数不止一次
    (4) M不能使最后一个也不能是倒数第二个字母
    (5) K出现,则N就一定出现
    (6) O如果是最后一个字母,则L一定出现
    问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?
    A) K B)L C) M D) N
    答案:B

    问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?
    A)1个 B)3个 C)6个 D)9个
    答案:A

    问题三:下列哪一个是单词密码?
    A) KLLN B) LOML C) MLLO D)NMKO
    答案:C

    8. 62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?
    答案:62移动成2的6次方

    105.对于这样的一个枚举类型:
    enum Color:byte
    {
    Red,
    Green,
    Blue,
    orange
    }
    答:string[] ss=Enum.GetNames(typeof(Color));
    byte[] bb=Enum.GetValues(typeof(Color));

    106. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
    答:attribute:自定义属性的基类;property :类中的属性

    107.C#可否对内存进行直接的操作?
    答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

    108.ADO。NET相对于ADO等主要有什么改进?
    答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,2:不使用com3:不在支持动态游标和服务器端游 4:,可以断开connection而保留当前数据集可用 5:强类型转换 6:xml支持

    109.写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
    答:

    110.大概描述一下ASP。NET服务器控件的生命周期
    答:初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载

    111.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
    答:不能,可以实现接口

    112.Static Nested Class 和 Inner Class的不同,说得越多越好
    答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

    113.,&和&&的区别。
    &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).

    114.HashMap和Hashtable的区别。
    答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.

    115.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
    short s1 = 1; s1 += 1;(可以正确编译)

    116.Overloaded的方法是否可以改变返回值的类型?
    答:Overloaded的方法是可以改变返回值的类型。

    117.error和exception有什么区别?
    答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

    118.<%# %> 和 <% %>有什么区别?
    答:<%# %>表示绑定的数据源
    <% %>是服务器端代码块

    119. 你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern / architecture)可以移植到ASP.NET 2.0上 (或者已经内嵌在ASP.NET 2.0中)
    答:1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.
    2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,
    3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢
    4 在绑定数据,做表的分页.Update,Delete,等操作都可以可视化操作,方便了初学者
    5 在ASP.NET中增加了40多个新的控件,减少了工作量

    120.重载与覆盖的区别?
    答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
    2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
    3、覆盖要求参数列表相同;重载要求参数列表不同。
    4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的。

    121.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
    答:不是。可以用任意类型。

    122.在C#中,string str = null 与 string str = " " 请尽量使用文字或图象说明其中的区别。
    答:null是没有空间引用的;
    " " 是空间为0的字符串;

    123.分析以下代码,完成填空
    string strTmp = "abcdefg某某某";
    int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
    int j= strTmp.Length;
    以上代码执行完后,i= j=
    答:i=13.j=10

    124.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
    答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

    125.分析以下代码。
    public static void test(string ConnectString)

    {

    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
    conn.ConnectionString = ConnectString;
    try

    {
    conn.Open();
    …….
    }
    catch(Exception Ex)
    {
    MessageBox.Show(Ex.ToString());
    }
    finally
    {

    if (!conn.State.Equals(ConnectionState.Closed))
    conn.Close();
    }
    }
    请问

    1)以上代码可以正确使用连接池吗?

    答:回答:如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。

    2)以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来?

    答:只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。)

    126. 公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时, 能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路:
    答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中

    127.什么是WSE?目前最新的版本是多少?
    答:WSE (Web Service Extension) 包来提供最新的WEB服务安全保证,目前最新版本2.0。

    128.在下面的例子里
    using System;
    class A
    {
    public A(){
    PrintFields();
    }
    public virtual void PrintFields(){}
    }
    class B:A
    {
    int x=1;
    int y;
    public B(){
    y=-1;
    }
    public override void PrintFields(){
    Console.WriteLine("x={0},y={1}",x,y);
    }
    当使用new B()创建B的实例时,产生什么输出?
    答:X=1,Y=0

    129.下面的例子中

    using System;
    class A
    {
    public static int X;
    static A(){
    X=B.Y+1;
    }
    }
    class B
    {
    public static int Y=A.X+1;
    static B(){}
    static void Main(){
    Console.WriteLine("X={0},Y={1}",A.X,B.Y);
    }
    }
    产生的输出结果是什么?
    答:x=1,y=2

    130.abstract class和interface有什么区别?
    答: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
    接 口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有 程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。 然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到 接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
  • posted @ 2008-07-09 08:41 叶子飞起来了 阅读(54) 评论(0) 编辑
    仅列出标题  下一页

    公告

    Copyright ©2012 叶子飞起来了