﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一江春水向东流-随笔分类-文章收藏</title><link>http://www.blogjava.net/huyi2006/category/18153.html</link><description>                            做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。</description><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2012 09:23:46 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2012 09:23:46 GMT</pubDate><ttl>60</ttl><item><title>长连接与短连接的区别</title><link>http://www.blogjava.net/huyi2006/archive/2012/06/12/380613.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Tue, 12 Jun 2012 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/archive/2012/06/12/380613.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/380613.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/archive/2012/06/12/380613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/380613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/380613.html</trackback:ping><description><![CDATA[一、长连接与短连接：  <br>
长连接：client方与server方先建立连接，连接建立后不断开，然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。<br>
短连接：Client方与server每进行一次报文收发交易时才进行通讯连接，交易完毕后立即断开连接。此方式常用于一点对多点通讯。C/S通信。<br>


二、长连接与短连接的操作过程：
短连接的操作步骤是：建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接<br>

长连接的操作步骤是：建立连接——数据传输...（保持连接）...数据传输——关闭连接<br>


三、长连接与短连接的使用时机：<br>

长连接：短连接多用于操作频繁，点对点的通讯，而且连接数不能太多的情况。每个TCP连接的建立都需要三次握手，每个TCP连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低，所以每次操作下次操作时直接发送数据就可以了，不用再建立TCP连接。例如：数据库的连接用长连接，如果用短连接频繁的通信会造成socket错误，频繁的socket创建也是对资源的浪费。<br>

短连接：web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接，而且同时用成千上万的用户，每个用户都占有一个连接的话，可想而知服务器的压力有多大。所以并发量大，但是每个用户又不需频繁操作的情况下需要短连接。总之：长连接和短连接的选择要视需求而定。<br>


四、发送接收方式：<br>

1、异步：报文发送和接收是分开的，相互独立，互不影响的。这种方式又分两种情况：<br>

异步双工：接收和发送在同一个程序中，有两个不同的子进程分别负责发送和接送。<br>

异步单工：接送和发送使用两个不同的程序来完成。<br>


2、同步：报文发送和接收是同步进行，即报文发送后等待接送返回报文。同步方式一般需要考虑超时问题，试想我们发送报文以后也不能无限等待啊，所以我们要设定一个等待时候。超过等待时间发送方不再等待读返回报文。直接通知超时返回。<br>


五、报文格式：<br>

通信报文格式多样性更多，相应地就必须设计对应的读写报文的接收和发送报文函数。<br>

阻塞与非阻塞方式
<br>
1、非阻塞方式：读函数不停的进行读动作，如果没有报文接收到，等待一段时间后超时返回，这种情况一般需要指定超时时间。
<br>
2、阻塞方式：如果没有接收到报文，则读函数一直处于等待状态，知道报文到达。<br>

循环读写方式<br>

1、一次直接读写报文：在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。<br>

2、不指定长度循环读写：这一版发生在短连接进程中，受网络路由等限制，一次较长的报文可能在网络传输过程中被分解成很多个包，一次读取可能不能全部读完一次报文，这就需要循环读取报文，知道读完为止。<br>

3、带长度报文头循环读写：这种情况一般在长连接中，由于在长连接中没有条件能够判断循环读写什么时候结束。必须要加长度报文头。读函数先是读取报文头的长度，再根据这个长度去读报文，实际情况中，报头码制格式还经常不一样，如果是非ASCII的报文头，还必须转换成ASCII常见的报文头编制有：1、n个字节的ASCII码。2、n个字节的BCD码。3、n个字节的网络整型码。<br>

以上是几种比较典型的读写报文方式，可以与通信方式模板一起 预先提供一些典型的API读写函数。<br>


