Page 58 of 60« First...«5657585960»

Google的PageRank算法学习1.2.3,网上转载的。做seo的可以看看吧。

Google的PageRank算法学习一
1、Google PageRank(网页级别)介绍
Google的核心软件称为 PageRank(网页级别),这是由Google创始人 Larry Page 和 Sergey Brin 在斯坦福大学开发出的一套用于网页评级的系统,网页级别(PageRank)是所有Google网络搜索工具的基础。
作 为组织管理工具,网页级别(PageRank)利用了互联网独特的民主特性及其巨大的链接结构。实质上,当从网页 A 链接到网页 B 时,Google 就认为”网页 A 投了网页 B 一票”。Google 根据网页的得票数评定其重要性。然而,除了考虑网页得票数(即链接)的纯数量之外,Google 还要分析投票的网页。”重要”的网页所投出的票就会有更高的权重,并且有助于提高其它网页的”重要性”。重要的、高质量的网页会获得较高的网页级别。 Google 在排列其搜索结果时,都会考虑每个网页的级别(PageRank)。当然,如果不能满足您的查询要求,网页级别(PageRank)再高对您来说也毫无意 义。因此,Google 将网页级别(PageRank)与完善的文本匹配技术结合在一起,为您找到最重要、最有用的网页。Google 所关注的远不只是关键词在网页上出现的次数,它还对该网页的内容(以及该网页所链接的内容)进行全面检查,从而确定该网页是否满足您的查询要求。 Google 以其复杂而全自动的搜索方法排除了任何人为因素对搜索结果的影响。虽然Google也在搜索结果旁刊登相关广告,但没人能花钱买到更高的网页级别 (PageRank),从而保证了网页排名的客观公正。

google自己对于pagerank的解释如下:
PageRank Explained
PageRank relies on the uniquely democratic nature of the web by using its vast link structure as an indicator of an individual page’s value.In essence, Google interprets a link from page A to page B as a vote, by page A, for page B. But, Google looks at more than the sheer volume of votes, or links a page receives; it also analyzes the page that casts the vote. Votes cast by pages that are themselves “important” weigh more heavily and help to make other pages “important.”
Important, high-quality sites receive a higher PageRank, which Google remembers each time it conducts a search. Of course, important pages mean nothing to you if they don’t match your query. So, Google combines PageRank with sophisticated text-matching techniques to find pages that are both important and relevant to your search. Google goes far beyond the number of times a term appears on a page and examines all aspects of the page’s content (and the content of the pages linking to it) to determine if it’s a good match for your query.

返回顶端

2、PageRank算法1
PR(A) = (1-d) + d (PR(T1)/C(T1) + … + PR(Tn)/C(Tn))
其中:PR(A):页面A的网页级别,
PR(Ti):页面Ti的网页级别,页面Ti链向页面A,
C(Ti):页面Ti链出的链接数量,
d:阻尼系数,取值在0-1之间.

由 此可见,1)这个算法不以站点排序,页面网页级别由一个个独立的页面决定;2)页面的网页级别由链向它的页面的网页级别决定,但每个链入页面的贡献的值是 不同的。如果Ti页面中链出越多,它对当前页面A的贡献就越小。A的链入页面越多,其网页级别也越高;3)阻尼系数的使用,减少了其它页面对当前页面A的 排序贡献。

返回顶端

3、随机冲浪模型
Lawrence Page 和 Sergey Brin 提出了用户行为的随机冲浪模型,来解释上述算法。他们把用户点击链接的行为,视为一种不关心内容的随机行为。而用户点击页面内的链接的概率,完全由页面上 链接数量的多少决定的,这也是上面PR(Ti)/C(Ti)的原因。一个页面通过随机冲浪到达的概率就是链入它的别的页面上的链接的被点击概率的和。阻尼 系数d的引入,是因为用户不可能无限的点击链接,常常因劳累而随机跳入另一个页面。d可以视为用户无限点击下去的概率,(1-d)则就是页面本身所具有的 网页级别。

返回顶端

4、PageRank算法2(对算法1的修订)
PR(A) = (1-d) / N + d (PR(T1)/C(T1) + … + PR(Tn)/C(Tn))
其中N是互联网上所有网页的数量

由此,所有页面的网页级别形成的一个概率分布,所有页面的网页级别之和是1。在算法1中,随机冲浪访问某个页面的概率由互联网的总页数决定,在算法2中,网页级别是一个页面被随机访问的期望值。
以下讲解,皆基于算法1,主要是计算简单,因为不用考虑N的值。

返回顶端

5、PageRank的特性
有页面的网页级别之和等于互联网的总页数。在网页数比较少的情况下,网页级别方程可以解出,而面对互联网上成亿的网页,再解方程是不可能的。

此处设阻尼系数为0.5,虽然Lawrence Page 和 Sergey Brin在实际将其设为0.85.
PR(A) = 0.5 + 0.5 PR(C)
PR(B) = 0.5 + 0.5 (PR(A) / 2)
PR(C) = 0.5 + 0.5 (PR(A) / 2 + PR(B))
解得:
PR(A) = 14/13 = 1.07692308
PR(B) = 10/13 = 0.76923077
PR(C) = 15/13 = 1.15384615
有:
PR(A)+PR(B)+PR(C)=3

返回顶端

6、迭代计算pagerank
Google 采用一种近似的迭代的方法计算网页的网页级别的,也就是先给每个网页一个初始值,然后利用上面的公式,循环进行有限次运算得到近似的网页级别。根据 Lawrence Page 和 Sergey Brin公开发表的文章,他们实际需要进行100次迭代才能得到整个互联网的满意的网页级别值,这儿的例子只用了10多次就可以了。在迭代的过程中,每个 网页的网页级别的和是收敛于整个网络的页面数的。所以,每个页面的平均网页级别是1,实际上的值在(1-d)和(dN+(1-d))之间。

迭代次数
PR(A)
PR(B)
PR(C)

0
1
1
1

1
1
0.75
1.125

2
1.0625
0.765625
1.1484375

3
1.07421875
0.76855469
1.15283203

4
1.07641602
0.76910400
1.15365601

5
1.07682800
0.76920700
1.15381050

6
1.07690525
0.76922631
1.15383947

7
1.07691973
0.76922993
1.15384490

8
1.07692245
0.76923061
1.15384592

9
1.07692296
0.76923074
1.15384611

10
1.07692305
0.76923076
1.15384615

11
1.07692307
0.76923077
1.15384615

12
1.07692308
0.76923077
1.15384615

返回顶端

7、Google搜索引擎的网页级别的实现
有三个因素决定的网页的等级:网页特定性因素、入链锚的文本、网页级别。
网页特定性因素包括网页的内容、标题及URL等。
为提供检索结果,Google根据网页特定性因素和入链锚的文本计算出网页的IR值,这个值被检索项在页面中的位置和重要性加权,以决定网页和检索请求相关性。IR值和网页级别联合标志网页的基本重要程度,这两个值的联合方式有多种,但明显的是不能相加的。
由于网页级别只对非特定的单个词的检索请求影响比较明显,对于由多个检索词构成的检索请求,内容相关性的分级标准的影响更大。

返回顶端

