<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_隐锋的BLOG</title><subtitle type="text">ASP，.net开发</subtitle><id>http://feed.cnblogs.com/blog/u/18935/rss</id><updated>2011-12-27T16:37:26Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/18935/rss"/><entry><id>http://www.cnblogs.com/coolattt/archive/2011/12/16/2289995.html</id><title type="text">Java与Flex通信[转]</title><summary type="text">提到通信就得面临两个问题，一是通信协议的选择，二是数据协议的定义。通信协议耳熟能详的就有好几种，TCP，UDP，HTTP，FTP等等。数据协议是一种数据交换的格式，像jason,xml,amf3,google protocol都可以用作数据协议，你也可以自己根据通信的效率，安全等因素来定义自己的数据协议。 通信系统的开发是一项很复杂的工作，不要以为往发服务端发一个Hello World！就认为完全掌握了通信系统的开发。概括来说要开发一个健壮的通信系统，必须从这几个方面来着手。 一，通信粘包的处理 这里包的概念是逻辑上的数据包，也就是我们发送的一个完整业务消息包，粘包情况有两种，一种是...</summary><published>2011-12-16T04:14:00Z</published><updated>2011-12-16T04:14:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/12/16/2289995.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/12/16/2289995.html"/><content type="html">&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;提到通信就得面临两个问题，一是通信协议的选择，二是数据协议的定义。通信协议耳熟能详的就有好几种，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;TCP&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;UDP&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;HTTP&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;FTP&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;等等。数据协议是一种数据交换的格式，像&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;jason,xml,amf3,google protocol&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;都可以用作数据协议，你也可以自己根据通信的效率，安全等因素来定义自己的数据协议。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;通信系统的开发是一项很复杂的工作，不要以为往发服务端发一个&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;Hello World&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;！就认为完全掌握了通信系统的开发。概括来说要开发一个健壮的通信系统，必须从这几个方面来着手。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;　　&lt;span&gt;一，&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;通信粘包的处理&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　这里包的概念是逻辑上的数据包，也就是我们发送的一个完整业务消息包，粘包情况有两种，一种是粘在一起的包都是完整的数据包，另一种情况是粘在一起的包有不完整的包。&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不是所有的粘包现象都需要处理，若传输的数据为不带结构的连续流数据（如文件传输），则不必把粘连的包分开（简称分包）。但在实际工程应用中，传输的数据一般为带结构的数据，这时就需要做分包处理。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　为了避免粘包现象，可采取以下几种措施。一是对于发送方引起的粘包现象，用户可通过编程设置来避免，&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;提供了强制数据立即传送的操作指令&lt;/span&gt;push&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;软件收到该操作指令后，就立即将本段数据发送出去，而不必等待发送缓冲区满；二是对于接收方引起的粘包，则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施，使其及时接收数据，从而尽量避免出现粘包现象；三是由接收方控制，将一包数据按结构字段，人为控制分多次接收，然后合并，通过这种手段来避免粘包。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　以上提到的三种措施，都有其不足之处。总的来说降低了通信系统的吞吐量。我们可以自己设计一个分包算法来处理粘包的问题，该算法的实现是这样的:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: 宋体"&gt;当有数据到达时，将数据压入程序缓冲区。&lt;/li&gt;&lt;li&gt;循环处理缓冲区，如果缓冲区长度大于包头长度，则取出长度信息n，否则跳出循环，如果缓冲区的长度大于n，则从缓冲区取出一个完整包进行处理，否则跳出循环。&lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p&gt;如果你是Java的爱好都可以参考一下Mina和netty2的实现，像Mina和Netty2都提供了粘包处理类可供使用，像Mina的CumulativeProtocolDecoder类,Netty2的LengthFieldBasedFrameDecoder。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　二，数据协议选择&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　现在已经有很多数据协议可供我们选择，像&lt;/span&gt;jason,xml,amf3,google protocol&lt;span style="font-family: 宋体"&gt;等等，这些协议相应的语言都有&lt;/span&gt;API&lt;span style="font-family: 宋体"&gt;来对自身数据做协议处理，我们选择协标准无非就是效率和大小，这里每个人可以根据实际的应用环境选择适合的数据协议。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;　　三，网络系统的安全性&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;　　网络安全是一个永远的话题，对通信数据加密一般常RSA对byte流加密，&lt;/span&gt;FLOOD&lt;span style="font-family: 宋体"&gt;验证，&lt;/span&gt;IP&lt;span style="font-family: 宋体"&gt;黑名单验证都是必须考虑到的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;　　以上是做网络开发必须了解的一些基础知识，在这里我们使用一个具体的实例来加深一下理解，Java与Flex使用AMF3数据协议通信。做过网络开发的一般都会知道套接字（SOCKET），很多语言都会通SOCKET来提供对网络操作的API，Java的提供的NIO SOCKET是一个高效的异步通信API，当然可以在这个基础上来开发我们的网络应用，但这种Native API需要我们花很多精力来处理网络通信的细节，消弱了我们对业务的关心。为我们开发带来很多不便性，幸好Java有很多现成的NIO SOCKET框架可供使用，&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;像&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;Mina&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;Netty2&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;，&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;xSocket&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;等等，这些框架处理了很多底层的通信问题，提供了一些易用的&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体" lang="EN-US"&gt;API&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;以供使用。在这个实例中我们使用Netty2来做通信框架。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;　　定义消息包，消息包有定长包和不定长包，不定长包无非就是要在消息包中加入长度信息，以对收到的网络字节流进行分界。消息包的定义如下&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/51cto/nb005.gif" width="300" height="63" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;　　定义AMF3数据协议的编码和解码器&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;span style="font-family: 宋体"&gt;　&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('40feeac4-67f3-404a-81f1-96342db88203')"&gt;&lt;img style="display: none" id="code_img_opened_40feeac4-67f3-404a-81f1-96342db88203"  onclick="cnblogs_code_hide('40feeac4-67f3-404a-81f1-96342db88203',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_40feeac4-67f3-404a-81f1-96342db88203" &gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;@(#)AMF3Encoder.java&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.1&amp;nbsp;05/11/17&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;Copyright&amp;nbsp;2010&amp;nbsp;QISI,&amp;nbsp;Inc.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;QISI&amp;nbsp;PROPRIETARY/CONFIDENTIAL.&amp;nbsp;Use&amp;nbsp;is&amp;nbsp;subject&amp;nbsp;to&amp;nbsp;license&amp;nbsp;terms.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;package&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;com.qidea.pushserver.codec;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;java.io.ByteArrayOutputStream;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.buffer.ChannelBuffer;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.buffer.ChannelBuffers;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.channel.Channel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.channel.ChannelHandlerContext;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.handler.codec.oneone.OneToOneEncoder;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;com.qidea.pushserver.Constants;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;com.qidea.pushserver.message.CommandMessage;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;com.qidea.pushserver.message.PushMessage;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;flex.messaging.io.SerializationContext;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;flex.messaging.io.amf.Amf3Output;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@author&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;sunwei&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@version&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2010-7-21&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@since&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;JDK1.5&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Encoder&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;OneToOneEncoder&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Object&amp;nbsp;encode(ChannelHandlerContext&amp;nbsp;arg0,&amp;nbsp;Channel&amp;nbsp;arg1,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;arg2)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ByteArrayOutputStream&amp;nbsp;stream&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ByteArrayOutputStream();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SerializationContext&amp;nbsp;serializationContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SerializationContext();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Amf3Output&amp;nbsp;amf3Output&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Amf3Output(serializationContext);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;amf3Output.setOutputStream(stream);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;amf3Output.writeObject(arg2);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;objSe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;stream.toByteArray();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(objSe&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;objSe.length&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelBuffer&amp;nbsp;buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ChannelBuffers.buffer(objSe.length&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(arg2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushMessage)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer.writeInt(Constants.MAGIC_NUM_PUSH_MSG);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(arg2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CommandMessage)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer.writeInt(Constants.MAGIC_NUM_COMMAND_MSG);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer.writeInt(objSe.length);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer.writeBytes(objSe);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;buffer;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('3e1561e2-6e31-487b-86d5-7f3862fec74a')"&gt;&lt;img style="display: none" id="code_img_opened_3e1561e2-6e31-487b-86d5-7f3862fec74a"  onclick="cnblogs_code_hide('3e1561e2-6e31-487b-86d5-7f3862fec74a',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_3e1561e2-6e31-487b-86d5-7f3862fec74a" &gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;@(#)AMF3Decoder.java&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.1&amp;nbsp;05/11/17&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;Copyright&amp;nbsp;2010&amp;nbsp;QISI,&amp;nbsp;Inc.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;QISI&amp;nbsp;PROPRIETARY/CONFIDENTIAL.&amp;nbsp;Use&amp;nbsp;is&amp;nbsp;subject&amp;nbsp;to&amp;nbsp;license&amp;nbsp;terms.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;package&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;com.qidea.pushserver.codec;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;java.io.ByteArrayInputStream;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.buffer.ChannelBuffer;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.channel.Channel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.channel.ChannelHandlerContext;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.slf4j.Logger;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.slf4j.LoggerFactory;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;flex.messaging.io.SerializationContext;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;flex.messaging.io.amf.Amf3Input;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;amf3协议解码类&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@author&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;sunwei&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@version&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2010-7-21&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@since&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;JDK1.5&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Decoder&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LengthFieldBasedFrameDecoder&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;final&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Logger&amp;nbsp;logger&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LoggerFactory&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getLogger(AMF3Decoder.&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;maxFrameLength&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;包的最大大小&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;lengthFieldOffset&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;包头信息，长度的偏移位&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;lengthFieldLength&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;包头信息，长度位数&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Decoder(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;maxFrameLength,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;lengthFieldOffset,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;lengthFieldLength)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;super&lt;/span&gt;&lt;span style="color: #000000"&gt;(maxFrameLength,&amp;nbsp;lengthFieldOffset,&amp;nbsp;lengthFieldLength);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;maxFrameLength&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Decoder(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;maxFrameLength)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;super&lt;/span&gt;&lt;span style="color: #000000"&gt;(maxFrameLength,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;54&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Object&amp;nbsp;decode(ChannelHandlerContext&amp;nbsp;ctx,&amp;nbsp;Channel&amp;nbsp;channel,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;55&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelBuffer&amp;nbsp;buffer)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;56&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;57&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelBuffer&amp;nbsp;frame&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(ChannelBuffer)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;super&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;58&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.decode(ctx,&amp;nbsp;channel,&amp;nbsp;buffer);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;59&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(frame&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;60&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;61&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;62&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;63&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;64&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;magicNum&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;frame.readInt();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;65&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;dataLength&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;frame.readInt();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;66&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;magic&amp;nbsp;num={},data&amp;nbsp;length={}&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;magicNum,&amp;nbsp;dataLength);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;读AMF3字节流的内容&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;68&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;content&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[frame.readableBytes()];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;69&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frame.readBytes(content);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;70&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SerializationContext&amp;nbsp;serializationContext&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SerializationContext();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;71&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Amf3Input&amp;nbsp;amf3Input&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Amf3Input(serializationContext);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;72&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;amf3Input.setInputStream(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ByteArrayInputStream(content));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;73&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;message&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;amf3Input.readObject();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;74&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;message;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;75&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;76&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;77&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;构建服务端&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('6f103d1f-0091-436d-8072-2555dc0aa661')"&gt;&lt;img style="display: none" id="code_img_opened_6f103d1f-0091-436d-8072-2555dc0aa661"  onclick="cnblogs_code_hide('6f103d1f-0091-436d-8072-2555dc0aa661',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_6f103d1f-0091-436d-8072-2555dc0aa661" &gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushProtocolHandler&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SimpleChannelHandler&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Logger&amp;nbsp;log&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LoggerFactory&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getLogger(PushProtocolHandler.&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;messageReceived(ChannelHandlerContext&amp;nbsp;ctx,&amp;nbsp;MessageEvent&amp;nbsp;e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(e.getMessage()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelManager&amp;nbsp;channelManager&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushServerContext&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getBean(ChannelManager.&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(e.getMessage()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CommandMessage)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;channelManager.handleMsg((CommandMessage)&amp;nbsp;e.getMessage(),&amp;nbsp;e&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getChannel());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(e.getMessage()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushMessage)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;channelManager.handleMsg((PushMessage)&amp;nbsp;e.getMessage(),&amp;nbsp;e&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.getChannel());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.warn(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;unkown&amp;nbsp;message&amp;nbsp;{}&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;e);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('295bb636-6af5-425b-9692-367325284bb9')"&gt;&lt;img style="display: none" id="code_img_opened_295bb636-6af5-425b-9692-367325284bb9"  onclick="cnblogs_code_hide('295bb636-6af5-425b-9692-367325284bb9',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_295bb636-6af5-425b-9692-367325284bb9" &gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;org.jboss.netty.channel.Channels.&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@author&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;sunwei&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@version&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;2010-7-22&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@since&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;JDK1.5&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushServerPipelineFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;implements&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ChannelPipelineFactory&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ChannelPipeline&amp;nbsp;getPipeline()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelPipeline&amp;nbsp;pipeline&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;pipeline();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;处理日志&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipeline.addLast(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;logger&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LoggingHandler());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;处理coder&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipeline.addLast(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;decoder&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Decoder(Constants.MAX_OBJECT_SIZE));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipeline.addLast(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;encoder&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AMF3Encoder());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipeline.addLast(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;handler&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushProtocolHandler());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;pipeline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('799b1f8b-3a25-4a77-8a27-bcaa05d8c630')"&gt;&lt;img style="display: none" id="code_img_opened_799b1f8b-3a25-4a77-8a27-bcaa05d8c630"  onclick="cnblogs_code_hide('799b1f8b-3a25-4a77-8a27-bcaa05d8c630',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_799b1f8b-3a25-4a77-8a27-bcaa05d8c630" &gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;main(String[]&amp;nbsp;args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;开始NIO线程&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChannelFactory&amp;nbsp;factory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NioServerSocketChannelFactory(Executors&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.newCachedThreadPool(),&amp;nbsp;Executors.newCachedThreadPool());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;服务启始点&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServerBootstrap&amp;nbsp;bootstrap&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ServerBootstrap(factory);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;处理过滤器&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bootstrap.setPipelineFactory(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PushServerPipelineFactory());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;设置相关参数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bootstrap.setOption(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;child.tcpNoDelay&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;设置相关参数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bootstrap.setOption(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;child.keepAlive&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;绑定相关端口&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bootstrap.bind(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;InetSocketAddress(getPushPort()));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Flex客户端 &lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('7d0455ae-30da-4744-a35d-d32b744a05b9')"&gt;&lt;img style="display: none" id="code_img_opened_7d0455ae-30da-4744-a35d-d32b744a05b9"  onclick="cnblogs_code_hide('7d0455ae-30da-4744-a35d-d32b744a05b9',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" jquery17011686716008324038="3"&gt; &#xD;
&lt;div style="display: none" id="cnblogs_code_open_7d0455ae-30da-4744-a35d-d32b744a05b9"  jquery17011686716008324038="1"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FlexSocket&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;发送包&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;function&amp;nbsp;send(type:&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;obj:PushMessage):Boolean&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_socket&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;手动限制不给发送的时候用&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(socketState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;socket_state_closed&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;||&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;socketState&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;socket_state_connecting)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;_socket.connected)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;byteArr:ByteArray&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;objToByteaArray(obj);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;msgHead:MsgHead&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;MsgHead(type,&amp;nbsp;byteArr.length);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendMsg(msgHead.getType(),&amp;nbsp;msgHead.getSize(),&amp;nbsp;byteArr);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;接受包&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;function&amp;nbsp;getDataHandler(e:ProgressEvent):&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_timeServerDead.stop();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_timeServerDead.reset();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_socket.bytesAvailable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;_isReadHead)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_recvPackageType&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;_socket.readInt();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;同意关闭&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(_recvPackageType&amp;nbsp;==&amp;nbsp;5)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_recvPackageSize&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;_socket.readInt();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_isReadHead&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_isReadHead&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;_socket.bytesAvailable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;_recvPackageSize)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;:ByteArray&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ByteArray();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_socket.readBytes(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;_recvPackageSize);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_msgObj&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;byteArraytoObject(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;47&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;暂时用上面一种&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;48&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_recvPackageType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;packageType.LOGIN_TYPE)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;49&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;50&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_msgObj.ret&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;bodyType.RECEIVE_OK)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;51&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;52&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_timerDetectSocket.start();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;53&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socketState&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;socket_state_connected;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;54&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myEventDispatch.Instence().dispatcher(bodyType.INLINE_CURRENTSOCKETSTATE);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;55&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;56&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_msgObj.ret&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;bodyType.RECEIVE_ERROR)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;57&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;58&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;59&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;60&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;61&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;62&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(_recvPackageType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;packageType.CHAT_TYPE)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;63&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;64&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myEventDispatch.Instence().dispatcher(selectEventName(_recvPackageType),&amp;nbsp;_msgObj);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;65&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;66&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_recvPackageSize&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;67&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_recvPackageType&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;68&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_msgObj&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;69&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_isReadHead&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;70&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;71&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;72&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;73&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;74&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;75&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/coolattt/admin/javascript:void(0);"&gt;&lt;font color="#6466b3"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;　　&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;　　　　　　　　　　&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2289995.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/12/16/2289995.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/12/14/2288135.html</id><title type="text">使用 Eclipse Memory Analyzer 检测内存泄漏问题 [转]</title><summary type="text">本文是关于在开发Talend RCP 过程中碰到一个内存溢出问题的解决方案。使用的检测软件为Eclipse Memory Analyzer (http://www.eclipse.org/mat/)，是一个开源免费的内存分析工具，目前为eclipse的孵化项目，也是一个eclipse RCP. Talend一款开源的ETL软件，提供数据集成服务。基于eclipse RCP，EMF, GEF，JET等技术开发。在Talend软件系统中，一个designer editor 是一个mulit page editor, 它的实例是MultiPageTalendEditor，其中包含两页，第一页是一个g</summary><published>2011-12-14T14:05:00Z</published><updated>2011-12-14T14:05:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/12/14/2288135.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/12/14/2288135.html"/><content type="html">&lt;span style="font-family: 宋体"&gt;本文是关于在开发&lt;/span&gt;Talend RCP &lt;span style="font-family: 宋体"&gt;过程中碰到一个内存溢出问题的解决方案。使用的检测软件为&lt;/span&gt;&lt;span sizset="33" sizcache="1"&gt;Eclipse Memory Analyzer (&lt;a href="http://www.eclipse.org/mat/"&gt;http://www.eclipse.org/mat/&lt;/a&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，是一个开源免费的内存分析工具，目前为&lt;/span&gt;eclipse&lt;span style="font-family: 宋体"&gt;的孵化项目，也是一个&lt;/span&gt;eclipse RCP. &#xD;
&lt;p style="text-indent: 21pt"&gt;Talend&lt;span style="font-family: 宋体"&gt;一款开源的&lt;/span&gt;ETL&lt;span style="font-family: 宋体"&gt;软件，提供数据集成服务。基于&lt;/span&gt;eclipse RCP&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;EMF, GEF&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;JET&lt;span style="font-family: 宋体"&gt;等技术开发。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;Talend&lt;span style="font-family: 宋体"&gt;软件系统中，一个&lt;/span&gt;designer editor &lt;span style="font-family: 宋体"&gt;是一个&lt;/span&gt;mulit page editor, &lt;span style="font-family: 宋体"&gt;它的实例是&lt;/span&gt;&lt;span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt"&gt;MultiPageTalendEditor&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;，其中包含两页，第一页是一个&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;gef Editor&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;，用来显示&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;GEF&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;图形；第二页是一个&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;JavaEditor,&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;用来显示生成的代码。如下两图所示：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p1.PNG" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p2.PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;经过其他工具的测试发现&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;JavaEditor&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;如果用在&lt;/span&gt;mulit page editor&lt;span style="font-family: 宋体"&gt;中，关闭后，起实例无法回收，造成内存泄漏，因为&lt;/span&gt;Editor&lt;span style="font-family: 宋体"&gt;是一个非常频繁使用的功能项，所以该问题非常严重。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21.75pt"&gt;&lt;span style="font-family: 宋体"&gt;要使用&lt;/span&gt;Eclipse Memory Analyzer&lt;span style="font-family: 宋体"&gt;，首先要生成&lt;/span&gt;dump&lt;span style="font-family: 宋体"&gt;文件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21.75pt"&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;eclipse&lt;span style="font-family: 宋体"&gt;中配置&lt;/span&gt; Preferences -&amp;gt; Java -&amp;gt; Installed JREs, &lt;span style="font-family: 宋体"&gt;定义&lt;/span&gt;Jdk1.6&lt;span style="font-family: 宋体"&gt;来运行&lt;/span&gt;Talend.&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21.75pt"&gt;Talend&lt;span style="font-family: 宋体"&gt;运行后，执行一下打开&lt;/span&gt;editor&lt;span style="font-family: 宋体"&gt;的操作，在将&lt;/span&gt;editor&lt;span style="font-family: 宋体"&gt;关闭，这样虚拟机中保存了相应的堆栈信息。其实也就是执行一下你认为会产生内存泄漏的操作。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21.75pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21.75pt"&gt;&lt;span style="font-family: 宋体"&gt;运行&lt;/span&gt;jdk1.6 bin &lt;span style="font-family: 宋体"&gt;目录下的&lt;/span&gt;jconsole.exe&lt;span style="font-family: 宋体"&gt;，运行后如下图所示，选择连接到运行的&lt;/span&gt;Talend&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p3.PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;选择&lt;/span&gt; Mbean -&amp;gt; com.sun.management -&amp;gt; HotSpotDiagnos -&amp;gt; Operations -&amp;gt; dumpHeap&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在参数&lt;/span&gt;p0&lt;span style="font-family: 宋体"&gt;中填写保存&lt;/span&gt;dump&lt;span style="font-family: 宋体"&gt;文件的路径，例如&lt;/span&gt;f:/my.hprof, &lt;span style="font-family: 宋体"&gt;文件的后缀名要为&lt;/span&gt;hprof&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;点击&lt;/span&gt;dumpHeap&lt;span style="font-family: 宋体"&gt;按钮生成&lt;/span&gt;dump&lt;span style="font-family: 宋体"&gt;文件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p8.PNG" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;打开&lt;/span&gt;Eclipse Memory Analyzer, &lt;span style="font-family: 宋体"&gt;在菜单&lt;/span&gt;File &lt;span style="font-family: 宋体"&gt;下，选择打开刚才生成的&lt;/span&gt;dump&lt;span style="font-family: 宋体"&gt;文件。如下图：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p4.PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在第一行的&lt;/span&gt;filter&lt;span style="font-family: 宋体"&gt;中填写需要检查的类名，这里我要检查的类为&lt;/span&gt;TalendJavaEditor&lt;span style="font-family: 宋体"&gt;。在如下图所示的上下文菜单中选择&lt;/span&gt; List objects -&amp;gt; with incoming references, &lt;span style="font-family: 宋体"&gt;查看保存了&lt;/span&gt;TalendJavaEditor &lt;span style="font-family: 宋体"&gt;实例的引用。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p5.PNG" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在如下图所示的上下文菜单中选择&lt;/span&gt; Path To GC Roots -&amp;gt; exclude weak/soft references, &lt;span style="font-family: 宋体"&gt;过滤掉弱引用，因为在这里弱引用不是引起问题的关键。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p6.PNG" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;从下图中，可以看到&lt;/span&gt;JavaInfomationProvider&lt;span style="font-family: 宋体"&gt;中保存了&lt;/span&gt;TalendJavaEditor&lt;span style="font-family: 宋体"&gt;的引用。所以打开&lt;/span&gt;JavaInfomationProvider&lt;span style="font-family: 宋体"&gt;的代码，进行检查。从下图的分析中，大概可以看出这是一个注册了的监听器没有反注册的问题，这也是引起内存泄露的原因中最常见的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/moneyice/p7.PNG" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; &lt;strong&gt;JavaInformationProvider&lt;/strong&gt;(IEditorPart &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #400000; font-size: 10pt"&gt;editor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;) {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fEditor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;= editor;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; (&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fEditor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; != &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;) {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 'Courier New';background: yellow; color: #0000c0; font-size: 10pt"&gt;fPartListener&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;= &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; &lt;strong&gt;EditorWatcher&lt;/strong&gt;();&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IWorkbenchWindow &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #400000; font-size: 10pt"&gt;window&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;= &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fEditor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;.&lt;strong&gt;getSite&lt;/strong&gt;().&lt;strong&gt;getWorkbenchWindow&lt;/strong&gt;();&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.&lt;strong&gt;getPartService&lt;/strong&gt;().&lt;strong&gt;addPartListener&lt;/strong&gt;(&lt;/span&gt;&lt;span style="font-family: 'Courier New';background: yellow; color: #0000c0; font-size: 10pt"&gt;fPartListener&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;update&lt;/strong&gt;();&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;JavaInformationProvider &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的构造方法中，保存了&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;TalendJavaEditor&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的实例，并且注册了监听器。&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;public&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; &lt;strong&gt;partClosed&lt;/strong&gt;(IWorkbenchPart &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #400000; font-size: 10pt"&gt;part&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;) {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;if&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt; (part == &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fEditor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;) {&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fEditor&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;.&lt;strong&gt;getSite&lt;/strong&gt;().&lt;strong&gt;getWorkbenchWindow&lt;/strong&gt;().&lt;strong&gt;getPartService&lt;/strong&gt;().&lt;strong&gt;removePartListener&lt;/strong&gt;(&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fPartListener&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;fPartListener&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;= &lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Courier New';background: blue; color: black; font-size: 10pt"&gt;EditorWatcher&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的方法&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;partClosed&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;中，当关闭一个&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;designer editor&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的时候，传进来的&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: #400000; font-size: 10pt"&gt;part&lt;/span&gt;&lt;span style="font-family: 宋体; color: #400000; font-size: 10pt"&gt;是&lt;/span&gt;&lt;span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt"&gt;MultiPageTalendEditor&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;，而不是&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;JavaInformationProvider&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;保存的&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;TalendJavaEditor&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;，所以该&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;listener&lt;/span&gt;&lt;span style="font-family: 宋体; color: #0000c0; font-size: 10pt"&gt;永远不可能被反注册掉，&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #0000c0; font-size: 10pt"&gt;GC&lt;/span&gt;&lt;span style="font-family: 宋体; color: #0000c0; font-size: 10pt"&gt;也就不可能回收&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;TalendJavaEditor&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;。对于该软件系统来所，这是一个致命的内存溢出问题。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;point&lt;span style="font-family: 宋体"&gt;找到了，解决就不是问题了。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2288135.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/12/14/2288135.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/12/09/2282361.html</id><title type="text">Myeclipse SVN 插件安装</title><summary type="text">一、(一)、在线安装1. 打开Myeclipse，在菜单栏中选择Help→Software Updates→Find and Install;2. 选择Search for new features to install，点击Next进入下一步;3. 点击&amp;quot;New Remote Site&amp;quot;按钮，在弹出的对话框中输入： name：SVN url：http://subclipse.tigris.org/update_1.4.x 点击OK，关闭对话框，并点击Finish按钮，Myeclipse自动下载插件安装程序;4. 下载完插件之后，进入安装画面。5. 选择所要安装的SVN插件</summary><published>2011-12-09T08:11:00Z</published><updated>2011-12-09T08:11:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/12/09/2282361.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/12/09/2282361.html"/><content type="html">&lt;div id="sina_keyword_ad_area2" &gt;&#xD;
&lt;div&gt;&#xD;
&lt;p&gt;一、&lt;/p&gt;&#xD;
&lt;p&gt;(一)、在线安装&lt;/p&gt;&#xD;
&lt;p&gt;1. 打开Myeclipse，在菜单栏中选择Help&amp;#8594;Software Updates&amp;#8594;Find and Install;&lt;/p&gt;&#xD;
&lt;p&gt;2. 选择Search for new features to install，点击Next进入下一步;&lt;/p&gt;&#xD;
&lt;p&gt;3. 点击"New Remote Site"按钮，在弹出的对话框中输入：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; name：SVN&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; url：&lt;a href="http://subclipse.tigris.org/update_1.4.x"&gt;&lt;font color="#108ac6"&gt;http://subclipse.tigris.org/update_1.4.x&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 点击OK，关闭对话框，并点击Finish按钮，Myeclipse自动下载插件安装程序;&lt;/p&gt;&#xD;
&lt;p&gt;4. 下载完插件之后，进入安装画面。&lt;/p&gt;&#xD;
&lt;p&gt;5. 选择所要安装的SVN插件内容，这里去掉第二个选项Subclipse Integrations，点击下一步；&lt;/p&gt;&#xD;
&lt;p&gt;6. 选择 "I accept the terms in the license agreements"并点击Next，直到点击Finish即可，进入下一步。&lt;/p&gt;&#xD;
&lt;p&gt;7. 开始安装SVN插件，安装完成之后，重启Myeclipse。&lt;/p&gt;&#xD;
&lt;p&gt;(二)、手动安装&lt;/p&gt;&#xD;
&lt;p&gt;1、下载SVN插件&lt;br /&gt;下载地址：&lt;a href="http://subclipse.tigris.org/files/documents/906/46495/site-1.6.5.zip"&gt;&lt;font color="#108ac6"&gt;http://subclipse.tigris.org/files/documents/906/46495/site-1.6.5.zip&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. 在MyEclipse 6.5的安装路径下的plug_in(C:\Program Files\MyEclipse 6.5\eclipse\plugins)下新建文件夹：site-1.6.5;&lt;/p&gt;&#xD;
&lt;p&gt;3. 打开MyEclipse 6.5，在菜单栏中选择 Help &amp;#8594; Software Updates &amp;#8594; Find and Install;&lt;/p&gt;&#xD;
&lt;p&gt;2. 选择Search for new features to install，点击Next进入下一步;&lt;/p&gt;&#xD;
&lt;p&gt;3. 点击"New Local Site"按钮，找到解压出来的文件夹(site-1.6.5) &amp;#8594; 点击OK，并点击Finish按钮，Myeclipse自动加载插件;&lt;/p&gt;&#xD;
&lt;p&gt;4. 在弹出的菜单中，select the features to insteall:在刚加进去的路径Subclipse-site-1.6.5这一项前打钩，此时会报错，然后展开Subclipse前的加号，去掉 Subclipse Integration for Mylyn 3.x(Optional)3.0.0前的钩，错误消失 &amp;#8594; next &amp;#8594; 选 I accept the terms in the license agreements &amp;#8594; next &amp;#8594; next &amp;#8594; 选中所有的8项，然后Change Location&amp;#8230;&amp;#8230;，在弹出的菜单中选Add Location&amp;#8230;&amp;#8230;选择在第3步中建的文件夹的路径(C:\Program Files\MyEclipse 6.5\eclipse\plugins\site-1.6.5) &amp;#8594; Finish &amp;#8594; 再弹出的菜单中选 Install All &amp;#8594; Yes&lt;/p&gt;&#xD;
&lt;p&gt;5. 开始安装SVN插件，安装完成之后，重启Myeclipse。&lt;/p&gt;&#xD;
&lt;p&gt;二、安装完成&lt;/p&gt;&#xD;
&lt;p&gt;1. 在MyEclipse 6.5 菜单栏中选择Window&amp;#8594;Open Perspective&amp;#8594;Other打开Myeclipse试图列表。这个时候Myeclipse的视图列表中，就出现了"SVN Repository Exploring"一项。&lt;/p&gt;&#xD;
&lt;p&gt;2. 打开"SVN Repository Exploring"视图。在左边空白区域，单击右键 &amp;#8594; New &amp;#8594; Repository Location。&lt;/p&gt;&#xD;
&lt;p&gt;3. 在Url一栏中输入svn://IP，点击Finish按钮。&lt;/p&gt;&#xD;
&lt;p&gt;4. 选择要下载的项目右键选择checkout 就把项目下载到本地了&lt;/p&gt;&#xD;
&lt;p&gt;三、基本操作&lt;/p&gt;&#xD;
&lt;p&gt;1.提交工程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 右击工程-&amp;gt;小组-&amp;gt;共享项目-&amp;gt;选择SVN-&amp;gt;选择svn://127.0.0.1(如果没有,则创建一个新的资源库)-&amp;gt;下一步-&amp;gt;完成&lt;/p&gt;&#xD;
&lt;p&gt;2.下载工程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 在SVN资源库透视图下,点开svn://127.0.0.1,会显示出现在本机SVN上的所有工程,右击你想下载的工程-&amp;gt;检出为-&amp;gt;下一步-&amp;gt;完成&lt;/p&gt;&#xD;
&lt;p&gt;3.操作工程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 3.1同步&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 在MyEclipse J2EE透视图下,右击你要同步的工程-&amp;gt;小组-&amp;gt;与资源库同步-&amp;gt;这时会进入同步透视图,会显示出本机与SVN上内容有不同的文件, 双击文件名,会显示出两个文件中哪里不同;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 3.2提交&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 在同步透视图下有"灰色向右的箭头,表示你本机修改过",右击该文件,可以选择提交操作;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 3.3覆盖/更新&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 在同步透视图下有"蓝色向左的箭头,表示你本机修改过",右击该文件,可以选择覆盖/更新操作;&lt;/p&gt;&#xD;
&lt;p&gt;4.图标说明&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.1灰色向右箭头:本地修改过&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.2蓝色向左箭头:SVN上修改过&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.3灰色向右且中间有个加号的箭头:本地比SVN上多出的文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.4蓝色向左且中间有个加号的箭头:SVN上比本地多出的文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.5灰色向右且中间有个减号的箭头:本地删除了,而SVN上未删除的文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.6蓝色向左且中间有个减号的箭头:SVN上删除了,而本地未删除的文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 4.7红色双向箭头:SVN上修改过,本地也修改过的文件&lt;/p&gt;&#xD;
&lt;p&gt;5.一些我遇到的出错信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 5.1在上面讲的3.2步输入URL(svn://127.0.0.1)点下一步出现"svnserve.conf:12: Option expected"错误&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 你打开svnserve.conf文件中的第12行,该错误是由于该行的前面有空格引起的,把左边多出的空格删除掉即可;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; 5.2在上面讲的3.2步输入URL(svn://127.0.0.1/SVN_PRJ)点下一步出现"svn://127.0.0.1/SVN_PRJ non-existent in revision '7'"错误&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; URL错了,应该输入svn://127.0.0.1即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&lt;/p&gt;&#xD;
&lt;p&gt;官方下载：&lt;/p&gt;&#xD;
&lt;p&gt;服务器和程序下载 ： &lt;a href="http://subversion.tigris.org/getting.html#binary-packages"&gt;&lt;font color="#108ac6"&gt;http://subversion.tigris.org/getting.html#binary-packages&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;Windows常用客户端TortoiseSVN：&lt;a href="http://tortoisesvn.net/downloads"&gt;&lt;font color="#108ac6"&gt;http://tortoisesvn.net/downloads&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;AnkhSVN（Visual Studio插件）：&lt;a href="http://ankhsvn.open.collab.net/"&gt;&lt;font color="#108ac6"&gt;http://ankhsvn.open.collab.net/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;Subclipse（Eclipse 插件）：&lt;a href="http://subclipse.tigris.org/"&gt;&lt;font color="#108ac6"&gt;http://subclipse.tigris.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;SCPlugin（Mac OS x客户端）：&lt;a href="http://scplugin.tigris.org/"&gt;&lt;font color="#108ac6"&gt;http://scplugin.tigris.org/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;更多客户端和工具可以看下表或者到官方网站察看：&lt;a href="http://subversion.tigris.org/links.zh.html#clients" target="_blank"&gt;&lt;span style="color: #000000"&gt;http://subversion.tigris.org/links.zh.html#&lt;/a&gt;&lt;a href="http://subversion.tigris.org/links.zh.html#clients" target="_blank"&gt;&lt;font color="#0063b1"&gt;clients&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2282361.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/12/09/2282361.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/12/08/2281422.html</id><title type="text">将mina整合到tomcat中</title><summary type="text">webgame中的聊天模块采用前台flash，后台java，socket来进行通讯。后台是自己写的socket server。但存在很多问题，与spring不方便整合，部署的时候要分开部署。自己写的还存在效率问题。所以想到了apache mina。如果用mina的话就会提高socket服务器的效率。又在网上查到一些mina与tomcat整合的资料，自己就动手开始进行整合首先在pom.xml中加入&amp;lt;!-- mina and mix spring --&amp;gt;&amp;lt;dependency&amp;gt;&amp;lt;groupId&amp;gt;org.apache.mina&amp;lt;/groupId&amp;gt;&amp;lt</summary><published>2011-12-08T15:58:00Z</published><updated>2011-12-08T15:58:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/12/08/2281422.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/12/08/2281422.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;table style="table-layout: fixed; width: 100%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;div id="blog_text"&gt;&lt;br /&gt;webgame中的聊天模块采用前台flash，后台java，socket来进行通讯。后台是自己写的socket  server。但存在很多问题，与spring不方便整合，部署的时候要分开部署。自己写的还存在效率问题。所以想到了apache  mina。如果用mina的话就会提高socket服务器的效率。又在网上查到一些mina与tomcat整合的资料，自己就动手开始进行整合&lt;br /&gt;&lt;br /&gt;首先在pom.xml中加入&lt;br /&gt;&amp;lt;!--  mina and mix spring  --&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.mina&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;mina-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.0-M3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.mina&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;mina-integration-spring&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.1.7&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.mina&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;mina-integration-beans&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.0-M3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;运行ant通过maven取得相应的jar包。然后加入spring的配置，让mina和spring整合在一起。&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;&amp;lt;bean  &amp;gt;&lt;br /&gt;&amp;lt;property  name="customEditors"&amp;gt;&lt;br /&gt;&amp;lt;map&amp;gt;&lt;br /&gt;&amp;lt;entry  key="java.net.SocketAddress"&amp;gt;&lt;br /&gt;&amp;lt;bean    /&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;lt;/map&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--  The IoHandler implementation --&amp;gt;&lt;br /&gt;&amp;lt;bean id="minaHandler"  /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- the IoFilters  --&amp;gt;&lt;br /&gt;&amp;lt;bean id="executorFilter"   /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean  id="mdcInjectionFilter"  &amp;gt;&lt;br /&gt;&amp;lt;constructor-arg  value="remoteAddress" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="codecFilter"  &amp;gt;&lt;br /&gt;&amp;lt;constructor-arg&amp;gt;&lt;br /&gt;&amp;lt;bean    /&amp;gt;&lt;br /&gt;&amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean  id="loggingFilter"   /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- The non-SSL filter chain. --&amp;gt;&lt;br /&gt;&amp;lt;bean  id="filterChainBuilder"  &amp;gt;&lt;br /&gt;&amp;lt;property  name="filters"&amp;gt;&lt;br /&gt;&amp;lt;map&amp;gt;&lt;br /&gt;&amp;lt;entry key="executor"  value-ref="executorFilter" /&amp;gt;&lt;br /&gt;&amp;lt;entry key="mdcInjectionFilter"  value-ref="mdcInjectionFilter" /&amp;gt;&lt;br /&gt;&amp;lt;entry key="codecFilter"  value-ref="codecFilter" /&amp;gt;&lt;br /&gt;&amp;lt;entry key="loggingFilter"  value-ref="loggingFilter"  /&amp;gt;&lt;br /&gt;&amp;lt;/map&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- The  IoAcceptor which binds to port 8888 server side --&amp;gt;&lt;br /&gt;&amp;lt;bean  id="minaAcceptor"  &lt;br /&gt;init-method="bind"  destroy-method="unbind"&amp;gt;&lt;br /&gt;&amp;lt;property name="defaultLocalAddress"  value=":8888" /&amp;gt;&lt;br /&gt;&amp;lt;property name="handler" ref="minaHandler"  /&amp;gt;&lt;br /&gt;&amp;lt;property name="reuseAddress" value="true" /&amp;gt;&lt;br /&gt;&amp;lt;property  name="filterChainBuilder" ref="filterChainBuilder"  /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;  &lt;br /&gt;&lt;br /&gt;其中com.game.MinaProtocolHandler是我要实现的类，新建类MinaProtocolHandler继承IoHandlerAdapter，代码如下&lt;br /&gt;&lt;br /&gt;public  void messageReceived(IoSession session, Object message) {&lt;br /&gt;String msg =  (String) message;&lt;br /&gt;System.out.println("Server Received: " +  msg);&lt;br /&gt;session.write("Send msg: " + msg);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void  sessionIdle(IoSession session, IdleStatus status)  {&lt;br /&gt;session.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void exceptionCaught(IoSession session,  Throwable cause) {&lt;br /&gt;session.close();&lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;启动tomcat，就会开启一个8888的端口，进入命令行输入telnet 127.0.0.1  8888看看&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2281422.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/12/08/2281422.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/12/01/2269910.html</id><title type="text">JIRA管理思路[转]</title><summary type="text">刚刚开始用Jira的时候，只是觉得这是一个方便的bug管理系统，可以将在测试过程中所发现的bug录入、分配给开发人员。之后开始在公司内使用，之前也曾经想尝试使用bugzilla。在D的建议之下，又因我用过Jira，因此一拍即合，开始使用了。因起初只是使用者，因而并未有站在一个管理者的角度上来看JIRA在项目管理中的作用和意义。因此今日再看时，已发现由于出发角度的错误而出现的很多偏差，导致的此时的问题。没办法有效的管理bug，没办法有效的让所有人及时添加bug，没办法让所有人方便看到当前有哪些bug。因为太乱了，模块划分乱、版本划分乱、处理者乱，处理流程乱。当这些问题出现后，才发现之前的错误。这</summary><published>2011-11-30T16:27:00Z</published><updated>2011-11-30T16:27:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/12/01/2269910.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/12/01/2269910.html"/><content type="html">&lt;div&gt;刚刚开始用Jira的时候，只是觉得这是一个方便的bug管理系统，可以将在测试过程中所发现的bug录入、分配给开发人员。&lt;br /&gt;之后开始在公司内使用，之前也曾经想尝试使用bugzilla。在D的建议之下，又因我用过Jira，因此一拍即合，开始使用了。&lt;br /&gt;因起初只是使用者，因而并未有站在一个管理者的角度上来看JIRA在项目管理中的作用和意义。因此今日再看时，已发现由于出发角度的错误而出现的很多偏差，导致的此时的问题。&lt;br /&gt;没办法有效的管理bug，没办法有效的让所有人及时添加bug，没办法让所有人方便看到当前有哪些bug。因为太乱了，模块划分乱、版本划分乱、处理者乱，处理流程乱。&lt;br /&gt;当这些问题出现后，才发现之前的错误。这些为什么没有在开始使用时就理解和计划实施呢！&lt;br /&gt;现在来看JIRA，这是一个项目管理的很好辅助工具，将所有项目开发、运作过程中的所有task  、  bug、创意、改善意见都可以融汇进入这个系统。可以在第一时间将这些问题指派而责任人进行处理。&lt;br /&gt;而想用JIRA来做好BUG管理和项目管理，有这几个重点要做好！&lt;br /&gt;1.定义模块&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  模块反应了问题出现因素的范围。所发现的问题、所需要进行的任务、改善意见的指向、创意所应用的范围。&lt;br /&gt;2.定义里程碑&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  问题、任务、意见、创意都需要分配在某一时段进行处理，时段可以是时间为单位的，周、日、时、分，也可以是里程碑，alpha/beta/close beta/open  beta。如果所有的事情都可以以这两种单位计量的非常清晰，那么首先可以称赞的一点是，你的负责心已经体现出来了，你知道在什么时间该做什么事，同时，你让你的战友们知道，他们应该在什么时候做什么事！&lt;br /&gt;3.定义全局处理流程&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  第1点和第2点，是你在为这个项目管理做的基础准备，有了第1点和第2点，那说明你在其中的工作，但这并不表明这个系统就可以运作起来。要运作起来，就必须你和你的战友们都可以在处理JIRA上的所有事务时的处理流程。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  建立：建立一个issue。什么样的东西应该建立在JIRA中，我得到的经验是，所有的工作任务、所有的bug（开发过程中的，A与B之前的，A与C之前的，B与C之前，所有、所有），不单是测试小组所发现的一些黑盒测试的bug，开发过程中的也不遗漏。这样，你可以看到这个项目在动的，每天所有人都在发现问题，解决问题。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  分配：问题要给能解决问题的人，问题要给理解这个问题的人。程序上问题你给了一个商备人员，那你不对了；程序的问题你给了程序，可以程序不明白你说的是什么，那也是你不对了。要降低沟通过程中的风险，建立问题者，想清楚，这个问题要由谁来处理，要告诉他什么信息。你在没有告诉清楚这些信息的时候，你对这个问题还是最大责任者。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  开始：开始是指接收到这个issue后的处理手段之一，因为还有拒绝这种可能。开始处理这个问题，在向所有人声明一件事情，这个问题我开始着手处理了，我会按着计划和需求来完成这个事务。那么，开始做这件事的人，你要很坦诚的向自己说，我知道这个事务是什么，我知道要怎么去处理，我知道要在这个时间内怎么处理。你开始接受这项事务，是你对于分配给你这个事务的人的一个回应。这时事务的责任在你的身上。用你的职业精神来处理这个事务吧。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  解决：整个的处理过程统称为解决。虽然有可能出现解决不了、或者在解决的过程中需要其它人来帮忙，也可能需要很多的讨论和会议，这都是解决的过程，在这个过程中，把你做过的事情，对于这个Issue相关的资料，信息版本，记录下来。让别人知道，你是用什么方法来解决的，你这种解决方法是不是很安全，还有没有其它更优化的方法。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  关闭：解决完一个事务后，通常这种事务的责任转移到分配人的头上，分配人要处理的事情是，这个事务是否如需求、计划所完成，完成质量是否符合要求。在通过验证后，这一个问题需要你的关闭。在出现不符合的情况，你不能关闭这个issue，你要提供更多信息，更多资料，方便他再来解决。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  重开：对于bug，出现重现的情况是常见的，这时不要让JIRA上有更多的垃圾信息，也方便开发人员找到问题原因，你需要重开这个bug，并附上相关的信息。&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&lt;br /&gt;4.每日的统计与清理&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  管理项目要盯，每日的盯是少不了的，看全局的issue数量、关闭情况、进行情况、所剩未解决的数量。你可以有的放矢的去针对这些问题来看。也可以看到，谁的问题比较多，谁的进度比较慢。因为什么问题将影响进度，因为什么问题将影响产品品质。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  你也有责任要清理一些问题，这种情况出现在，你没有让所有战友都可以很好的使用这个系统。清理的另一意义是理，有一些问题，你可能要在这一阶段放弃，那需要理到某一个其它时段，这个问题需要换由其它人再进行继续的处理等等。&lt;br /&gt;5.阶段的统计与整理&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  阶段，这么划分吧，每周3/2这样两个阶段，这是除了第4点所说的之外的最小阶段吧。以它就是周、版本计划阶段、版本大的阶段划分这样的划分情况。&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  通过阶段内的完成情况，你可以看到谁处理的问题太多了，谁少一些，谁的难度高一些、谁的能力不足、谁不负责任。哪个部门做得不足，哪一模块需要更多人帮忙。如果说日为单位是盯的话，那么阶段来统计与整理，就是盯之后的分析与解决方案。&lt;br /&gt;6.最大力度的使用过滤器&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;  Jira提供了较多的查询条件可供个人创建过滤器和与团队分享过滤器。同时还可以自定义自己的主页，相信自定义主页这个功能在google上你已经感受过了。同样这些过滤器可以变为你的主页中的一部分，把你最需要关注的issue都呈现在你每日的第一位置。&lt;br /&gt;&lt;br /&gt;JIRA，是一个工具，是改变你原始管理思维的一个突破。如果你要用的话，请记住，Jira不是你一个人会用就行了，是一个团队、一个系统。否则他运转不起来，就算转起来了，也有出现更大问题的时候。&lt;br /&gt;&lt;br /&gt;现在我面对的就是出现这个大问题的时候。希望通过这样的一处整理思路的过程，让公司的JIRA系统可以快速恢复起他应有的作用。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2269910.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/12/01/2269910.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/11/28/2266029.html</id><title type="text">linux下安装jira4.4.1[转]</title><summary type="text">1.下载，安装32位http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x32.bin64位http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x64.binlinux 下可以wget获取安装文件[root@jira local]#chmod 755 atlassian-jira-4.4.1-x64.bin[root@jira local]# ./atlassian-jira-4.4.1-x6</summary><published>2011-11-28T04:11:00Z</published><updated>2011-11-28T04:11:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/11/28/2266029.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/11/28/2266029.html"/><content type="html">&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;1.下载，安装&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;32位&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(27,145,159); text-decoration: none; padding-top: 0px" href="http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x32.bin" rel="nofollow" target="_blank"&gt;http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x32.bin&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;64位&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(27,145,159); text-decoration: none; padding-top: 0px" href="http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x64.bin" rel="nofollow" target="_blank"&gt;http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-4.4.1-x64.bin&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;linux 下可以wget获取安装文件&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;[root@jira local]#chmod 755 atlassian-jira-4.4.1-x64.bin&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;[root@jira local]# ./atlassian-jira-4.4.1-x64.bin&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;安装时会要求输入安装路径和存放数据路径。安装提示一步一步操作即可。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;安装完成后JIRA即已经启动。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;创建jira使用的数据库。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;create database jiradb character set utf8;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: 'Times New Roman',serif"&gt;登陆&lt;/span&gt;&lt;span style="font-family: 'Times New Roman',serif; color: #0000ee"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;http://localhost:8080/&lt;/span&gt;&amp;nbsp;或&amp;nbsp;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;http://IP:8080/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman',serif"&gt;运行安装.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;打开后,选择使用外部数据库MYSQL,输入数据库信息,测试连接，选择中文。下一步.&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;记下server ID.&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;2.汉化&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;&lt;em&gt;注：JIRA4.4.1 安装步骤即可选择中文，无需汉化&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;先停止jira&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;service jira stop&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;下载汉化包和破解补丁&lt;/p&gt;&#xD;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;汉化：&lt;a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(27,145,159); text-decoration: none; padding-top: 0px" href="http://download.csdn.net/detail/banklin/3702013" target="_blank"&gt;http://download.csdn.net/detail/banklin/3702013&lt;/a&gt;&lt;/div&gt;破解补丁：&lt;a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(27,145,159); text-decoration: none; padding-top: 0px" href="http://download.csdn.net/detail/banklin/3702011" target="_blank"&gt;http://download.csdn.net/detail/banklin/3702011&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;下载jira-lang-zh_CN-4.4.1.jar 汉化文件.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;复制到$Install_Jira/atlassian/jira/atlassian-jira/WEB-INF/lib/该目录替换掉原来的文件&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"&gt;3.破解&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;下载jira_crack.rar,（里面还包括greenhopper5.x破解补丁，fisheye2.4.3破解补丁，crucible2.4.3破解补丁）解压.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;把$Install_Jira/atlassian/jira/atlassian-jira/WEB-INF/lib/atlassian-extras-2.2.2.jar 该文件下载到本地电脑.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: Arial"&gt;&lt;/span&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: 宋体"&gt;在装好了&lt;/span&gt;java&amp;nbsp;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;windows上启动注册机。&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;java -jar jira_keygen.jar&amp;nbsp;&amp;nbsp; (或者直接运行jira_keygen.bat)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: 宋体"&gt;会出现一个注册机。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: 宋体"&gt;输入name和记下的&lt;span style="font-family: Times New Roman"&gt;server ID.&lt;/span&gt;号，点击&lt;/span&gt;.patch，然后选择下载到本地的&lt;span style="font-family: Arial"&gt;atlassian-extras-2.2.2.jar 文件。即可生成破解后的atlassian-extras-2.2.2.jar&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;上传到服务器替换原来的文件。$Install_Jira/atlassian/jira/atlassian-jira/WEB-INF/lib/atlassian-extras-2.2.2.jar即可完成破解。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;重新启动jira&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;service jira start&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: Arial"&gt;访问jira页面&lt;a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(27,145,159); text-decoration: none; padding-top: 0px" href="http://url:8080/" rel="nofollow" target="_blank"&gt;http://url:8080/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; margin: 0cm 0cm 0pt; padding-top: 0px"&gt;&lt;span style="font-family: 宋体"&gt;再点击注册机中&lt;/span&gt;gen.&lt;span style="font-family: 宋体"&gt;将生产的&lt;/span&gt;key&lt;span style="font-family: 宋体"&gt;复制进行注册。即可完成安装。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2266029.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/11/28/2266029.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/11/26/2264379.html</id><title type="text">CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记[转]</title><summary type="text">0.安装相关的软件包 1:# yum install httpd httpd-devel openssl-devel\ zlib-devel gcc gcc-c++ curl-devel subversion -y 1.安装MySql数据库 安装MySQL ，并设置为开机自动启动。 1: # yum install mysql mysql-devel mysql-server 2: # chkconfig --levels 235 mysqld on 3: # /etc/init.d/mysqld start 创建Redmine数据库，执行mysql -u roo...</summary><published>2011-11-26T08:04:00Z</published><updated>2011-11-26T08:04:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/11/26/2264379.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/11/26/2264379.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;0.安装相关的软件包&lt;/strong&gt;&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:#&lt;/span&gt; yum install httpd httpd-devel openssl-devel\&lt;br /&gt; zlib-devel gcc gcc-c++  curl-devel subversion -y&lt;/pre&gt;&lt;bgsound cep="0"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;1.安装MySql数据库&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;安装MySQL ，并设置为开机自动启动。 &lt;/li&gt;&lt;/ul&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; # yum install mysql mysql-devel mysql-server&lt;/pre&gt;&lt;bgsound cep="1"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; # chkconfig --levels 235 mysqld on&lt;/pre&gt;&lt;bgsound cep="2"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; # /etc/init.d/mysqld start&lt;/pre&gt;&lt;bgsound cep="3"&gt;&lt;/bgsound&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt;创建Redmine数据库，执行mysql -u root -p登录mysql，在mysql&amp;gt;命令行中输入如以下sql代码： &lt;/li&gt;&lt;/ul&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;DATABASE&lt;/span&gt; redmine &lt;span style="color: #0000ff"&gt;CHARACTER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt; utf8 &lt;span style="color: #0000ff"&gt;COLLATE&lt;/span&gt; utf8_general_ci;&lt;/pre&gt;&lt;bgsound cep="4"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;USER&lt;/span&gt; &lt;span style="color: #006080"&gt;'redmine'&lt;/span&gt;@&lt;span style="color: #006080"&gt;'localhost'&lt;/span&gt; IDENTIFIED &lt;span style="color: #0000ff"&gt;BY&lt;/span&gt; &lt;span style="color: #006080"&gt;'redmine'&lt;/span&gt;;&lt;/pre&gt;&lt;bgsound cep="5"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GRANT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; redmine.* &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; &lt;span style="color: #006080"&gt;'redmine'&lt;/span&gt;@&lt;span style="color: #006080"&gt;'localhost'&lt;/span&gt;;&lt;/pre&gt;&lt;bgsound cep="6"&gt;&lt;/bgsound&gt;&lt;/div&gt; &lt;p&gt;添加一个数据库readmine，创建一个用户登录用户redmine，密码和用户名相同，并且授权访问redmine数据库。&lt;/p&gt; &lt;p&gt;&lt;span style="color: #666666" color="#666666"&gt;注：mysql安装后默认root是没设置密码的，如果要改root密码，执行 usr/bin/mysqladmin -u root  password 'new-password' 修改。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.安装Ruby 1.8.7&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;下载Ruby1.8.7源码编译安装，建个临时目录存放安装过程需要下载的文件&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:#&lt;/span&gt; mkdir ~/rails_install&lt;/pre&gt;&lt;bgsound cep="7"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:#&lt;/span&gt; cd ~/redmine_install&lt;/pre&gt;&lt;bgsound cep="8"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:#&lt;/span&gt; wget ftp:&lt;span style="color: #008000"&gt;//ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz &lt;/span&gt;&lt;/pre&gt;&lt;bgsound cep="9"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:#&lt;/span&gt; tar zxvf ruby-1.8.7-p352.tar.gz &lt;/pre&gt;&lt;bgsound cep="10"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:#&lt;/span&gt; cd ruby-1.8.7-p352&lt;/pre&gt;&lt;bgsound cep="11"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:#&lt;/span&gt; ./configure &lt;/pre&gt;&lt;bgsound cep="12"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:#&lt;/span&gt; make&lt;/pre&gt;&lt;bgsound cep="13"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:#&lt;/span&gt; make install&lt;/pre&gt;&lt;bgsound cep="14"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;安装成功后执行 ruby &amp;#8211;v 可看到ruby的版本信息，如： &lt;br /&gt;ruby 1.8.7 (2011-06-30 patchlevel 352)  [i686-linux]&lt;/p&gt; &lt;p&gt;&lt;strong&gt;3.安装RubyGems&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这个比较挑剔，在redmine安装指导（&lt;a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall"&gt;http://www.redmine.org/projects/redmine/wiki/RedmineInstall&lt;/a&gt;）中提到有要求，要在1.3.7  ~ 1.7.0之间，这里我选择了1.6.2版。同样是下载源码安装。&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:#&lt;/span&gt; cd ~/rails_install&lt;/pre&gt;&lt;bgsound cep="15"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:#&lt;/span&gt; wget http:&lt;span style="color: #008000"&gt;//rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz&lt;/span&gt;&lt;/pre&gt;&lt;bgsound cep="16"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:#&lt;/span&gt; tar zxvf rubygems-1.6.2.tgz&lt;/pre&gt;&lt;bgsound cep="17"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:#&lt;/span&gt; cd rubygems-1.6.2&lt;/pre&gt;&lt;bgsound cep="18"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:#&lt;/span&gt; ruby setup.rb&lt;/pre&gt;&lt;bgsound cep="19"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;安装成功后，执行gem &amp;#8211;v ，可看到版本信息。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;4.安装Rails及相关gems&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果直接用gem install xxx 安装的，大都都安装不成功，不知是我这边网络问题还是其它原因，所以只好把用到的文件都下载回来再本地安装。&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; # cd ~/rails_install&lt;/pre&gt;&lt;bgsound cep="20"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; # wget http://rubygems.org/downloads/rake-0.8.3.gem&lt;/pre&gt;&lt;bgsound cep="21"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; # wget http://rubygems.org/downloads/rack-1.1.0.gem&lt;/pre&gt;&lt;bgsound cep="22"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; # wget http://rubygems.org/downloads/rails-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="23"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; # wget http://rubygems.org/downloads/activesupport-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="24"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; # wget http://rubygems.org/downloads/activerecord-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="25"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; # wget http://rubygems.org/downloads/actionpack-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="26"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; # wget http://rubygems.org/downloads/actionmailer-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="27"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; # wget http://rubygems.org/downloads/activeresource-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="28"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;bgsound cep="29"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; # wget http://rubygems.org/downloads/i18n-0.4.2.gem&lt;/pre&gt;&lt;bgsound cep="30"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; # wget http://rubygems.org/downloads/mysql-2.8.1.gem&lt;/pre&gt;&lt;bgsound cep="31"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; # wget http://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gem&lt;/pre&gt;&lt;bgsound cep="32"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; # wget http://rubygems.org/downloads/coderay-1.0.0.gem&lt;/pre&gt;&lt;bgsound cep="33"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;bgsound cep="34"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; rake-0.8.3.gem&lt;/pre&gt;&lt;bgsound cep="35"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; rack-1.1.0.gem &lt;/pre&gt;&lt;bgsound cep="36"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; rails-2.3.11.gem&lt;/pre&gt;&lt;bgsound cep="37"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; mysql-2.8.1.gem&lt;/pre&gt;&lt;bgsound cep="38"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; i18n-0.4.2.gem&lt;/pre&gt;&lt;bgsound cep="39"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; cgi_multipart_eof_fix-2.5.0.gem&lt;/pre&gt;&lt;bgsound cep="40"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt; # gem  install --&lt;span style="color: #0000ff"&gt;local&lt;/span&gt; coderay-1.0.0.gem&lt;/pre&gt;&lt;bgsound cep="41"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;安装成功后运行rails可以看到相应的版本信息&lt;/p&gt; &lt;p&gt;&lt;strong&gt;5.安装&lt;strong&gt;Redmine 1.2.1&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;使用svn下载Redmine 1.2源码到/var/www目录中 &lt;/li&gt;&lt;/ul&gt; &lt;div&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; # svn co http://redmine.rubyforge.org/svn/branches/1.2-stable /var/www/redmine1.2&lt;/pre&gt;&lt;bgsound cep="42"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt;redmine数据库配置，将config目录下的数据库配置模板复制一份 &lt;/li&gt;&lt;/ul&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:#&lt;/span&gt; cd /var/www/redmine1.2/&lt;/pre&gt;&lt;bgsound cep="43"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:#&lt;/span&gt; cp config/database.yml.example config/database.yml&lt;/pre&gt;&lt;bgsound cep="44"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:#&lt;/span&gt; nano config/database.yml&lt;/pre&gt;&lt;bgsound cep="45"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;打开复制出来的database.yml文件，配置production节点的mysql登录信息。&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; production:&lt;/pre&gt;&lt;bgsound cep="46"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;   adapter: mysql&lt;/pre&gt;&lt;bgsound cep="47"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;   database: redmine&lt;/pre&gt;&lt;bgsound cep="48"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;   host: localhost&lt;/pre&gt;&lt;bgsound cep="49"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;   username: redmine&lt;/pre&gt;&lt;bgsound cep="50"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;   password: redmine&lt;/pre&gt;&lt;bgsound cep="51"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;生成session存储加密信息和数据库&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; # cd /var/www/redmine1.2&lt;/pre&gt;&lt;bgsound cep="52"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; # rake config/initializers/session_store.rb&lt;/pre&gt;&lt;bgsound cep="53"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; # RAILS_ENV=production rake db:migrate&lt;/pre&gt;&lt;bgsound cep="54"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; # RAILS_ENV=production rake redmine:load_default_data&lt;/pre&gt;&lt;bgsound cep="55"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;在执行最后一行命令时，会提示选择语言种类，输入 zh 回车即可，如果直接回车确则认默认为英文。&lt;/p&gt; &lt;p&gt;运行redmine&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:#&lt;/span&gt; cd /var/www/redmine1.2&lt;/pre&gt;&lt;bgsound cep="56"&gt;&lt;/bgsound&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:#&lt;/span&gt; ruby script/server webrick -p 8000 -e production&lt;/pre&gt;&lt;bgsound cep="57"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;即可以在浏览器中输入 &lt;a href="http://xn--[ip]-v29f53rf17a:8000/"&gt;http://[服务器IP]:8000&lt;/a&gt; 访问redmine，默认的管理登录用户名和密码都为  admin，界面如下：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/wuchang/201110/201110041730414111.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/wuchang/201110/201110041730451207.png" width="644" height="287" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;要注意的是，centos默认是打开iptables服务的，所以要远程访问还要在iptables中添加一个放行规则。 &lt;br /&gt;# nano  /etc/sysconfig/iptables &lt;br /&gt;在 -A INPUT -j REJECT&amp;nbsp; 这行前添加&lt;/p&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT&lt;/pre&gt;&lt;bgsound cep="58"&gt;&lt;/bgsound&gt;&lt;/div&gt;&lt;/div&gt; &lt;div&gt;然后再重启iptables服务，使修改生效。&lt;/div&gt; &lt;p&gt;# service iptables restart&lt;/p&gt; &lt;p&gt;这样就可以远程访问了。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2264379.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/11/26/2264379.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/11/23/2259662.html</id><title type="text">安装项目管理工具 SVN+Redmine[转]</title><summary type="text">最近想装个代码管理工具，以方便管理自己几年来的代码。需要既可以方便的查看和更新，还需要可以方便的索搜代码。 开始想放到Google SVN上面，后来觉得也没必要了，放在本地既安全也很方便。 我知道的可以和SVN集成的管理工具有Trac和Redmine。以前用过Trac，不过配置挺麻烦的，而且好像有一次我改了些配置，导致站点再也打不开了（搞了好久都没搞定，^_^）。 这次决定使用Redmine来搭建一个自己的代码管理工具，把自己平时积累的代码都提交上去。下面说一下安装步骤： 一、装备文件 我们搭建redmine使用集成环境Instantails。 InstantRails2.0：http://r</summary><published>2011-11-22T16:43:00Z</published><updated>2011-11-22T16:43:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/11/23/2259662.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/11/23/2259662.html"/><content type="html">&lt;div&gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;最近想装个代码管理工具，以方便管理自己几年来的代码。需要既可以方便的查看和更新，还需要可以方便的索搜代码。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;开始想放到Google SVN上面，后来觉得也没必要了，放在本地既安全也很方便。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;我知道的可以和SVN集成的管理工具有Trac和Redmine。以前用过Trac，不过配置挺麻烦的，而且好像有一次我改了些配置，导致站点再也打不开了（搞了好久都没搞定，^_^）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;这次决定使用Redmine来搭建一个自己的代码管理工具，把自己平时积累的代码都提交上去。下面说一下安装步骤：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;一、装备文件&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;我们搭建redmine使用集成环境Instantails。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;InstantRails2.0：&lt;/span&gt;&lt;a href="http://rubyforge.org/projects/instantrails/"&gt;&lt;span style="font-size: xx-small" size="1"&gt;http://rubyforge.org/projects/instantrails/&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;redmine 1.2.0： &lt;/span&gt;&lt;a href="http://rubyforge.org/frs/?group_id=1850"&gt;&lt;span style="font-size: xx-small" size="1"&gt;http://rubyforge.org/frs/?group_id=1850&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;gem1.3.7：&lt;/span&gt;&lt;a href="http://rubyforge.org/frs/download.php/70695/rubygems-update-1.3.7.gem"&gt;&lt;span style="font-size: xx-small" size="1"&gt;http://rubyforge.org/frs/download.php/70695/rubygems-update-1.3.7.gem&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;二、安装&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;&lt;span style="font-size: xx-small" size="1"&gt;配置InstantRails2.0与redmine&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　1、解压&lt;strong&gt;InstantRails2.0&lt;/strong&gt;到一个文件夹，文件夹名字不能含有空格（如InstantRails即可）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　2、然后把redmine 1.2.0解压到InstantRails下的&lt;strong&gt;rails_apps&lt;/strong&gt;下。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;&lt;span style="font-size: xx-small" size="1"&gt;更新InstantRails2.0&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　由于Instant Rails 官网这个程序最新的2.0版本07年以后就不再更新了，因此自己搭建前请根据自己的需求更新其中的软件，Instant Rails2.0中软件的版本如下:&lt;br /&gt;&#xD;
* Upgrades Ruby to version 1.8.6 Patch Level 111&lt;br /&gt;&#xD;
* Upgrades Rails to 2.0.2&lt;br /&gt;&#xD;
* Upgrades Mongrel to 1.1.2&lt;br /&gt;&#xD;
* Upgrades RubyGems to 1.0.1&lt;br /&gt;&#xD;
* Upgrades Rake to 0.8.1&lt;br /&gt;&#xD;
* Upgraded Cookbook app to support Rails 2.0.2&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　打开Redmine1.2.0软件包中Doc目录下的INSTALL文档，&lt;strong&gt;可以看到安装的软件版本需求&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　== Requirements&lt;br /&gt;&#xD;
* Ruby 1.8.6 or 1.8.7&lt;br /&gt;&#xD;
* RubyGems 1.3.7&lt;br /&gt;&#xD;
* Ruby on Rails 2.3.11 (official downloadable Redmine releases are packaged with&amp;nbsp; the appropriate Rails version)&lt;br /&gt;&#xD;
* Rack 1.1.0 gem&lt;br /&gt;&#xD;
* Rake 0.8.3 gem&lt;br /&gt;&#xD;
* I18n 0.4.2 gem&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　因此需要更新其中的软件，步骤如下：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　1、进入InstantRails根目录下。点击&lt;strong&gt;InstantRails.exe&lt;/strong&gt;文件&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　2、点击InstantRails界面（就是刚点击InstantRails.exe后的程序界面）的&lt;strong&gt;Rails Applications&amp;#8594;Open Ruby Console Window&lt;/strong&gt;栏目，然后会跳出dos窗口。在里面输入命令：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　3、更新&lt;strong&gt;RubyGem，&lt;/strong&gt;由于&lt;strong&gt;InstantRails2.0 &lt;/strong&gt;中gem的版本比较低，不能直接通过命令行直接在线更新，需要使用到之前下载&lt;strong&gt;gem1.3.7&lt;/strong&gt;软件包。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;&amp;nbsp; DOS窗口里用命令进入gem1.3.7文件所在的目录，执行&lt;strong&gt;gem install --local rubygems-update-1.3.7.gem&lt;/strong&gt;，出现信息:&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;&amp;nbsp;&amp;nbsp; Successfully installed rubygems-update-1.3.7&lt;br /&gt;&#xD;
&amp;nbsp; 1 gem installed&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp; Installing ri documentation for rubygems-update-1.3.7...&lt;br /&gt;&#xD;
Installing RDoc documentation for rubygems-update-1.3.7...&lt;br /&gt;&#xD;
Could not find main page README&lt;br /&gt;&#xD;
Could not find main page README&lt;br /&gt;&#xD;
Could not find main page README&lt;br /&gt;&#xD;
Could not find main page README&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;&lt;strong&gt;&amp;nbsp; 再执行update_rubygems&lt;/strong&gt;.会出现的信息很多，等结束完了运行gem -v 发现已经升级到了1.3.7 yeah&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　4、更新&lt;strong&gt;Rack&lt;/strong&gt;，在命令行中输入&lt;strong&gt;gem install rack -v=1.1.0&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　5、更新&lt;strong&gt;Rake&lt;/strong&gt;，在命令行中输入&lt;strong&gt;gem install rake -v=0.8.3&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　6、在Redmine &amp;gt;= 1.0.5时，就需要安装&lt;strong&gt;i18n&lt;/strong&gt;了，在命令行中输入&lt;strong&gt;&lt;strong&gt;gem install&amp;nbsp; i18n &lt;strong&gt;&lt;strong&gt;-v=0.4.2&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　7、最后更新&lt;strong&gt;Rails&lt;/strong&gt;，在命令行中输入&lt;strong&gt;gem install&amp;nbsp; rails &lt;strong&gt;-v=2.3.11&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　　　&lt;span style="color: #ff0000" color="#ff0000"&gt;注意：Rails要在Rack和Rake软件包之后更新，因为&lt;strong&gt;&lt;strong&gt;Rails 2.3.11依赖Rack和Rake，&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;Rails 更新时如果发现Rack或Rake版本低就会自动更新&lt;strong&gt;&lt;strong&gt;Rack和&lt;strong&gt;&lt;strong&gt;Rake，&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-size: xx-small; color: #ff0000" size="1" color="#ff0000"&gt;　　　　但是自动更新的Rake的不是0.8.3(我这是0.9.1)，这导致Rake之后会运行失败。&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　8、更新&lt;strong&gt;Mongrel&lt;/strong&gt; ，InstantRails2.0 自带的Mongrel是1.1.2的版本，需要更新，在命令行中输入&lt;strong&gt;gem install&amp;nbsp; mongrel &lt;strong&gt;-v=1.1.5&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;&lt;span style="font-size: xx-small; line-height: 13px"&gt;建立redmine的数据库&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small; line-height: 13px"&gt;　　1、进入&amp;#8220;InstantRails/rails_apps/redmine/config"下，有文件&amp;#8220;database.yml.example&amp;#8221;，复制该文件重命名&amp;#8220;database.yml&amp;#8221;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;span style="font-size: xx-small" size="1"&gt;　　2、配置database.yml中的&amp;#8220;production&amp;#8221;的参数，使用默认也可以。&lt;br /&gt;&#xD;
3、InstantRails界面右键&lt;/span&gt;&lt;span style="font-size: xx-small" size="1"&gt;&lt;strong&gt;Configure&amp;#8594;Database (via PhpMyAdmin)&amp;#8221;。&lt;br /&gt;&#xD;
&lt;/strong&gt;　　进入phpMyAdmin下，新建数据库（用sql命令方式）：&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="font-size: xx-small" size="1"&gt;&lt;strong&gt;　　create database redmine character set utf8;&lt;br /&gt;&#xD;
&lt;/strong&gt;　　4、设置Session Key，进入Redmine目录，在命令行中输入&lt;/span&gt;&lt;span style="font-size: xx-small" size="1"&gt;&lt;strong&gt;rake generate_session_store&lt;br /&gt;&#xD;
&lt;/strong&gt;　　5、创建Redmine数据库，进入Redmine目录，在命令行中输入&lt;strong&gt;rake db:migrate RAILS_ENV="production"&lt;/strong&gt;，这将创建表和管理员账号&lt;br /&gt;&#xD;
6、输入&lt;strong&gt;ruby script/server -e production&lt;/strong&gt;，启动Web服务器，在浏览器中输入http://localhost:3000/登陆，默认使用管理员账号&lt;br /&gt;&#xD;
login: admin&amp;nbsp;&amp;nbsp; password: admin，下面是登陆后的截图&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;img title="Redmine" style="border-top-width: 0px; padding-right: 0px; display: inline; padding-left: 0px; border-left-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; border-right-width: 0px" height="315" alt="Redmine" src="http://images.cnblogs.com/cnblogs_com/Quincy/201106/201106030859592156.png" width="680" border="0" /&gt;&lt;br /&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;&amp;nbsp;&lt;span style="font-size: xx-small" size="1"&gt;安装SVN服务器&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;span style="font-size: xx-small; line-height: 13px"&gt;　　我这里使用Visual SVN作为SVN的服务，可以参考网络上的文章&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&lt;br /&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;三、Redmine和SVN集成&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: xx-small" size="1"&gt;　　进入Redmine目录下Config，有文件&amp;#8220;configuration.yml.example&amp;#8221;，复制该文件重命名&amp;#8220;configuration.yml&amp;#8221;，修改其中的SVN配置&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;scm_subversion_command: svn&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # (default: svn)，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　这里需要设置在环境变量PATH中添加svn所在的目录&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再重启服务器，配置SCM，选用SVN设置库路径，就可以看到代码了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img title="Redmine" style="border-top-width: 0px; padding-right: 0px; display: inline; padding-left: 0px; border-left-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; border-right-width: 0px" height="400" alt="Redmine" src="http://images.cnblogs.com/cnblogs_com/Quincy/201106/201106030900049119.png" width="672" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="blog_post_info_block"&gt;&#xD;
&lt;div id="BlogPostCategory"&gt;&lt;/div&gt;&#xD;
&lt;div id="EntryTag"&gt;&lt;/div&gt;&#xD;
&lt;div id="digg_block"&gt;&#xD;
&lt;div id="author_profile"&gt;&#xD;
&lt;div id="author_profile_info"&gt;&#xD;
&lt;div id="author_profile_detail"&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div id="author_profile_honor"&gt;&lt;/div&gt;&#xD;
&lt;div id="author_profile_follow"&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="div_digg" style="display: none"&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div id="digg_tips"&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div id="post_next_prev"&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2259662.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/11/23/2259662.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2011/11/19/2255413.html</id><title type="text">MySql 优化[转]</title><summary type="text">1.数据库的设计尽量把数据库设计的更小的占磁盘空间.1).尽可能使用更小的整数类型.(mediumint就比int更合适).2).尽可能的定义字段为not null,除非这个字段需要null.（这个规则只适合字段为KEY的情形）3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.（CHAR 总是比VARCHR快）4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.5).只创建确实需要的索引。索引有利于检索记录，但是不利于快速保存记录。如果总是要在表的组合字段上做搜索，那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是</summary><published>2011-11-19T10:20:00Z</published><updated>2011-11-19T10:20:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2011/11/19/2255413.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2011/11/19/2255413.html"/><content type="html">1.数据库的设计&lt;br /&gt;尽量把数据库设计的更小的占磁盘空间.&lt;br /&gt;1).尽可能使用更小的整数类型.(mediumint就比int更合适).&lt;br /&gt;2).尽可能的定义字段为not null,除非这个字段需要null.（&lt;span style="color: rgb(255,1,2)"&gt;这个规则只适合字段为KEY的情形&lt;/span&gt;）&lt;br /&gt;3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.（CHAR 总是比VARCHR快&lt;span style="color: rgb(255,1,2)"&gt;&lt;/span&gt;）&lt;br /&gt;4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.&lt;br /&gt;5).只创建确实需要的索引。索引有利于检索记录，但是不利于快速保存记录。如果总是要在表的组合字段上做搜索，那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段，首先就应该多复制这些字段，使索引更好的压缩。&lt;br /&gt;&lt;span style="color: rgb(255,1,2)"&gt;（这条只适合MYISAM引擎的表，对于INNODB则在保存记录的时候关系不大，因为INNODB是以事务为基础的，如果想快速保存记录的话，特别是大批量的导入记录的时候&lt;/span&gt;）&lt;br /&gt;6).所有数据都得在保存到数据库前进行处理。&lt;br /&gt;7).所有字段都得有默认值。&lt;br /&gt;8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时，它可能使用更小的静态格式表的情况下更是如此。 &lt;br /&gt;(&lt;span style="color: rgb(255,1,2)"&gt;具体的表现为：MYISAM表的MERGE类型，以及MYISAM和INNODB通用的分区，详情见手册&lt;/span&gt;)&lt;br /&gt;9).不会用到外键约束的地方尽量不要使用外键。&lt;br /&gt;2.系统的用途&lt;br /&gt;1).及时的关闭对MYSQL的连接。&lt;br /&gt;2).explain 复杂的SQL语句。（&lt;span style="color: rgb(255,1,2)"&gt;这样能确定你的SELECT 语句怎么优化最佳&lt;/span&gt;）&lt;br /&gt;3).如果两个关联表要做比较话，做比较的字段必须类型和长度都一致.（&lt;span style="color: rgb(255,1,2)"&gt;在数据庞大的时候建立INDEX&lt;/span&gt;）&lt;br /&gt;4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.&lt;br /&gt;5).如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.&lt;br /&gt;不过有一个问题，truncate 不会在事务处理中回滚。因为她要调用create table 语句。&lt;br /&gt;（&lt;span style="color: rgb(255,1,2)"&gt;Truncate Table 语句先删除表然后再重建，这个是属于文件级别的，所以自然快N多&lt;/span&gt;）&lt;br /&gt;&lt;span style="color: rgb(204,51,51)"&gt;实测例子：&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;song2为INNODB表。&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;mysql&amp;gt; select count(1) from song2;&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;+----------+&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;| count(1) |&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;+----------+&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;|&amp;nbsp;&amp;nbsp; 500000 |&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;+----------+&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;1 row in set (0.91 sec)&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;mysql&amp;gt; delete from song2;&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;Query OK, 500000 rows affected (15.70 sec)&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;mysql&amp;gt; truncate table song2;&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;Query OK, 502238 rows affected (0.17 sec)&lt;/span&gt;&lt;br style="color: rgb(204,51,51)" /&gt;&lt;span style="color: rgb(204,51,51)"&gt;&lt;/span&gt;&lt;span style="color: rgb(0,153,2)"&gt;&lt;/span&gt;&lt;span style="color: rgb(0,153,2)"&gt;&lt;/span&gt;&lt;br /&gt;6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.（&lt;span style="color: rgb(255,1,2)"&gt;ROUTINE总是减少了服务器端的开销&lt;/span&gt;）&lt;br /&gt;7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据，这比单纯的indert快好多.（&lt;span style="color: rgb(255,1,2)"&gt;在MYSQL中具体表现为：INSERT INTO TABLEQ VALUES (),(),...();&lt;/span&gt;）&lt;br /&gt;（&lt;span style="color: rgb(255,1,2)"&gt;还有就是在MYISAM表中插入大量记录的时候先禁用到KEYS后面再建立KEYS,具体表现语句：&lt;/span&gt;&lt;br style="color: rgb(255,1,2)" /&gt;&lt;span style="color: rgb(255,1,2)"&gt;&amp;nbsp;ALTER TABLE TABLE1 DISABLE KEYS;ALTER TABLE TABLE1 ENABLE KEYS;&lt;/span&gt;&lt;br style="color: rgb(255,1,2)" /&gt;&lt;span style="color: rgb(255,1,2)"&gt;而对于INNNODB 表在插入前先 set autocommit=0;完了后：set autocommit=1;这样效率比较高。&lt;/span&gt;）&lt;br /&gt;8).经常OPTIMIZE TABLE 来整理碎片.&lt;br /&gt;9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。&lt;br /&gt;3.系统的瓶颈&lt;br /&gt;1).磁盘搜索.&lt;br /&gt;并行搜索,把数据分开存放到多个磁盘中，这样能加快搜索时间.&lt;br /&gt;2).磁盘读写(IO)&lt;br /&gt;可以从多个媒介中并行的读取数据。&lt;br /&gt;3).CPU周期&lt;br /&gt;数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。&lt;br /&gt;4).内存带宽&lt;br /&gt;当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.&lt;br /&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/2255413.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2011/11/19/2255413.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/coolattt/archive/2010/07/31/1789590.html</id><title type="text">Spring中常用的操作数据库的(Dao)方法 [转]</title><summary type="text">Spring中常用的操作数据库的(Dao)方法 接口: public interface BaseDAO {  void save(T instance);  void update(T instance);  void delete(T instance);  T get(String id);  List&amp;lt;T&amp;gt; findAll();  List&amp;lt;T&amp;gt; findByExa...</summary><published>2010-07-31T09:54:00Z</published><updated>2010-07-31T09:54:00Z</updated><author><name>糊涂隐锋</name><uri>http://www.cnblogs.com/coolattt/</uri></author><link rel="alternate" href="http://www.cnblogs.com/coolattt/archive/2010/07/31/1789590.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/coolattt/archive/2010/07/31/1789590.html"/><content type="html">&lt;p&gt;Spring中常用的操作数据库的(Dao)方法 &lt;br /&gt;接口: &lt;br /&gt;public interface BaseDAO { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void save(T instance); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void update(T instance); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void delete(T instance); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T get(String id); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findAll(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByExample(T instance); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int bulkUpdate(String hql); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int bulkUpdate(String hql, Object value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int bulkUpdate(String hql, Object[] value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; find(String queryString); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; find(String queryString, Object obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; find(String queryString, Object[] obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByNamedParam(String queryString, String paramName, Object value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByNamedParam(String queryString, String[] paramNames, Object[] values); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByNamedQuery(String queryName); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByNamedQuery(String queryName, Object value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByNamedQuery(String queryName, Object[] values); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByProperty(String property, Object value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; findByPagination(final T t, final int firstResult, final int maxResult); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int countByPagination(final T t); &lt;br /&gt;} &lt;br /&gt;实现类: &lt;br /&gt;import java.sql.*; &lt;br /&gt;import java.util.List; &lt;br /&gt;import org.hibernate.*; &lt;br /&gt;import org.hibernate.criterion.*; &lt;br /&gt;import org.springframework.orm.hibernate3.*; &lt;br /&gt;import org.springframework.orm.hibernate3.support.*; &lt;/p&gt;&#xD;
&lt;p&gt;import com.vo.T; &lt;/p&gt;&#xD;
&lt;p&gt;public abstract class BaseDAOImpl extends HibernateDaoSupport implements BaseDAO{&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;protected abstract Class type();&amp;nbsp; //反射方法调用类&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 保存&amp;nbsp; &lt;br /&gt;public void save(T instance) {&amp;nbsp; &lt;br /&gt;getHibernateTemplate().save(instance);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 更新&amp;nbsp; &lt;br /&gt;public void update(T instance) {&amp;nbsp; &lt;br /&gt;getHibernateTemplate().update(instance);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 删除&amp;nbsp; &lt;br /&gt;public void delete(T instance) {&amp;nbsp; &lt;br /&gt;getHibernateTemplate().delete(instance);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据ID查询&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public T get(String id) {&amp;nbsp; &lt;br /&gt;return (T) getHibernateTemplate().get(type(), id);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 查询所有&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findAll() {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().loadAll(type()); &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据例子查询&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;@SuppressWarnings("unchecked") &lt;br /&gt;public List&amp;lt;T&amp;gt; findByExample(T instance) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().findByExample(instance);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行update操作等&amp;nbsp; &lt;br /&gt;public int bulkUpdate(String hql) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().bulkUpdate(hql);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行update操作等&amp;nbsp; &lt;br /&gt;public int bulkUpdate(String hql, Object value) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().bulkUpdate(hql, value);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行update操作等&amp;nbsp; &lt;br /&gt;public int bulkUpdate(String hql, Object[] value) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().bulkUpdate(hql, value);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行查询&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; find(String queryString) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().find(queryString);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行查询&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; find(String queryString, Object obj) {&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;return getHibernateTemplate().find(queryString, obj);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;// 根据HQL语句进行查询&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; find(String queryString, Object[] obj) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().find(queryString, obj);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 使用命名查询进行查询&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param queryString&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HQL&amp;nbsp; &lt;br /&gt;* @param paramName&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数名&amp;nbsp; &lt;br /&gt;* @param value&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数值&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByNamedParam(String queryString, String paramName, Object value) {&amp;nbsp; &lt;br /&gt;return this.getHibernateTemplate().findByNamedParam(queryString, paramName, value);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 使用命名查询进行查询 多个参数&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param queryString&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HQL&amp;nbsp; &lt;br /&gt;* @param paramNames&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数名的数组&amp;nbsp; &lt;br /&gt;* @param values&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参数值的数组&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByNamedParam(String queryString, String[] paramNames, Object[] values) {&amp;nbsp; &lt;br /&gt;return this.getHibernateTemplate().findByNamedParam(queryString, paramNames, values);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 使用HIBERNATE映射文件中的定义的HQL语句进行查询&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param queryName&amp;nbsp; &lt;br /&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 文件中定义的HQL语句的名字&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByNamedQuery(String queryName) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().findByNamedQuery(queryName);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param queryName&amp;nbsp; &lt;br /&gt;* @param value&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByNamedQuery(String queryName, Object value) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().findByNamedQuery(queryName, value);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param queryName&amp;nbsp; &lt;br /&gt;* @param values&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByNamedQuery(String queryName, Object[] values) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().findByNamedQuery(queryName, values);&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 根据属性查询&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param property&amp;nbsp; &lt;br /&gt;* @param value&amp;nbsp; &lt;br /&gt;* @return&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByProperty(String property, Object value) {&amp;nbsp; &lt;br /&gt;return this.getHibernateTemplate().findByCriteria(&amp;nbsp; &lt;br /&gt;DetachedCriteria.forClass(type()).add(Restrictions.eq(property, value)));&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 分页查询&amp;nbsp; &lt;br /&gt;* 注:不能满足要求子类重写该方法&amp;nbsp; &lt;br /&gt;* @param t&amp;nbsp; &lt;br /&gt;* @param firstResult&amp;nbsp; &lt;br /&gt;* @param maxResult&amp;nbsp; &lt;br /&gt;* @return 返回分页查询的数据&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public List&amp;lt;T&amp;gt; findByPagination(final T t, final int firstResult, final int maxResult) {&amp;nbsp; &lt;br /&gt;return getHibernateTemplate().executeFind(new HibernateCallback() {&amp;nbsp; &lt;br /&gt;public Object doInHibernate(Session session) throws HibernateException, SQLException {&amp;nbsp; &lt;br /&gt;Criteria criteria = session.createCriteria(type());&amp;nbsp; &lt;br /&gt;criteria.add(Example.create(t).enableLike(MatchMode.ANYWHERE));&amp;nbsp; &lt;br /&gt;criteria.setFirstResult(firstResult);&amp;nbsp; &lt;br /&gt;criteria.setMaxResults(maxResult);&amp;nbsp; &lt;br /&gt;return criteria.list();&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;br /&gt;});&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;/**&amp;nbsp; &lt;br /&gt;* 分页统计查询&amp;nbsp; &lt;br /&gt;*&amp;nbsp; &lt;br /&gt;* @param t&amp;nbsp; &lt;br /&gt;* @return 一共有多少条数据&amp;nbsp; &lt;br /&gt;*/&amp;nbsp; &lt;br /&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;public int countByPagination(final T t) {&amp;nbsp; &lt;br /&gt;return (Integer) getHibernateTemplate().execute(new HibernateCallback() {&amp;nbsp; &lt;br /&gt;public Object doInHibernate(Session session) throws HibernateException, SQLException {&amp;nbsp; &lt;br /&gt;Criteria criteria = session.createCriteria(type());&amp;nbsp; &lt;br /&gt;criteria.setProjection(Projections.rowCount());&amp;nbsp; &lt;br /&gt;criteria.add(Example.create(t).enableLike(MatchMode.ANYWHERE));&amp;nbsp; &lt;br /&gt;return criteria.uniqueResult();&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;br /&gt;});&amp;nbsp; &lt;br /&gt;}&amp;nbsp; &lt;br /&gt;} &lt;/p&gt;&#xD;
&lt;p&gt;反射类: &lt;/p&gt;&#xD;
&lt;p&gt;public class ClassInfoDAO{&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;@SuppressWarnings("unchecked")&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Class type() {&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return User.class;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;} &lt;br /&gt;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;本文来自CSDN博客，转载请标明出处：&lt;a href="http://blog.csdn.net/wslyy99/archive/2009/01/09/3741680.aspx"&gt;http://blog.csdn.net/wslyy99/archive/2009/01/09/3741680.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/coolattt/aggbug/1789590.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/coolattt/archive/2010/07/31/1789590.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