当然在实际问题中，可能还必须编写与对方报文格式配套的读写API. 在实际情况中，往往需要把我们自己的系统与别人的系统进行连接， 有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。
<img src ="http://www.blogjava.net/huyi2006/aggbug/380613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2012-06-12 15:58 <a href="http://www.blogjava.net/huyi2006/archive/2012/06/12/380613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求素数</title><link>http://www.blogjava.net/huyi2006/archive/2008/07/28/218014.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Mon, 28 Jul 2008 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/archive/2008/07/28/218014.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/218014.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/archive/2008/07/28/218014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/218014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/218014.html</trackback:ping><description><![CDATA[ 有时我们需要特定的素数，比如我们在对哈希表取模是就要用到。这你给出了一段小程序可以找出给定数附近的素数。程序在VC6.0下编译通过<br /><div style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #f5f5f5"><div>#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;math.h&gt;<br />int prime(int m)<br />{<br /> int i,k;<br /> k = (int)sqrt(m);<br /> for(i=2; i&lt;k; i++)<br /> if (m % i == 0)<br />  return 0;<br /> return 1;<br />}<br />int main(int argc, char** argv)<br />{<br /> int input = 0;<br /> int val, ret = 0;<br /> if (argc != 2)<br /> {<br />  printf("usage:find_prime num\n");<br />  exit(-1);<br /> }<br />   <br /> input = atoi(argv[1]);<br /> //printf("%d\n",input);<br /> val = input;<br /> //向下找<br /> while (!ret)<br /> {<br />  ret = prime(val);  <br />  val--;<br /> }<br /> printf("%d\n", ++val);<br /> //向上找<br /> val = input;<br /> ret = 0;<br /> while (!ret)<br /> {<br />  ret = prime(val);<br />  val++;<br /> }<br /> printf("%d\n", --val);<br />    return 0;<br />}</div></div><br />转自好特吧 <br /><a href="http://www.hot818.net">www.hot818.net</a><br /><img src ="http://www.blogjava.net/huyi2006/aggbug/218014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2008-07-28 11:56 <a href="http://www.blogjava.net/huyi2006/archive/2008/07/28/218014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene倒排索引原理(转) </title><link>http://www.blogjava.net/huyi2006/archive/2008/05/10/199658.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Sat, 10 May 2008 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/archive/2008/05/10/199658.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/199658.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/archive/2008/05/10/199658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/199658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/199658.html</trackback:ping><description><![CDATA[Lucene是一个高性能的java全文检索工具包，它使用的是倒排文件索引结构。该结构及相应的生成算法如下： <br /><br />0）设有两篇文章1和2 <br />文章1的内容为：Tom lives in Guangzhou,I live in Guangzhou too. <br />文章2的内容为：He once lived in Shanghai. <br /><br />1)由于lucene是基于关键词索引和查询的，首先我们要取得这两篇文章的关键词，通常我们需要如下处理措施 <br />a.我们现在有的是文章内容，即一个字符串，我们先要找出字符串中的所有单词，即分词。英文单词由于用空格分隔，比较好处理。中文单词间是连在一起的需要特殊的分词处理。 <br />b.文章中的”in”, “once” “too”等词没有什么实际意义，中文中的“的”“是”等字通常也无具体含义，这些不代表概念的词可以过滤掉 <br />c.用户通常希望查“He”时能把含“he”，“HE”的文章也找出来，所以所有单词需要统一大小写。 <br />d.用户通常希望查“live”时能把含“lives”，“lived”的文章也找出来，所以需要把“lives”，“lived”还原成“live” <br />e.文章中的标点符号通常不表示某种概念，也可以过滤掉 <br />在lucene中以上措施由Analyzer类完成 <br /><br />经过上面处理后 <br />文章1的所有关键词为：[tom] [live] [guangzhou] [i] [live] [guangzhou] <br />文章2的所有关键词为：[he] [live] [shanghai] <br /><br />2) 有了关键词后，我们就可以建立倒排索引了。上面的对应关系是：“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来，变成：“关键词”对“拥有该关键词的所有文章号”。文章1，2经过倒排后变成 <br />关键词 文章号 <br />guangzhou 1 <br />he 2 <br />i 1 <br />live 1,2 <br />shanghai 2 <br />tom 1 <br /><br />通常仅知道关键词在哪些文章中出现还不够，我们还需要知道关键词在文章中出现次数和出现的位置，通常有两种位置：a)字符位置，即记录该词是文章中第几个字符（优点是关键词亮显时定位快）；b)关键词位置，即记录该词是文章中第几个关键词（优点是节约索引空间、词组（phase）查询快），lucene中记录的就是这种位置。 <br /><br />加上“出现频率”和“出现位置”信息后，我们的索引结构变为： <br />关键词 文章号[出现频率] 出现位置 <br />guangzhou 1[2] 3，6 <br />he 2[1] 1 <br />i 1[1] 4 <br />live 1[2],2[1] 2，5，2 <br />shanghai 2[1] 3 <br />tom 1[1] 1 <br /><br />以live 这行为例我们说明一下该结构：live在文章1中出现了2次，文章2中出现了一次，它的出现位置为“2,5,2”这表示什么呢？我们需要结合文章号和出现频率来分析，文章1中出现了2次，那么“2,5”就表示live在文章1中出现的两个位置，文章2中出现了一次，剩下的“2”就表示live是文章2中第 2个关键字。 <br /><br />以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的（lucene没有使用B树结构），因此lucene可以用二元搜索算法快速定位关键词。 <br /><br />实现时 lucene将上面三列分别作为词典文件（Term Dictionary）、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词，还保留了指向频率文件和位置文件的指针，通过指针可以找到该关键字的频率信息和位置信息。 <br /><br />Lucene中使用了field的概念，用于表达信息所在位置（如标题中，文章中，url中），在建索引中，该field信息也记录在词典文件中，每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。 <br /><br />为了减小索引文件的大小，Lucene对索引还使用了压缩技术。首先，对词典文件中的关键词进行了压缩，关键词压缩为&lt;前缀长度，后缀&gt;，例如：当前词为“阿拉伯语”，上一个词为“阿拉伯”，那么“阿拉伯语”压缩为&lt;3，语&gt;。其次大量用到的是对数字的压缩，数字只保存与上一个值的差值（这样可以减小数字的长度，进而减少保存该数字需要的字节数）。例如当前文章号是16389（不压缩要用3个字节保存），上一文章号是16382，压缩后保存7（只用一个字节）。 <br /><br />下面我们可以通过对该索引的查询来解释一下为什么要建立索引。 <br />假设要查询单词 “live”，lucene先对词典二元查找、找到该词，通过指向频率文件的指针读出所有文章号，然后返回结果。词典通常非常小，因而，整个过程的时间是毫秒级的。 <br />而用普通的顺序匹配算法，不建索引，而是对所有文章的内容进行字符串匹配，这个过程将会相当缓慢，当文章数目很大时，时间往往是无法忍受的。<br /><img src ="http://www.blogjava.net/huyi2006/aggbug/199658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2008-05-10 09:51 <a href="http://www.blogjava.net/huyi2006/archive/2008/05/10/199658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新的一年就技术开发作个总结</title><link>http://www.blogjava.net/huyi2006/archive/2008/02/17/180238.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Sun, 17 Feb 2008 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/archive/2008/02/17/180238.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/180238.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/archive/2008/02/17/180238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/180238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/180238.html</trackback:ping><description><![CDATA[
		<p>到现在为止，粗略估算一下工作时间有一年半了吧，这是加上我在校期间从事的项目时间的。<br />从事的项目有<br />1、利用超图的GIS系统作二次开发，后来出于某些原因中途离开了，但学到了不少东西。<br /><br />2、为迎接学校评估，用PHP给学院开发了一个内容管理系统，当时有4个人开发这个系统，长了不少项目开发经验，体会到了团队合作的重要性。项目最后是完美的交付给学校，初次体会到成功的喜悦，至今让人怀念。<br /><br />3、2007年2月份到了武汉，开始从事linux下的C语言开发，从此就关注一些系统底层的开发以及算法，到目前应该说单就C语言开发也1年有余了吧。工作经验有：<br />    用到各种算法和数据结构，对网络上的数据进行处理。要尽可能的提高处理的效率<br />     独自维护一套3万多行代码的项目，并对这个项目做了重大改版，亲手写的代码量应该有5千行以上吧，并在必要时解答客户的疑问。<br />     对于这个项目新添加的功能的设计工作都是由自己来完成，包括处理流程，数据结构，以及数据库的设计。<br />     学习到了丰富的linux下的开发经验及相关理论知识，如线程编程，内存池的运用，进程间的通信，Makefile的编写，shell的运用。<br />     有了丰富的调试经验，能熟练的运用gdb对程序进行调试，调试过段错误，多线程中的死循环，死锁问题。煅炼了解决问题的能力。<br />     <br />平时也会抽出时间看了一些经典技术书籍,如《Write Clean Code》<br /><br /><br /></p>