8、用Google工具条显示当前页面的网页级别(PAGERANK)
Google工具条是Google公司开发的IE插件,需要从Google下载并安装。注意,显示网页级别的功能是其高级功能,这时会自动收集用户的信息,并会自动升级工具条。
这个工具条显示的网页级别分为0-10共11级,如果根据理论用(Nd+(1-d))测算,假定d=0.85,则推测实际网级别的对数即为显示的级别,且对数的基数在6-7之间。
参考文献1中给出了一个方法,可以不经过toolbar就可以取得网站主页的网页级别,可惜因为版本或别的原因,已经不可行。下面我根据提示在IE缓冲目录里找到http://xagoogle.com的获取URL.

http://216.239.33.104/search?cli … ong%2E3322%2Eorg%2F

我的主页的网页级别是0。 isaac和chedong的分别是5和4。

返回顶端

9、Google的目录服务可以显示网站的pagerank
此处级别分为7级。有人对两种级别进行了比较

PageRank算法学习<二>

1、入链对计算页面级别的影响
入链总是能增加当前页面的级别,尤其当前页与其下级页面构成回路时,这种贡献更大。如右图例,设ABCD各页初始级别为1,阻尼系数为0.5,PR(X)/C(X)=10。则易算出

PR(A) = 19/3 = 6.33
PR(B) = 11/3 = 3.67
PR(C) = 7/3 = 2.33
PR(D) = 5/3 = 1.67