<img src ="http://www.blogjava.net/huyi2006/aggbug/180238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2008-02-17 10:46 <a href="http://www.blogjava.net/huyi2006/archive/2008/02/17/180238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>站在巨人的肩上——公交查询系统做得差不多了</title><link>http://www.blogjava.net/huyi2006/archive/2006/12/06/85965.html</link><dc:creator>allic</dc:creator><author>allic</author><pubDate>Wed, 06 Dec 2006 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/huyi2006/archive/2006/12/06/85965.html</guid><wfw:comment>http://www.blogjava.net/huyi2006/comments/85965.html</wfw:comment><comments>http://www.blogjava.net/huyi2006/archive/2006/12/06/85965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi2006/comments/commentRss/85965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi2006/services/trackbacks/85965.html</trackback:ping><description><![CDATA[   <font size="4">    <font style="BACKGROUND-COLOR: #ffffff" color="#000099">前些天在网上查些PHP开发的资料时意外的找到了一些高手写了一关于公交查询的类，我前些阵子一直为这个而苦恼，想是才用什么算法好。是采用路由算法吗？那样是相当麻烦的。自已也想到了一些解决的方案。自已效率上实在是不行。都需要多次查询数据库，我看了一下这个从网上高手提供的类，然后自己编写了一个添加，修改的类，实例后做了一些测试，就吉林市的几十路公交车一次换乘查询在最坏情况下得要上千次查询，在做之前自已都不敢想。看来一次只进行一次查询还是行不通的。看着那个核心算法里有四层的循环，给人一种可怕的事，还有也有不可取的情况，查了一些从吉林站到我就读的北华北校区的公交换乘方案有几十种之多，但是我从吉林站到学校只会坐一趟就行。那个站不是直接到学校的，而是到一个离学校较近的站，从这点看，在这方面得要一个模糊的处理，或者再增加一个功能。找一个最近的直达站点，我想如果把这个加了WEBGIS上可能更好处理一点，不过我自己还是想把这个类给改进一下。<br />        另一外事就是我从网上看到一家广州的公司招软件开发工程师，联系以后给我打了好几次电话了，虽然现在我不知那家公司怎么样，自己会不会去，但他们那么有诚意我还是很感动的。毕竟对于前些阵子投了那么多份简历没有回音的确是一份安慰。<br />     贴个图片，全是文字太单调了<img height="19" src="http://www.blogjava.net/Emoticons/tongue_smile.gif" width="19" border="0" /><br /><p align="left"><img height="200" alt="r_3db546e6020005e6.gif" src="http://www.blogjava.net/images/blogjava_net/huyi2006/17681/r_3db546e6020005e6.gif" width="500" border="0" /></p><br /></font></font><img src ="http://www.blogjava.net/huyi2006/aggbug/85965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi2006/" target="_blank">allic</a> 2006-12-06 22:39 <a href="http://www.blogjava.net/huyi2006/archive/2006/12/06/85965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>