如果A不在回路上,则只能得0.5*10=5的收益。
阻尼系数越大,页面级别的收益越大,且整个回路上都能收到更大的收益(即入链收益更能平均地分布到各个回路页面上。针对上例,将阻尼系数改为0.75,则有

PR(A) = 419/35 = 11.97
PR(B) = 323/35 = 9.23
PR(C) = 251/35 = 7.17
PR(D) = 197/35 = 5.63

除回路上各个页面的级别值明显增大外,PR(A)/PR(D)的值敢明显减少了。
入链对整个回路上所有页面的级别值的增加之和,可以由下面这个公式得出.

(d / (1-d)) × (PR(X) / C(X))

这个公式,可以由简单推导出。

返回顶端
2、出链对计算页面级别(pagerank)的影响
增加出链不会影响整个web的总级别,但一个站点失去的级别值等于链到的站点的增加值之和。对于两个封闭的站点,从一个站点链上另一个站点时,增加的和 减少的都是(d(/(1-d) × (PR(X) / C(X)).如果这两个站点互相链接,则此值减少。用随机冲浪模型可以解释这种现象,就是出链的增加,减少了用户访问站内页面的概率。举例如图,设阻尼系 数为0.75,则

PR(A) = 0.25 + 0.75 PR(B)
PR(B) = 0.25 + 0.375 PR(A)
PR(C) = 0.25 + 0.75 PR(D) + 0.375 PR(A)
PR(D) = 0.25 + 0.75 PR(C)
得:
PR(A) = 14/23
PR(B) = 11/23
PR(C) = 35/23
PR(D) = 32/23
PR(A)+PR(B)=25/23
PR(C)+PR(D)=67/23
PR(A)+PR(B)+PR(C)+PR(D)=92/23=4

Page和Brin将这样的链接称为悬摆链,它链到页面没有出链。悬摆链对页面的级别计算产生负面影响。如例,阻尼系数为0.75.

PR(A) = 0.25 + 0.75 PR(B)
PR(B) = 0.25 + 0.375 PR(A)
PR(C) = 0.25 + 0.375 PR(A)
得:
PR(A) = 14/23
PR(B) = 11/23
PR(C) = 11/23
PR(A)+PR(B)+PR(C)=36/23<3

据Page和Brin,Google在索引页面时,悬摆链的量很大,主要是由于限制robot.txt的限制及索引了一些没有链出的文件类型如PDF 等。为消除这种负面影响,google在计算级别时,将此类链接从数据库里去掉,在计算完毕后,再单独计算悬摆链所链到页面。由此可见,PDF类的文件还 是可以放心地在网上发布的。

、页面数量对pagerank的影响

先看例子。阻尼系数为0.75,PR(X)/C(X)=10,则

PR(A) = 0.25 + 0.75 (10 + PR(B) + PR(C))
PR(B) = PR(C) = 0.25 + 0.75 (PR(A) / 2)
得:
PR(A) = 260/14
PR(B) = 101/14
PR(C) = 101/14
PR(A)+PR(B)+PR(C)=33;
增加页面D;
PR(A) = 0.25 + 0.75 (10 + PR(B) + PR(C) + PR(D))
PR(B) = PR(C) = PR(D) = 0.25 + 0.75 (PR(A) / 3)

PR(A) = 266/14
PR(B) = 70/14
PR(C) = 70/14
PR(D) = 70/14
PR(A)+PR(B)+PR(C)+PR(D)=34

增加页面后,所有页面的级别值之和增加了1,A页略有增加,而B、C则用大幅下降。
再看右边的例子,假定同上。

PR(A) = 0.25 + 0.75 (10 + PR(C))
PR(B) = 0.25 + 0.75 × PR(A)
PR(C) = 0.25 + 0.75 × PR(B)
得:
PR(A) = 517/37 = 13.97
PR(B) = 397/37 = 10.73
PR(C) = 307/37 = 8.30

增加页面D:
PR(A) = 0.25 + 0.75 (10 + PR(D))
PR(B) = 0.25 + 0.75 × PR(A)
PR(C) = 0.25 + 0.75 × PR(B)
PR(D) = 0.25 + 0.75 × PR(C)
得:
PR(A) = 419/35 = 11.97
PR(B) = 323/35 = 9.23
PR(C) = 251/35 = 7.17
PR(D) = 197/35 = 5.63

增加页面后,所有页面级别增加了1,但每个页面的级别值减少了,这是由于新加页面分享了入链代来的值。从这个结果看,增加页面减少了已有页面的级别值,露了google算法青睐小站点的特点。当然,大站点也会因内容丰富而吸引其它站点的出链而得以级别值增加。

返回顶端

4、针对搜索引擎优化的级别分布
先看两个列子,阻尼系数为0.5,PR(X)/C(X)=10;

BC之间无链接时:
PR(A) = 0.5 + 0.5 (10 + PR(B) + PR (C))
PR(B) = 0.5 + 0.5 (PR(A) / 2)
PR(C) = 0.5 + 0.5 (PR(A) / 2)

PR(A) = 8
PR(B) = 2.5
PR(C) = 2.5
BC之间互相链接时:
PR(A) = 0.5 + 0.5 (10 + PR(B) / 2 + PR(C) / 2)
PR(B) = 0.5 + 0.5 (PR(A) / 2 + PR(C) / 2)
PR(C) = 0.5 + 0.5 (PR(A) / 2 + PR(B) / 2)
得:
PR(A) = 7
PR(B) = 3
PR(C) = 3

当BC 间互链时,虽然减少了A的级别,但BC都增加了。这符合优化站点所有页面而非只主页的优化思路,因为只有每个页面的级别都提高了,当有检索词命中这些页面 时,它们才能排在前面。这种优化的方法也很明显了,就是尽可能地在所有页面间平均分布入链的贡献,各低级页面要增加互链。

返回顶端

5、出链连接技巧
只要不影响易用性,尽可能地将所有出链集中在一个或几个低级页面中,可以有效地降低出链对页面级别计算的负面影响。看列子:阻尼系数为0.5,PR(X)/C(X)=10;

BCD都有出链时:
PR(A) = 0.5 + 0.5 (PR(B) / 2 + PR(C) / 2 + PR(D) / 2)
PR(B) = PR(C) = PR(D) = 0.5 + 0.5 (PR(A) / 3)
得:
PR(A) = 1
PR(B) = 2/3
PR(C) = 2/3
PR(D) = 2/3
出链集中于D时:
PR(A) = 0.5 + 0.5 (PR(B) + PR(C) + PR(D) / 4)
PR(B) = PR(C) = PR(D) = 0.5 + 0.5 (PR(A) / 3)
得:
PR(A) = 17/13
PR(B) = 28/39
PR(C) = 28/39
PR(D) = 28/39

从结果看,出链集中后,ABCD各页面的级别都上升了。

返回顶端

6、交换连接的特性
链接交换增加了实施交换的页面的级别,却减少了其它页面的级别。如图,阻尼系数为0.5,PR(X)/C(X)=10;

交换前,
PR(A) = 4/3
PR(B) = 5/6
PR(C) = 5/6

PR(D) = 4/3
PR(E) = 5/6
PR(F) = 5/6
交换后;
PR(A) = 0.5 + 0.5 (PR(B) + PR(C) + PR(D) / 3)
PR(B) = PR(C) = 0.5 + 0.5 (PR(A) / 3)
PR(D) = 0.5 + 0.5 (PR(E) + PR(F) + PR(A) / 3)
PR(E) = PR(F) = 0.5 + 0.5 (PR(D) / 3)

PR(A) = 3/2
PR(B) = 3/4
PR(C) = 3/4
PR(D) = 3/2
PR(E) = 3/4
PR(F) = 3/4

这情况恰好与增加站内互链的效果相反。由此,当需要对主页进行针对某一关键词的优化时,才取交换链接是可取的。
例中级别值的重新分布,更基本的前提是两个站点中参考交换的页面互相为对方提供的级别值是相等的。如果一个站的某个页面级别高或少出链,则这个站所有页 面的级别会降低。这儿一个重要的影响因素是站点页面的数量。当一个站点的页面更多时,有更多的入链级别值被分布到站点的其它页面中,因而参考交换的页面不 能提供更多贡献给对方。

Google的PageRank算法学习三
1、其他有关PageRank的观点
很 多针对搜索引擎做网站优化的专家,认为google给一些特殊站点以特定的级别而不是按前述算法进行计算,这些网站的级别很有可能来在Yahoo或ODP (Open Directory Project)。Lawrence Page在他们的专利说明中,提到随机冲浪模型中,用记不愿继续点击时,很有可能借助Yahoo的目录或ODP到另一个站点去。
由于前述的算法,无论初始的级别值如何,经过足够次数的迭代最终结果都是一样的,所以对这些特殊站点可能采用下述的公式。

PR(A) = E(A) (1-d) + d (PR(T1)/C(T1) + … + PR(Tn)/C(Tn))

从另一个角度来看,如果给页面赋一个跟其实际级别相近的初始值,可以明显减少迭代次数。

返回顶端

2、影响页面级别的其它因素
在Lawrence Page和Sergey Brin关于PageRank的论文发表以后,除了web的链接结构以外,还有没有别的因素被加到PageRank的算法当中曾经有过广泛地讨论。 Lawrence Page本人在PageRank的专利说明中曾指出以下潜在的影响因素:链接的能见度,链接在文档中的位置,web页面间的距离,出链页面的重要性,页面 的不过时。这此因素的增加,可以更好用随机冲浪模型模拟人类利用web的行为。
不管上述附加因素有没有在实际计算PageRank时使用,如何实现这些附加因素仍要讨论。
首先算法公式需要改进.

PR(A) = (1-d) + d (PR(T1)×L(T1,A) + … + PR(Tn)×L(Tn,A))

此处,L(T1,A)是入链的评价值,由几个因素构成,只需要在迭代前计算一次,减少了对数据库的查询次数,虽然每次迭代的查询结果会有不同。

Lawrence Page在PageRank的专利说明中指出链接评价的两个因素是链接的可见性和在文档中的位置。链接评价取代了PR(A)/C(A),指出了对一特定的页面的链接,每个链接被点击的概率是不同的。
此处,每一链接有两个属性值,X表示可见度,如果没有被重点强调(如粗体、斜体等)为1否则为2,Y表链接在文档中的位置,如果在文档下半部为1否则为3。则有

X(A,B) × Y(A,B) = 1 × 3 = 3
X(A,C) × Y(A,C) = 1 × 1 = 1
X(B,A) × Y(B,A) = 2 × 3 = 6
X(B,C) × Y(B,C) = 2 × 1 = 2
X(C,A) × Y(C,A) = 2 × 3 = 6
X(C,B) × Y(C,B) = 2 × 1 = 2
易得:
Z(A) = X(A,B) × Y(A,B) + X(A,C) × Y(A,C) = 4
Z(B) = X(B,A) × Y(B,A) + X(B,C) × Y(B,C) = 8
Z(C) = X(C,A) × Y(C,A) + X(C,B) × Y(C,B) = 8
链接评价公式为:(页面T1指向T2)
L(T1,T2) = X(T1,T2) × Y(T1,T2) / Z(T1)
有:
L(A,B) = 0.75
L(A,C) = 0.25
L(B,A) = 0.75
L(B,C) = 0.25
L(C,A) = 0.75
L(C,B) = 0.25
最后利用改进的公式计算页面级别:
PR(A) = 0.5 + 0.5 (0.75 PR(B) + 0.75 PR(C))
PR(B) = 0.5 + 0.5 (0.75 PR(A) + 0.25 PR(C))
PR(C) = 0.5 + 0.5 (0.25 PR(A) + 0.25 PR(B))
得:
PR(A) = 819/693
PR(B) = 721/693
PR(C) = 539/693

为了防止人为的级别优化,页面的距离被用来影响链接的评价。站内链接的权重小于站间链接的权重。页面的距离可能由页面是否在一个站内、一个服务器及物理距离等决定。
另一个影响页面重要性的能参数,是页面的不过时性(up-to-dateness),意指有越多的新建的页面指向某一个页面,则这个页面内容过时的可能性越小。
为增加这些因素的影响,要对公式进行修订如下:

L(Ti,A) = K(Ti,A) × K1(Ti) × … × Km(Ti)

其中,K(Ti,A)表示链接可见度及位置的权重,Kn(Ti)是第n个因素对页面Ti的影响。看列子:此处,从C引出的链接的重要性是其它的4倍。

K(A) = 0.5
K(B) = 0.5
K(C) = 2
计算级别值:
PR(A) = 0.5 + 0.5 × 2 PR(C)
PR(B) = 0.5 + 0.5 × 0.5 × 0.5 PR(A)
PR(C) = 0.5 + 0.5 (0.5 PR(B) + 0.5 × 0.5 PR(A))
得:
PR(A) = 4/3
PR(B) = 2/3
PR(C) = 5/6

此时,所有页面的级别之和不等于页面数量。

返回顶端

3、基于主题或标题的搜索评级
因google没有采用,略去不看。

返回顶端

4、Google的PR0惩罚
Google对采用了搜索优化的网站的一种惩罚就是,把这个站的所有或很多网页的网页级别定为0,典型的表现就是原先不为0忽然变为0的情况。当然,PR为0不一定是受到了惩罚,可能只是因为没有重要页面链到它。
一个Google的员工在WebmasterWorld’s Google News论坛上一再提醒网站管理员,一定不要”链接到坏邻居”。Raph Levien提出了一种技术分析链接结构获取页面的负面特征,与”PageRank”相似但目标相反,名之为”BadRank”。
BadRank基于”链到坏邻居”,对BadRank有影响显然是出链,因为对PageRank的算法加以改动,即会适合BadRank的计算。

BR(A) = E(A) (1-d) + d (BR(T1)/C(T1) + … + BR(Tn)/C(Tn))

, 其中,BR(A) 是页面A的BadRank, BR(Ti)页面Ti的BadRank,页面A有链接到Ti,C(Ti)页面Ti的入链数,d是阻尼系数,E(A)表示当前页面有没有被垃圾网页过滤系统 检测到。当E(A)为0时,这个公式不再有意义,它只是变成了另一种分析链接结构的方法而已。所有页面的E(A)之和等页面总数。看例子,令E(A)= 100,其它的为1,d=0.85,则有

Page
BadRank

A
22.39

B/C
17.39

D/E/F/G
12.21

可见页面A的BadRank被分布到每个页面中了。
上例中,如果所有页面的BadRank都为1,阻尼系数为0.85,页面G链到一个页面X,E(X)=10,且这个链接是X的唯一的入链。则有

Page
BadRank

A
4.82

B
7.50

C
14.50

D
4.22

E
4.22

F
11.22

G
17.18

在这种情况下,所有页面的BadRank都有增加,A增加得比较少。
常见这样的网站,主页的pagerank在2-4之间,而其它页面为0,这是可能由于受到了Google的惩罚,或者可能只是低层页面有链接到”坏邻居”。(真是这样吗?我的网站就如所述。可怕)。
如果将BadRank和PageRank结合,有多方法,一是相减,一是相除,一是BadRank到了一定值就PageRank=0,等等。其实,两者 如何结合并不重要。但是其后果却值得重视。一种情况是,一个页面的PageRank很高,它的BadRank也不低但相对于其PageRank却可以忽 略,那么如果一个链向这个页面但PageRank不高的页面将会深受其害了。另一种情况更严重,无论有多少入链帮助增加PageRank,一个到”坏邻居 “的出链就可能导致PR0。对于后一种情况,Google的Matt Cutt发言说,一个到”坏邻居”的链接并不会造成伤害,但如果有20,就是个问题了。对于一高一低两个PageRank的页面,都连到一个”坏邻居”, 低PageRank的页面受到的伤害会更厉害,只喜欢Google能区别这种情况,否则出链就只有坏处而不见什么好处了。
上述关于PRO的内容,都是关于BadRank的思考,但是对链接结构进行同PageRank相似的分析来确定BadRank似乎是Google的唯一的思路。



浅谈HTTP协议1.2.3.4,转自协议网

浅谈HTTP协议(一)–结构

Internet是由各个协议连接起来的,而我们现在使用最广的莫过于HTTP协议了,也就是超文本传输协议,与FTP(文件传输协议)不同,由于主要用于超文本传输,因此HTTP协议显得更简单一点。今天我们来介绍一下HTTP协议的基本格式。
在这里,我们所谈及的HTTP协议以HTTP/1.1为标准,并且使用NetVampirePro4.0来取得与HTTP服务器的通信Log,您也可以使用其它的HTTP下载工具来取得通信Log。
在HTTP协议中,服务端是指提供HTTP服务的部分,客户端是指你使用的浏览器或者下载工具等等。在通讯时,由客户端发出请求连接,服务端建立连接; 然后,客户端发出HTTP请求(Request),服务端返回响应信息(Respond),由此完成一个HTTP操作。我们来通过一个例子来了解这个过 程:(以下是NetVampire进行的一次连接,以下红色字体为作者添加)
P01-5-2616:10:43Connectingtogo2.163.com…         //连接服务器
P01-5-2616:10:44Connectedtogo2.163.com[61.129.65.148]    //解析IP地址,以下为HTTP操作
S01-5-2616:10:44GET/~minift/epretty/pretty.zipHTTP/1.1   //请求行(RequestLine),表示使用GET方式取得文件,使用HTTP/1.1协议
//以下为请求头部(RequestHead)
S01-5-2616:10:44Connection:close               //表示非持续性连接
S01-5-2616:10:44Host:go2.163.com               //主机名称
S01-5-2616:10:44Accept:*/*                  //接受的数据类型
S01-5-2616:10:44Pragma:no-cache               //参数(与以前的服务器兼容)
S01-5-2616:10:44Cache-Control:no-cache            //不使用缓存
S01-5-2616:10:44Referer:http://go2.163.com/~minift/epretty  //从该网址转来
S01-5-2616:10:44User-Agent:Mozilla/4.04[en](Win95;I;Nav) //客户端标识
S01-5-2616:10:44Cookie:AdId=ACDDAAAAAAA
S01-5-2616:10:44                        //以下为Respond
R01-5-2616:10:47HTTP/1.0200OK                //响应行(RespondLine),服务器使用HTTP/1.0协议,状态值(StatusCode)为200,状态为OK,表示文件可以读取
R01-5-2616:10:47Date:Sat,26May200108:15:54GMT      //现在的时间,用格林威治时间表示
R01-5-2616:10:47Server:Apache/1.3.14(Unix)mod_layout/2.9.9 //服务器类型
R01-5-2616:10:47Last-Modified:Fri,04May200102:42:56GMT  //文件最后更新时间
R01-5-2616:10:47ETag:”e614cf-37965-3af21730″
R01-5-2616:10:47Accept-Ranges:bytes             //接受的范围单位
R01-5-2616:10:47Content-Length:227685            //文件长度
R01-5-2616:10:47Content-Type:application/zip         //MIME类型
R01-5-2616:10:47X-Cache:MISSfromshca8
R01-5-2616:10:47X-Cache-Lookup:MISSfromshca8:80
R01-5-2616:10:47Connection:close               //表示文件传输完毕就关闭连接。
R01-5-2616:10:47                        //以下为文件传输
P01-5-2616:10:47Datatransferstarted
下面来讲解使用的格式(LRCF=@13@10,即回车,SP=SPACE,即空格)
Request:
协议方式SP文件URISP协议版本LRCF(请求行)
(以下为头部)
头部类型:头部值LRCF
头部类型:头部值LRCF
头部类型:头部值LRCF
……
LRCF表示头部结束
(如果有体部,以下为体部)

Respond:
协议版本SP状态值SP状态描述LRCF(响应行)
(以下为头部)
头部类型:头部值LRCF
头部类型:头部值LRCF
头部类型:头部值LRCF
……
LRCF表示头部结束
(如果有体部,以下为体部)

由上可见,请求与相应的格式只有部分不同,是很容易理解的,现在你应该基本了解HTTP协议了吧,也能看懂那些通信Log了吧,下一次我们讲专门讲解在响应行中的状态值含义及一些特殊情况。

浅谈HTTP协议(二)–返回值

在一个协议中,最重要的是判断协议是否进行的成功,而在HTTP中是根据响应状态值来确定的,今天就来介绍一些状态码的含义。
200OK
这是最普遍的吧,也就是表示协议一切正常,凡是2开头的代码表示的都是成功进行中。

404NotFound
这也是最普遍的吧,其实大多数错误就是所要求的资源无法得到,通常表示文件不存在。

403Forbidden
表示服务器无法满足现在的请求,有可能是现在连接数太多等原因。

401Unauthorized
未认证的请求,通常浏览器接受到这个状态值,就会弹出一个对话框,要求你输入密码。

500InternalServerError
服务器内部错误,一般的原因是因为所执行的程序有错误,无法返回正确应答。

206PartialContent
部分的内容,这个状态码表示下面传递的是部分的内容,也是断点续传的标准返回码。

HTTP协议三–断点续传

断点续传是我们现在经常接触的概念,那么HTTP协议是如何支持断点续传的呢。我们先从一个例子来看看。
下面是一个断点续传的例子:(使用NetVampire得到)
I01-7-1219:19:23————————-Attempt1————————-
P01-7-1219:19:24Connectingto127.0.0.3…
P01-7-1219:19:24Connectedto127.0.0.3[127.0.0.3]
S01-7-1219:19:24GET/VS0515AI.EXEHTTP/1.1
S01-7-1219:19:24Connection:close
S01-7-1219:19:24Host:127.0.0.3
S01-7-1219:19:24Accept:*/*
S01-7-1219:19:24Pragma:no-cache
S01-7-1219:19:24Cache-Control:no-cache
S01-7-1219:19:24Referer:http://127.0.0.3/
S01-7-1219:19:24User-Agent:Mozilla/4.04[en](Win95;I;Nav)
S01-7-1219:19:24
R01-7-1219:19:24HTTP/1.1200OK
R01-7-1219:19:24Server:ZeroHttpServer/1.0
R01-7-1219:19:24Date:Thu,12Jul200111:19:24GMT
R01-7-1219:19:24Cache-Control:no-cache
R01-7-1219:19:24Last-Modified:Tue,30Jan200113:11:30GMT
R01-7-1219:19:24Content-Type:application/octet-stream
R01-7-1219:19:24Content-Length:15143086
R01-7-1219:19:24Connection:close
R01-7-1219:19:24
P01-7-1219:19:25Datatransferstarted
I01-7-1219:19:32JobStoppedbyuser
I01-7-1219:19:33Received5275648bytesin0:00:07(691435bytes/s)
I01-7-1219:19:40————————-Attempt2————————-
P01-7-1219:19:40Connectingto127.0.0.3…
P01-7-1219:19:40Connectedto127.0.0.3[127.0.0.3]
S01-7-1219:19:40GET/VS0515AI.EXEHTTP/1.1
S01-7-1219:19:40Connection:close
S01-7-1219:19:40Host:127.0.0.3
S01-7-1219:19:40Accept:*/*
S01-7-1219:19:40Pragma:no-cache
S01-7-1219:19:40Cache-Control:no-cache
S01-7-1219:19:40Referer:http://127.0.0.3/
S01-7-1219:19:40User-Agent:Mozilla/4.04[en](Win95;I;Nav)
S01-7-1219:19:40Range:bytes=5275648-
S01-7-1219:19:40
R01-7-1219:19:40HTTP/1.1206PartialContent
R01-7-1219:19:40Server:ZeroHttpServer/1.0
R01-7-1219:19:40Date:Thu,12Jul200111:19:40GMT
R01-7-1219:19:40Cache-Control:no-cache
R01-7-1219:19:40Last-Modified:Tue,30Jan200113:11:30GMT
R01-7-1219:19:40Content-Type:application/octet-stream
R01-7-1219:19:40Content-Range:bytes5275648-15143085/15143086
R01-7-1219:19:40Content-Length:9867438
R01-7-1219:19:40Connection:close
R01-7-1219:19:40
P01-7-1219:19:40Datatransferstarted
I01-7-1219:19:41JobStoppedbyuser
I01-7-1219:19:41Received1124756bytesin0:00:01(969617bytes/s)
第一次是普通的传输;第二次由于没有传完全,就发出了Range这个头部,从5275648字节开始传输(默认是按字节算),回应使用206状态值,表示现在开始部分传输,回复Content-Length头部,表示传输的部分,用字节记,然后就与普通传输没有区别了。
通过上面的例子,你应该了解HTTP断点续传的原理了吧。

HTTP协议四–关于Chunked编码

在有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。
在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定为Chunked,表示将用Chunked编码传输内容。采用以下方式编码:
Chunked-Body=*chunk
“0″CRLF
footer
CRLF
chunk=chunk-size[chunk-ext]CRLF
chunk-dataCRLF

hex-no-zero=

chunk-size=hex-no-zero*HEX
chunk-ext=*(“;”chunk-ext-name["="chunk-ext-value])
chunk-ext-name=token
chunk-ext-val=token|quoted-string
chunk-data=chunk-size(OCTET)

footer=*entity-header
编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不 写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内 容。
下面给出一个Chunked的解码过程(RFC文档中有)
length:=0
readchunk-size,chunk-ext(ifany)andCRLF
while(chunk-size>0){
readchunk-dataandCRLF
appendchunk-datatoentity-body
length:=length+chunk-size
readchunk-sizeandCRLF
}
readentity-header
while(entity-headernotempty){
appendentity-headertoexistingheaderfields
readentity-header
}
Content-Length:=length
Remove”chunked”fromTransfer-Encoding
下一次将会讨论一些小问题,如POST方法的数据传输等。
最后,还有一点要说的是,好像NetAnt的一个版本不支持Chunked编码,会显示无法确定内容长度,或许是版本太低的缘故,如果你也遇到这种问题,可以改用NetVampire或其它支持Chunked编码的下载程序试试。

Google中site:的使用方法总结

语法格式:
site : 网址 关键词
或者 关键词 site : 网址

注意事项:
1、site:后边跟的冒号必须是英文的”:”,中文的全角冒号”:”无用

2、url前不能带http://

3、url后边不能带斜杠”/”,其实是哪里都不能带/

4、url中不要用www,除非你有特别目的,
用www会导致错过网站内的内容,因为很多网站的频道是没有www的。

其他说明:
1、关键词既可以在”site:”前,也可以在”site:”后,搜索结果是一样的
但是不管谁前谁后,关键词和”site:”之间必须空一格。 2、对于”site:”搜索,关键词一样可以是多个,多个关键词之间以空格隔开

3、支持与其他复杂搜索语法混用,各语法和关键词之间空一格

4、除了网站,还可以搜索网站的频道,但仅限于不用”/”的。

5、一个网站可能有多种语言,
所以选择”搜索所有网站”和”搜索中文(简体)网页”是有差别的
当然,如果指定的网站只有一种语言,怎么选择就都一样了

用途:
1、可用于限制网站类型,学术资料在edu、org中会更精练,政府相关的在gov中也许更容易找。

2、用了edu、org、net、gov之类的域名后缀,并不会搜索所有含这个后缀的网站。
只会搜索以这个后缀结尾的网站,带cn、us、si等各国家和地区域名后缀的edu.jp、
gov.us、org.it等是不搜的,所以你要另外搜

3、搜索某种语言或某个关键词在指定国家的网站

4、有的网站没有提供站内搜索,或者它的信息结构混乱,内容又多,不好找东西,
那么可以用”site:”对这个网站进行检索。
google的”site:”功能比多数网站自己的站内检索还要好用,如果你查的不是
动态数据库,而且对时效性要求不高的话。

5、搜索不欢迎你搜索和免费使用的网站、数据库的部分内容

6、用”site:”搜索死链接网站、已关闭网站内的信息

玩Google有妙法:使用技巧十九招

在输入多个词的时候,Google默认的是并且式的查询,如果想使用或者式的查询,使用OR,例如:java OR c++
google是不区分大小写的,搜索Java和搜索JAVA或者java是完全一样的。
逻辑关系优先级使用圆括号,例如查找包含java和(JVM或者虚拟机):Java (JVM或者虚拟机)。
要搜索词组需要使用引号括起来,例如搜索Java虚拟机可以使用:”Java虚拟机”。
要想在搜索结果中不包含某些结果可以使用减号,例如搜索java又不包含培训可以使用:java -培训。
一般情况下是不能使用通配符的,通配符只能使用在词组中,例如:”使用*模式”。
只在网页的标题(即html的title指定的部分)内搜索指定的内容,例如:intitle:java。
只在网页的url内搜索指定的内容,例如:inurl:java。
只在网页的正文内搜索指定的内容(忽略链接文字、标题和url),例如:intext:java。
只在链接文字(链接Java研究组织的链接文字就是Java研究组织)内搜索指定的内容,例如:inanchor:java。
只在指定的网站内搜索指定的内容,可以是某个具体的网站或者是某个域名分类,例如:site:javaresearch.org或者siterg。
只在指定的文件格式内搜索指定的内容,需要注意google只能支持有限的常用文本格式,包含一些诸如doc,xsl,ppt,pdf之类的富文本格式,例如:filetype:htm。
google在检索的时候对于输入的内容的顺序是敏感的,如果找不到合适的结果可以试试改变一下搜索的关键字的顺序。
在搜索多个关键字构成的内容时可以试试加引号和不加引号两者情况,结果可能有很大的差异,例如:java虚拟机和”java虚拟机”。
搜索的策略可以采用先多后少,假设你想搜索Java的的command模式的例子,可以先试试java command pattern,然后试试java pattern或者java command,每次减少的那个关键字应该是你认为相对不重要的一个。
对于搜索中文而言,搜索”虚拟机”和搜索”虚拟机”是不同的,后者一般比前者的结果多并且相关性差一些,一般情况下你应该在各个词之间加空格,而在词内不加空格,这样得到的结果一般更好。
一个关键字可以重复两次,对结果的排名和数量也会有影响,重复两次以上好像就没有什么影响了,例如搜索”internet”和搜索”internet internet”的结果是不同的。
搜索内容最多只能包含十个单词,包括搜索intitle之类的选项,多出的部分被忽略。
对于intitle,inurl,intext,inanchor和site之类的搜索选项一次不要使用多次,否则要么不是你想要的结果,要么根本就没有结果,混合使用这些选项是合法的,但是规则很复杂。

最近对vb的winsock很感兴趣。准备多找些文章看看。
一.引言

Socket原意为”插座”,用于计算机通信则代表一种点到点信息传输。早期用于Unix系统上的通信编程规范,通信双方由代表两点的”服务器”和”客户”组成,基于IP协议进行按照TCP或UDP规范进行信息交换。建立双方通信的过程即称建立一个”套接字(Socket)”,建立后利用得到的”套接字”进行各种信息的交流。随着Windows系统的流行,开始有人在原来的基础上移植到Windows平台上。微软在早期编写了基于Windows特征的(消息驱动等)”套接字”编程API,一般称其为”Winsock API”。当微软的ActiveX技术大行其道之后,Microsoft又提供了一个称为”Winsock”的ActiveX控件,方便了利用VB编程的程序员进行”套接字”编程,使得我们不必深入Socket细节就可进行点到点的通信。

下面,我们先接触一下此控件。

二.Winsocket控件详解

此控件对于用户在运行时不可见,提供了一个简单的途径访问TCP及UDP网络服务而无需了解底层细节棗你只需设置属性、在恰当的时候调用它提供的方法即可。

主要属性有:

BytesReceived:返回当前缓冲区中的字节数量, 我们可以使用 GetData 方法以接收数据. 只读且设计时不可用

LocalHostName:返回本机名字符串,设计时不可用。

LocalIP:返回以(xxx.xxx.xxx.xxx)格式表达的IP地址串。设计时不可用,运行时只读。

LocalPort :本机使用牡刂罚?可读写,设计时可用,Long型。对于客户, 如果无需指定端口,则用端口0发送数据。在此情况下,控件将随机选择一个端口。 在一个连接确定后,为TCP的端口。对于服务器, 指用于监听的端口。 如设置为0, 则用随机数。 在调用Listen 方法后,该属性自动包含用到的端口。端口0总是用于在两计算机间建立动态连接。客户希望通过端口0获得一个随机端口以”回调”连接服务器 。

Protocol :套接字类型,为TCP或UDP二者之一,缺省为TCP类型。设置为sckTCPProtocol 表示TCP 协议sckUDPProtocol表示UDP 协议。在此属性被重置之前需用Close方法关闭之。

RemoteHost:发送或接收数据的主机,你可提供主机名如: “FTP://ftp.microsoft.com“; 或 一 IP地址串, 例如 “100.0.1.1″。

RemoteHostIP:远程主机的IP地址。对于客户程序, 在连接确定后使用Connect方法,此属性包含远程主机的IP名串。对于服务器程序, 在引入连接需求后 (ConnectionRequest 事件),此属性包含 IP 串。当使用UDP套接字 ,在 DataArrival 事件发生后, 此属性为发送UDP数据的机器 IP 地址串。

RemotePort:连接套接字端口值。例如通常HTTP应用使用80端口,FTP则使用21。

State:控件的状态, 只读且设计时不可用。可为以下值:

常量 描述

sckClosed 0 缺省值,关闭套接字

sckOpen 1 打开套接字

sckListening 2 正监听端口

sckConnectionPending 3 正在进行未定的连接

sckResolvingHost 4 正解析主机地址

sckHostResolved 5 主机地址已解析

sckConnecting 6 正在连接

sckConnected 7 已连接

sckClosing 8 连接关闭

sckError 9 错误

其它属性类似一般控件。

主要方法有:

Accept :仅用于TCP服务器应用。 此方法用于在引入一个连接时响应ConnectionRequest 事件。语法:object.Accept requestID返回值:Void。响应事件时必须传递RequestID参数给此方法,以生成新的Socket实例用于实际的信息传输。

Bind :设定LocalPort及 LocalIP用于 TCP 连接。 当你有多个协议适配器时使用。语法:object.Bind LocalPort, LocalIP。LocalPort 此端口用于连接,LocalIP 生成连接的IP地址。如果已设定相关属性,可不必携带相关参数。在调用Lisent方法之前调用此方法。

Close :在客户或服务器方关闭TCP连接。语法:object.Close。参数:无。返回值:Void。

GetData :接收存于可变类型中的数据块。返回值:Void。语法:object.GetData data, [type,] [maxLen]。Data:接收数据的变量,如果空间不够,将设置为空。Type:可选,接收的类型, 自行设置。MaxLen:可选参数。 设定接收数组或字符串类型数据的尺寸。如果参数省缺,将接收所有的数据。如果提供数组或字符串以外的数据类型,则忽略此参数。Type可以设置为常用的数据类型。通常在DataArrival 事件中使用该方法。此事件包含totalBytes 参数. 如果你设定的maxlen 小于totalBytes 参数,你将得到一个由10040表示的剩余字节将丢失的警告信息。

Listen :建立一个设置为监听模式的套接字。此方法仅用于TCP连接。语法:object.Listen

参数:无。返回值:Void。当调用Listen之后,引入一个连接时发生ConnectionRequest 事件。当处理 ConnectionRequest时, 应用程序必须使用Accpet方法来响应。

PeekData :同GetData类似但PeekData 不从输入队列中移去数据。此方法仅用于TCP连接。语法:object.PeekData data, [type,] [maxLen]

SendData :向远地主机发送主机。返回值:Void。语法:object.SendData data。Data:将要发送的数据,使用字节数组。当使用UNICODE格式串时将在发送之前转换为ANSI串 。

发生的事件有:

Close :发生于远程主机关闭连接。为了正确的关闭TCP连接应当使用Close方法。

Connect :当连接行动完成时。语法:object.Connect()。用此事件表明连接成功。

ConnectionRequest :发生于一个远端主机要求确定一个连接时。仅用于TCP 服务器应用。RemoteHostIP 及 RemotePort 属性在此事件后存储了关于客户机的信息。语法: object_ConnectionRequest (requestID As Long) 。requestID:引入的连接的请求标识。此参数传给Accept方法中的第二个控件实例。服务器可以决定是否认可该连接。如果引入 的连接未被认可,客户将受到一个Close事件。使用Accept方法接受引入的连接。

DataArrival :当新数据抵达时发生。语法:object_DataArrival (bytesTotal As Long)。BytesTotal,Long型。 总计收到的数据量。此事件在你调用GetData方法之前将不会再发生。仅在有新数据抵达时激活。你可以在任何时刻使用BytesReceived 属性检查多少数据有效。

Error :表明发生了错误。限于篇幅,错误码忽略。

SendComplete :当发送动作完成时发生。语法:object_SendComplete。参数:无。

SendProgress:当发送数据时产生本事件。语法:object_SendProgress (bytesSent As Long, bytesRemaining As Long)。BytesSent:本事件发生以来发送的数据量。BytesRemaining: 缓冲区中等待发送的数据。

三.Winsocket编程应用实例

可以看到,Winsocket控件允许我们采用两种传输协议进行通信。TCP协议允许你建立并维持同远端主机的连接,通过连接双方可以以”stream”方式传输数据。利用此种方式的客户必须要知道服务器的名字(RemoteHost属性),也要知道服务器正监听(Listening)的端口(RemotePort),然后调用Connect方法。服务器程序则必须设置本Scoket的监听端口(LocalPort),然后调用Listen方法;当客户要求建立一个连接时,服务器方产生ConnectionRequest事件,如果服务器想完成连接,则调用Accept方法认可。一旦连接建立成功,双方计算机都能利用SendData方法发送。当接收到数据时,发生DataArrival事件,我们可以在此事件中调用GetData方法接收数据。而如果采用UDP协议,则客户机设置本地监听端口(LocalPort属性),服务器计算机设置客户机的名字(RemoteHost)以及监听端口属性(RemotePort),然后即可调用SendData方法发送数据;客户机在DataArrival事件中使用GetData方法接收信息。

为了演示编程细节,特编写一个供两人使用的”Chat”应用程序:程序分客户和服务器两独立的部分。先启动服务器应用程序,然后启动客户程序,经过握手后建立连接,然后双方即可相互通信,且由于采用TCP协议可以实现信息的实时准确传输。

具体步骤如下:

服务器程序的编写:

建立标准工程,然后选Project下的components…,从弹出的对话框中选中Microsoft Winsock Control 5.0,确定后会在控件面板中多出一个名为Winscok的控件。此控件即本文的”主脚”。
将Form1的Caption属性改为”SockSrv”,在窗体上添加刚刚加入工程的Winsock控件。
分别加入三个Label和TextBox控件,一个Command控件,设置它们属性和作用见下:
Label1.Caption=”监听端口:”, Label2. Caption =” 客户消息:”,Label3. Caption =” 服务器消息:”

TextBox1.Text=”900″,此控件用于设置 Winsock的服务器端监听端口。

TextBox2.Text= ” “,TextBox2. MultiLin=Ture,TextBox2.ScrollBar=2。控件通过设置Text属性为空格,可以使初始的信息为空白,MultiLin属性为True可以允许多行显示,可以实时显示服务器同客户之间的交流。设置ScrollBar属性为2,可以加入一个垂直滚动条,允许显示多行的信息。本控件的主要作用在于实时显示服务器、客户之间的交流内容。

TextBox3的属性设置同TextBox2,主要作用在于输入服务器用户的信息。

Command1的标题为”监听”,用于将服务器转于监听端口的连接请求状态。

添加代码,具体内容可设为如下:
在Form1.Load事件添加:Winsock1.LocalPort = Text1.Text,作用是将Text1所定义的监听端口设置给Winsock控件。

在Command1的Click事件中添加:

If Winsock1.State <> sckClosed Then Winsock1.Close ‘在当前套接字未关闭时将其关闭

Winsock1.Bind ‘将设置值生效

Winsock1.Listen ‘监听端口的连接请求

在Winscok的几个事件中添加代码:

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

If Winsock1.State <> sckClosed Then Winsock1.Close

Winsock1.Accept requestID ‘在监听的端口有连接请求发生时,立即调用Accept方法

‘认可连接,使之生效。

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strData As String

Winsock1.GetData strData, vbString‘当有数据到达时,调用GetData方法接收之

Text2.Text = strData ‘将接收的内容更新显示在Text2中

End Sub

以上即是将服务器端的设置设定,下面我们来看看客户端的程序。

建立新的标准工程,按照上面的方法添加 Winsock控件至控件面板中。
修改工程名为”SckClient”,并添加Winsock控件至窗体中。
添加三个Label和Text控件,两个Command控件,它们的属性分别为:
label1.caption=”服务器的地址:”,Label2.caption=”服务器发送的信息”,label3.caption=”客户消息”。

Text1.text= “www.ysh.com”,此处即客户要与之通讯的服务器地址或名字,此处应该填写实际运行时的服务器的名字或者TCP/IP协议的IP地址。www.ysh.com是我的在我所处的局域网上的主机名。

Text2.MultiLin=True,这是为了能够多行显示服务器发出的信息。为了能够查看到服务器发出的所有信息,还应设置ScollBar属性为3。

Text3也应是一个允许多行显示的控件。

Command1和Comand2的Caption分别为”连接”、”断开”,用于决定Winsock的连接状态。

添加相应的代码:
在Form_Load()中输入:Winsock1.RemotePort = “900″,用于确定同服务器建立套接字的端口。

在 Command1_Click()中输入:

If Winsock1.State <> sckClosed Then Winsock1.Close ‘如果套接字未关闭,先关闭之

Winsock1.RemoteHost = Text1.Text ‘确定服务器的主机名

Winsock1.Bind ‘绑定套接字属性

Winsock1.Connect ‘向服务器发出连接请求

Command1.Enabled = False ‘使Command1不可用

Command2.Enabled = True ‘现在可以使其断开

在Command2_Click()中输入代码:

Command1.Enabled = True

Command2.Enabled = False

Winsock1.Close ‘关闭当前套接字

对于Winsock控件的各个事件,可以参考以下代码:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim str As String

Winsock1.GetData str, vbString ‘按照字符串类型接收信息

Text2.Text = str ‘立即更新到Text2中

End Sub

Private Sub Winsock1_Connect() ‘在连接成功后弹出消息框

MsgBox “connected to server!”

End Sub

为了实时将Text3的内容反映到服务器的信息框,需要Text3_Change()输入如下代码:

If Winsock1.State = sckConnected Then Winsock1.SendData Text3.Text

通过以上的设置编写,服务器、客户双方的动作皆设置完毕,我们就可以在网络上进行通信了。先启动服务器,按下”连接”按钮,等待客户机的请求,然后启动客户,输入正确的服务器地址或主机名,按下”连接”按钮,当弹出一个消息框时,表明连接成功,此时无论在服务器还是客户的Text3中输入任何信息,在对方的Text2中均会实时显示,这样一个简单的”Chat”程序开始正常工作了。

四.程序说明

调试以上程序,需要一定的技巧。因为Winsock控件是基于网络的控件,所以在调试运行的机器上必须网络安装完好,并且TCP/IP协议要安装;同时又由于是基于C/S模式的应用,所以需要同时运行两个进程或者在两台已经通过TCP/IP协议联网的机器上运行。单机上调试需要一定的技巧,我们可以同时启动两个VB,分别打开客户和服务器两个工程,设计完后通过任务切换启动它们。这样可以利用Windows95的多任务在单机上完成对网络仿真。

本程序只是简单的演示Winsock控件的功能,通过此例展示VB编程的强大功能。本例中限于篇幅未能详细完善错误捕获、安全检验等措施,需要在实用化过程中注意。

另外,本例仅限于两台机器之间的通信,通过添加多个Winsock实例,设置相应的端口,我们可以允许多人同时”登录”至服务器,真正实现聊天室的功能,届时没有必要花费巨额的上网费,您就可以”享受”到互联网的服务。而且本程序也可以在互联网上供两台机器使用以交流信息,通过设定同朋友约定的端口,你可以在上互联网后启动客户或服务器程序,在网上来个”即时通(信)”。

以上程序在Pwin98系统、VB5.0上通过。实际上我们还可以将此控件用于VFP、VC、PB等支持ActiveX控件的语言上。在此抛砖引玉,不当之处望诸位同仁指教。

Google搜索秘技数则

虽然现在不少朋友都懂得利用搜索引擎来查找资料,但效率却每个人都有所不 同,其原因就在是否掌握了所需的搜索技巧和搜索知识。Google作为搜索引擎中的领头羊,无论其独特的搜索技术还是无与伦比的搜索速度都是首屈一指的, 因此得到了无数网友的”芳心”。为帮忙更多的菜鸟和初学者能迅速掌握更灵活的搜索方法,在此我把体会到的搜索技巧与大家一起分享:

一、把搜索引擎当作计算器

如果有人告诉你可以把搜索引擎当作计算器,请你不要惊讶,这是千真万确的事。近日,Google就向用户们提供了这样的功能:在其搜索服务中增加了一个 算术计算器。用户直接在搜索框中键入算术表达式(例如”9*6-3″)即可获得答案。如果安装有Google的工具栏软件则更加可以直接在浏览器相应位置 键入,省去了访问Google主页的时间。此外,该计算器不仅能完成简单的加减乘除运算,还可处理常规换算问题以及物理常数问题,可惜目前这几个功能只支 持数字的英文输入,还无法识别中文。有了这个计算功能,上网后无需到处找计算器了。

二、被人误解的”OR”

“OR”在很多搜索引擎中都是表示逻辑”或”的意思,用于表明多个搜索关键字间的关系,但一直以来,很多网友都误以为Google不支持”OR”的逻辑 符,原因很简单:用了该逻辑符后,并没有出现相应的结果,反而是适得其反。究其原因就是在使用中没有注意英文大小写,一般情况下,在Google中是忽略 英文大小写的,但”OR”却是例外的一个。举个例子:分别输入”搜索引擎 or 历史”和”搜索引擎 OR 历史”,所得到结果数量完全不同,因为前者要求网页中必须同时有”搜索引擎”和”历史”两个关键字,而后者则只要求其中之一就满足条件了,当然出现的结果 数量差异就比较突出。

三、如何选择服务器

Google在互联网上有许多镜像站点,用于搜索的服务器也有数千台, 但你可知道,它们对各种语种更新的速度是各自不同的,而且各服务器的更新时间也是不一样的,其采用的更新方式经常是梯度式进行,即先更新某些服务器,后来 全面更新。在使用中本人发现,Google对中文语种最快更新的服务器是以下这个网址:http://www3.google.com,因为当我使用http://www.google.com没有找到任何结果时改用http://www3.google.com进行搜索则常常有意想不到的效果,这种情况在搜索一些如时事新闻一类更新频繁的内容时效果更加明显。所以建议各位尽快更新书签中Google主页的网址。

四、查找缩略词的全称

无论在互联网上还是计算机术语中都存在着许多五花八门、千奇百怪的缩略词,当遇到这些陌生的缩略词时,你是否感到莫名其妙、不知所云。为了了解它的本 义,只好不断翻阅各种专业字典或请教别人,其实,利用Google查找缩略词的全称或原义简直就是易如反掌,手到擒来,具体做法是:输入”缩略词 英文缩写”(例如”VIP 英文缩写”)即可。同时,只要稍做变通,用这个方法来搜索一些流行语也很方便:例如搜索”什么是MM”,其固定格式是以”什么是XX”等形式进行输入,多 数都能找到。

五、搜索特定文件

Google中支持特定文件搜索(”filetype:”就是它的搜索语法),这 是一个非常强大而实用的功能却没有得到广大网友的重视。有了它的帮忙,网友不仅能搜索一般的文字页面,还能对某些二进制文档进行检索,”下载狂”从此可以 很轻易找到所需的文件,”懒虫”们也可以”借花敬佛”,乐得自在:例如某个朋友过生日,想送上一则有趣的动画以表心意,但苦于自己不会做Flash或者懒 得亲自动手,则可利用Google搜索一下,输入”birthday filetype:SWF”或”loveyou filetype:SWF”,就能找到许多精美的Flash,从中挑选一下寄过去就是了,省时省力,何乐而不为。

六、被人忽视的二则功能

新闻组搜索和目录检索是Google的两个重要功能,只是国内朋友由于使用习惯上的缘故,对它们知之甚少或者一无所知。长期以来,”泡”论坛和”灌水” 是不少网友每天必做的”功课”,但却不知道新闻组的信息量要比任何一个BBS都要大得多,其每天更新的信息更是BBS所难以项背的。当你在常规网页中不能 找到答案,则建议点击搜索页面上的”网上论坛”标签试试。另一方面,如果想寻找某些专题网站,则可以访问Google的分类目录”http://directory.Google.com/“(中文目录是http://directory.Google.com/Top/World/Chinese_Simplified/)进行浏览,而且其目录是由全世界各地的义务编辑人员来审核挑选网页,并依照网页的性质及内容来分门别类。因此,在某一目录门类中进行搜索往往要比同类搜索引擎有更高的命中率和工作效率。

Page 58 of 60« First...«5657585960»