<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[千鸟]]></title>
	  <link>http://souljava.blog.163.com</link>
	  <description><![CDATA[本blog所有日志均系原创　转载请注明出处 java巫师在召唤,归来吧,java图形时代]]></description>
	  <language>zh-CN</language>
	  <pubDate>Sun, 6 Jul 2008 11:25:20 +0800</pubDate>
	  <lastBuildDate>Sun, 6 Jul 2008 11:25:20 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[souljava]]></managingEditor>
	  <webMaster><![CDATA[souljava]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[千鸟]]></title>
	  	<url>http://ava.blog.163.com/photo/L_FSkve-4s9hg5iCQFxYmg==/173670060630579630.jpg</url>
	  	<link>http://souljava.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[GridBagLayout探秘]]></title>	
    <link>http://souljava.blog.163.com/blog/static/255571212008657057755</link>
    <description><![CDATA[<div><P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all; TEXT-INDENT: 21pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">所谓的布局管理器的作用就是设置组件属性</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'"> size , </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: 'Courier New'; mso-highlight: silver">Location</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><FONT face="Arial Unicode MS">。</FONT></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">GridBagLayout </SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">sun</SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">推荐的最灵活也是最复杂的布局方式。今天状态不错，打算研究下这个东东。假设读者已经知道</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">GridBagConstraints</SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">的常用属性的意义，这里只讨论这些参数按如何的优先级为GridBagLayout布局服务的。</SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; 下面是一般的布局器的工作流程</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; BACKGROUND: #ccff99; COLOR: green; FONT-FAMILY: 'Times New Roman'">1.</SPAN><SPAN lang=EN-US style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">计算出各个组件的大小。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">有perfersize </SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">的属性的，计算时会的优先考虑</SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">2.</SPAN><SPAN lang=EN-US style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">各个布局管理器，依照自己的算法计算出各个组件的位置属性。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">3.</SPAN><SPAN lang=EN-US style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">由第</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">3</SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">步的结果，设置组件的属性</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'"> size , </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: 'Courier New'; mso-highlight: silver">Location</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">。</SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt"><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">4.&nbsp; 用计算出的组件新的<FONT face="Times New Roman" size=3>size , <SPAN lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: 'Courier New'; mso-highlight: silver">Location</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">来确定容器的大小</SPAN></FONT></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">5.</SPAN><SPAN lang=EN-US style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">绘制组件。（因为布局管理器已经将</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">size , </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: 'Courier New'; mso-highlight: silver">Location</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">属性置给了组件，所以组件中绘制自己的</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 宋体"> </SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">时候总能知道自己的大小和位置）</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">所有的布局管理器的不同之处都在第</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">2</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'">步，下面描述下</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">GridBagLayout</SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">在第2步做了些什么。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;它做了两件事</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l8 level1 lfo5"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">一．</SPAN><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial">得到格子中组件的大小，同时考虑格子的对齐原则，来计算格子的大小。每个组件的可能大小不一，但是他们在面板上处的格子总是对齐的如下图：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-family: Arial; mso-fareast-font-family: 宋体"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'">&nbsp;<A href="http://img.blog.163.com/photo/pyi4Wj-ZWKzET2WlQfu2cQ==/2562548187974224510.jpg" target=_blank><SPAN style="TEXT-DECORATION: none; text-underline: none"> </SPAN></A><A href="http://img.blog.163.com/photo/pyi4Wj-ZWKzET2WlQfu2cQ==/2562548187974224510.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/pyi4Wj-ZWKzET2WlQfu2cQ==/2562548187974224510.jpg"></A><A href="http://img.blog.163.com/photo/QvnxN8ZVC4pHm3KYn5XaRQ==/1711649333378037596.jpg" target=_blank></A></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all; TEXT-INDENT: 21pt"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">为了验证一下我所说的，只需要将<SPAN lang=EN-US style="COLOR: black">GridBagConstraints的</SPAN><SPAN lang=EN-US>fill属性置为GridBagConstraints.BOTH就能完全填满自己的格子如图：</SPAN></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all; TEXT-INDENT: 21pt"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'"><SPAN lang=EN-US><A href="http://img.blog.163.com/photo/QvnxN8ZVC4pHm3KYn5XaRQ==/1711649333378037596.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/QvnxN8ZVC4pHm3KYn5XaRQ==/1711649333378037596.jpg"></A></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Times New Roman'"><A href="http://img.blog.163.com/photo/QvnxN8ZVC4pHm3KYn5XaRQ==/1711649333378037596.jpg" target=_blank><SPAN style="TEXT-DECORATION: none; text-underline: none"></SPAN></A></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all; TEXT-INDENT: -21pt; tab-stops: list 21.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial">&nbsp;</SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial">下面几个参数会影响格子的大小</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l4 level1 lfo7"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: green; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></CODE><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">ipadx</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">, </SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">ipady </SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">组件变大，那所占的格子也可能变大</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">2.insets</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">组件需要额外的空白区域，将这个区域考虑到中格子大小。<SPAN lang=EN-US></SPAN></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo8"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">3<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></CODE><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridwidth</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">, </SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridheigh</SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">当底层面板扩大而产生了新的区域，那这片区域如何分配给格子了？</SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridwidth</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">, </SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridheigh越大就抢占的越多，同时格子间保持对齐。当gridwidth</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">, </SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridheigh为0（默认）则表示不用让该组件所在的格子去抢占空间，所以当所有的组件都不去抢占的新的区域时，你会看见组件的相对位置、大小都不会变，保持原来的造型出现在变化后的面板的中央位置。</SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">4.<SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face=新宋体>gridwidth</FONT></SPAN><SPAN lang=EN-US><FONT face="Arial Unicode MS" size=3>, </FONT></SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10pt">gridheight</SPAN></CODE></SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10pt">如果一个组件占的格子不只一个，那组件的大小如何影响格子大小了？</SPAN></CODE></SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10pt">答案是影响最后一个格子对齐。</SPAN></CODE></SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10pt">看图来解释我说的，button5 给设置起始位置（x方向第0个格子，y方向第2个格子），设置它占3个格子，同时给它设置了一个相当大的PreferredSize，结果发现button5只影响了和它对齐的最后一个格子（即button3所在的格子）的大小。</SPAN></CODE></SPAN></CODE></P><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"><CODE><B><SPAN lang=EN-US style="FONT-SIZE: 10pt"></SPAN></B></CODE></SPAN></CODE>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"><A href="http://img.blog.163.com/photo/xV1QeivLyA7pKrxjfmUF9w==/284289726478255260.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/xV1QeivLyA7pKrxjfmUF9w==/284289726478255260.jpg"></A></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN>&nbsp;</P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN>&nbsp;</P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all; TEXT-INDENT: -21pt; tab-stops: list 21.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial">二．基于格子的大小位置计算出组件的新的大小和位置。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial"></SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">1 gridx</SPAN></CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'">, </SPAN><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">gridy</SPAN></CODE></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">组件占的格子从哪里开始<SPAN lang=EN-US></SPAN></SPAN></CODE></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l4 level1 lfo7"><CODE><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green">2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></B></CODE><CODE><B><SPAN lang=EN-US style="FONT-SIZE: 10pt">gridwidth</SPAN></B></CODE><SPAN lang=EN-US><FONT face="Arial Unicode MS" size=3>, </FONT></SPAN><CODE><B><SPAN lang=EN-US style="FONT-SIZE: 10pt">gridheight</SPAN></B></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><B><SPAN style="FONT-SIZE: 10pt">组件要占几个格子.<SPAN lang=EN-US></SPAN></SPAN></B></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial">&nbsp;</SPAN></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">3 fill</SPAN></CODE></P>
<P style="MARGIN: 0cm 0cm 0pt 21pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">当组件比自己的格子小的时候，怎么填充<SPAN lang=EN-US></SPAN></SPAN></CODE></P>
<P style="MARGIN: 0cm 0cm 0pt 18pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo8"><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">4<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></CODE><CODE><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">anchor</SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">当组件比自己的格子小的时候，又不填充，那该在放在那个位置</SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"></SPAN></CODE>&nbsp;</P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt">下面的代码稍作修改很容易看到各个属性的作用</SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><CODE><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt"></SPAN></CODE><CODE><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt">
<TABLE style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" cellSpacing=1 cellPadding=1 width="100%" border=1>
<TBODY>
<TR>
<TD>
<P>&nbsp;/*<BR>&nbsp;* GridBagLayoutDemo.java requires no other files.<BR>&nbsp;*/</P>
<P>import java.awt.Component;<BR>import java.awt.ComponentOrientation;<BR>import java.awt.Container;<BR>import java.awt.Dimension;<BR>import java.awt.Graphics;<BR>import java.awt.GridBagConstraints;<BR>import java.awt.GridBagLayout;<BR>import java.awt.Insets;<BR>import java.awt.event.ActionEvent;<BR>import java.awt.event.ActionListener;<BR>import java.awt.event.MouseAdapter;</P>
<P>import javax.swing.JButton;<BR>import javax.swing.JFrame;<BR>import javax.swing.ToolTipManager;</P>
<P>public class GridBagLayoutDemo {<BR>&nbsp;final static boolean shouldFill = true;<BR>&nbsp;final static boolean shouldWeightX = true;<BR>&nbsp;final static boolean RIGHT_TO_LEFT = false;</P>
<P>&nbsp;public void addComponentsToPane(Container pane) {</P>
<P>&nbsp;&nbsp;if (RIGHT_TO_LEFT) {<BR>&nbsp;&nbsp;&nbsp;pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;JButton button;<BR>&nbsp;&nbsp;pane.setLayout(new GridBagLayout());<BR>&nbsp;&nbsp;GridBagConstraints c = new GridBagConstraints();<BR>&nbsp;&nbsp;ShowSize show = new ShowSize();</P>
<P>&nbsp;&nbsp;button = new MyButton("Button 1");<BR>&nbsp;&nbsp;button.addActionListener(show);<BR>&nbsp;&nbsp;button.setPreferredSize(new Dimension(50, 150));<BR>&nbsp;&nbsp;c.fill = GridBagConstraints.BOTH;//size , Location<BR>&nbsp;&nbsp;c.gridx = 0;<BR>&nbsp;&nbsp;c.gridy = 0;<BR>&nbsp;&nbsp;pane.add(button, c);</P>
<P>&nbsp;&nbsp;c.gridheight = 1;<BR>&nbsp;&nbsp;button = new MyButton("Button 2");<BR>&nbsp;&nbsp;button.addActionListener(show);<BR>&nbsp;&nbsp;c.gridx = 1;<BR>&nbsp;&nbsp;c.gridy = 0;<BR>&nbsp;&nbsp;pane.add(button, c);</P>
<P>&nbsp;&nbsp;button = new MyButton("Button 3");<BR>&nbsp;&nbsp;button.addActionListener(show);<BR>&nbsp;&nbsp;c.gridx = 2;<BR>&nbsp;&nbsp;c.gridy = 0;<BR>&nbsp;&nbsp;pane.add(button, c);</P>
<P>&nbsp;&nbsp;button = new MyButton("Button 4");<BR>&nbsp;&nbsp;button.addActionListener(show);<BR>&nbsp;&nbsp;c.gridx = 0;<BR>&nbsp;&nbsp;c.gridy = 1;<BR>&nbsp;&nbsp;pane.add(button, c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;button = new MyButton("Button 5");<BR>&nbsp;&nbsp;button.setPreferredSize(new Dimension(150, 50));<BR>&nbsp;&nbsp;button.addActionListener(show);<BR>//&nbsp;&nbsp;c.insets = new Insets(0, 200, 0, 0); // top padding<BR>&nbsp;&nbsp;c.gridx = 0;<BR>&nbsp;&nbsp;c.gridy = 2;<BR>&nbsp;&nbsp;c.gridwidth=2;<BR>&nbsp;&nbsp;pane.add(button, c);</P>
<P>&nbsp;}</P>
<P>&nbsp;class ShowSize implements ActionListener {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void actionPerformed(ActionEvent e) {<BR>&nbsp;&nbsp;&nbsp;Component c = (Component) e.getSource();<BR>&nbsp;&nbsp;&nbsp;printSize(c);<BR>&nbsp;&nbsp;&nbsp;// c.setPreferredSize(new Dimension(50,80));<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}</P>
<P>&nbsp;class MyButton extends JButton {<BR>&nbsp;&nbsp;public MyButton(String name) {<BR>&nbsp;&nbsp;&nbsp;super(name);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void paint(Graphics g) {<BR>&nbsp;&nbsp;&nbsp;super.paint(g);<BR>&nbsp;&nbsp;&nbsp;// System.out.println(this.getText());<BR>&nbsp;&nbsp;&nbsp;// printSize(this);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}</P>
<P>public void printSize(Component c) {<BR>&nbsp;&nbsp;System.out.println(c.getName());<BR>&nbsp;&nbsp;System.out.println("pos-x" + c.getLocation().x);<BR>&nbsp;&nbsp;System.out.println("pos-y" + c.getLocation().y);<BR>&nbsp;&nbsp;System.out.println("size-h" + c.getSize().height);<BR>&nbsp;&nbsp;System.out.println("size-w" + c.getSize().width);<BR>&nbsp;}</P>
<P>&nbsp;/**<BR>&nbsp; * Create the GUI and show it. For thread safety, this method should be<BR>&nbsp; * invoked from the event-dispatching thread.<BR>&nbsp; */<BR>&nbsp;private void createAndShowGUI() {<BR>&nbsp;&nbsp;// Create and set up the window.<BR>&nbsp;&nbsp;JFrame frame = new JFrame("GridBagLayoutDemo");<BR>&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</P>
<P>&nbsp;&nbsp;// Set up the content pane.<BR>&nbsp;&nbsp;addComponentsToPane(frame.getContentPane());</P>
<P>&nbsp;&nbsp;// Display the window.<BR>&nbsp;&nbsp;frame.pack();<BR>&nbsp;&nbsp;frame.setVisible(true);<BR>&nbsp;}</P>
<P>&nbsp;public static void main(String[] args) {<BR>&nbsp;&nbsp;// Schedule a job for the event-dispatching thread:<BR>&nbsp;&nbsp;// creating and showing this application's GUI.<BR>&nbsp;&nbsp;javax.swing.SwingUtilities.invokeLater(new Runnable() {<BR>&nbsp;&nbsp;&nbsp;public void run() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;GridBagLayoutDemo g = new GridBagLayoutDemo();<BR>&nbsp;&nbsp;&nbsp;&nbsp;g.createAndShowGUI();<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;});<BR>&nbsp;}<BR>}<BR></P></TD></TR></TBODY></TABLE></SPAN></CODE></P>
<P style="MARGIN-BOTTOM: 0pt; WORD-BREAK: break-all"><SPAN lang=EN-US><FONT size=3><FONT face="Arial Unicode MS">&nbsp;</FONT></FONT></SPAN></P></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/255571212008657057755</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/255571212008657057755</guid>
    <pubDate>Sat, 5 Jul 2008 19:00:57 +0800</pubDate>
    <dcterms:modified>2008-07-06T11:10:05+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[国信朗讯我来啦]]></title>	
    <link>http://souljava.blog.163.com/blog/static/2555712120086184844534</link>
    <description><![CDATA[<div><P>国信朗讯是我的第9个offer，今天拿到体检报告就去公司把约签了。</P>
<P>漫长的求职之路告个段落了，感谢严碧波、熊兵等老师，钱良成、刘远等等朋友的照顾，帮我挺了最艰难的日子。</P>
<P>感谢之前给过我offer 的老大们，是你们的offer 给了我坚强。</P></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/2555712120086184844534</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/2555712120086184844534</guid>
    <pubDate>Tue, 1 Jul 2008 20:48:44 +0800</pubDate>
    <dcterms:modified>2008-07-02T19:16:30+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[我的毕业论文]]></title>	
    <link>http://souljava.blog.163.com/blog/static/25557121200851461911950</link>
    <description><![CDATA[<div>题目是 基于生物网络软件Cytoscape的化学信息延展<br>下载地址：http://soulnew.googlepages.com/cytoscape.doc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导师给了98分，感到相当惭愧。是关于用java 的swing 实现的计算机药物辅助设计，中科院上海药物所的药物合成化学组的PD. Xiong&nbsp; 提出软件需求，以及推荐相关化学信息软件库，由我整体设计还有编码实现，它的名字就是DrugViz。把DrugViz写成论文，拿回学校给我们电子系的导师们都看，实在有点对不住他们在电子硬件上的渊博知识，相当惭愧呀。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我一向颇懒，我觉得毕业答辩什么的放我过掉就ok了。在药物所的的导师PD. Xiong&nbsp; 认为用于描述自己精心提出系统的论文，说怎么也得评个优吧。回来后，学校导师也觉得的很容易做的内容拿个优，于开始辛苦挤论文，做ppt，写工作日志，懒人就这样被调动了起来。<br><br><!--[if gte mso 9]>
 
  Normal
  0
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
   
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4
 
<![endif]--><!--[if gte mso 9]>
 
 
<![endif]--><style>
<!--    @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:黑体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimHei;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:1 135135232 16 0 262144 0;} @font-face  {font-family:"Arial Unicode MS";  panose-1:2 11 6 4 2 2 2 2 2 4;  mso-font-charset:134;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1 -369098753 63 0 4129279 0;} @font-face  {font-family:"@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"@黑体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:1 135135232 16 0 262144 0;} @font-face  {font-family:"@Arial Unicode MS";  panose-1:2 11 6 4 2 2 2 2 2 4;  mso-font-charset:134;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1 -369098753 63 0 4129279 0;}    p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p.MsoToc1, li.MsoToc1, div.MsoToc1  {mso-style-link:"目录 1 Char";  mso-style-next:正文;  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p.MsoToc2, li.MsoToc2, div.MsoToc2  {mso-style-link:"目录 2 Char";  mso-style-next:正文;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:21.0pt;  margin-bottom:.0001pt;  mso-para-margin-top:0cm;  mso-para-margin-right:0cm;  mso-para-margin-bottom:0cm;  mso-para-margin-left:2.0gd;  mso-para-margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p.MsoToc3, li.MsoToc3, div.MsoToc3  {mso-style-next:正文;  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:42.0pt;  margin-bottom:.0001pt;  mso-para-margin-top:0cm;  mso-para-margin-right:0cm;  mso-para-margin-bottom:0cm;  mso-para-margin-left:4.0gd;  mso-para-margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink  {color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {color:purple;  text-decoration:underline;  text-underline:single;} span.1Char  {mso-style-name:"目录 1 Char";  mso-style-locked:yes;  mso-style-link:"目录 1";  mso-ansi-font-size:10.5pt;  font-family:宋体;  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;  mso-ansi-language:EN-US;  mso-fareast-language:ZH-CN;  mso-bidi-language:AR-SA;} span.2Char  {mso-style-name:"目录 2 Char";  mso-style-locked:yes;  mso-style-link:"目录 2";  mso-ansi-font-size:10.5pt;  font-family:宋体;  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;  mso-ansi-language:EN-US;  mso-fareast-language:ZH-CN;  mso-bidi-language:AR-SA;}    @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} -->
</style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:普通表格;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:"";
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:"Times New Roman";
 mso-fareast-font-family:"Times New Roman";
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
</style>
<![endif]--><!--[if gte mso 9]>
 
  Normal
  0
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
   
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4
 
<![endif]--><!--[if gte mso 9]>
 
 
<![endif]--><style>
<!--    @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;}    p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p.MsoPlainText, li.MsoPlainText, div.MsoPlainText  {margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  font-family:宋体;  mso-hansi-font-family:"Courier New";  mso-bidi-font-family:"Courier New";  mso-font-kerning:1.0pt;}    @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:595.3pt 841.9pt;  margin:72.0pt 87.65pt 72.0pt 87.65pt;  mso-header-margin:42.55pt;  mso-footer-margin:49.6pt;  mso-paper-source:0;  layout-grid:15.6pt;} div.Section1  {page:Section1;} -->
</style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:普通表格;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:"";
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:"Times New Roman";
 mso-fareast-font-family:"Times New Roman";
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
</style>
<![endif]--><p><span style=""><span lang="EN-US"><br></span></span></p>

<p><span style="" lang="EN-US">1<span style="">&nbsp; </span></span><span style="">绪论<span lang="EN-US"><span style=""> </span>1</span></span></p>

<p><span style="" lang="EN-US">1.1<span style="">&nbsp; </span></span><span style="">课题背景<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>1</span></span></p>

<p><span style="" lang="EN-US">1.1.1<span style="">&nbsp; </span></span><span style="">生物信息学的发展<span lang="EN-US"><span style=""> </span>1</span></span></p>

<p><span style="" lang="EN-US">1.1.2<span style="">&nbsp; </span></span><span style="">当前生物网络研究是热点<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>1</span></span></p>

<p><span style="" lang="EN-US">1.2<span style="">&nbsp; </span></span><span style="">课题内容<span lang="EN-US"><span style="">&nbsp; </span></span>开发<span lang="EN-US">Cytoscape </span>的插件<span lang="EN-US"> DrugViz<span style=""> </span>3</span></span></p>

<p><span style="" lang="EN-US">1.2.1<span style="">&nbsp; </span></span><span style="">代谢组学、化学基因组学的研究内容和研究方法<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>3</span></span></p>

<p><span style="" lang="EN-US">1.2.2<span style="">&nbsp; </span></span><span style="">设计的<span lang="EN-US">DrugViz</span>的意义<span lang="EN-US"><span style=""> </span>3</span></span></p>

<p><span style="" lang="EN-US">2<span style="">&nbsp; </span></span><span style="">相关技术的介绍<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>5</span></span></p>

<p><span style="" lang="EN-US">2.1<span style="">&nbsp; </span>Java</span><span style="">在科学软件中广泛应用<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>5</span></span></p>

<p><span style="" lang="EN-US">2.2<span style="">&nbsp; </span>GUI</span><span style="">关键技术<span lang="EN-US">:Java
Swing<span style=""> </span>5</span></span></p>

<p><span style="" lang="EN-US">2.1.1<span style="">&nbsp; </span>Swing</span><span style="">体系结构<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>5</span></span></p>

<p><span style="" lang="EN-US">2.1.2<span style="">&nbsp; </span>Swing</span><span style="">层次结构<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>6</span></span></p>

<p><span style="" lang="EN-US">2.2<span style=""> </span></span><span style="">生物信息软件库和<span lang="EN-US">Cytoscape<span style="">&nbsp;&nbsp; </span>6</span></span></p>

<p><span style="" lang="EN-US">2.2.1<span style="">&nbsp; </span></span><span style="">生物信息平台<span lang="EN-US">Cytoscape<span style="">&nbsp;&nbsp;&nbsp; </span>6</span></span></p>

<p><span style="" lang="EN-US">2.2.2<span style="">&nbsp; </span></span><span style="">化学信息学软件库<span lang="EN-US">CDK<span style="">&nbsp; </span>7</span></span></p>

<p><span style="" lang="EN-US">2.2.3<span style="">&nbsp; </span></span><span style="">化学信息学软件库<span lang="EN-US">JChemPaint<span style="">&nbsp;&nbsp; </span>9</span></span></p>

<p><span style="" lang="EN-US">2.3<span style="">&nbsp; </span></span><span style="">用<span lang="EN-US">eclipse</span>开发本系统<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>10</span></span></p>

<p><span style="" lang="EN-US">2.3.1<span style="">&nbsp; </span>eclipse</span><span style="">简要介绍<span lang="EN-US"><span style="">&nbsp; </span>10</span></span></p>

<p><span style="" lang="EN-US">2.3.2<span style="">&nbsp; </span>Jigloo
GUI Builder</span><span style="">开发<span lang="EN-US">GUI<span style="">&nbsp;&nbsp; </span>10</span></span></p>

<p><span style="" lang="EN-US">3<span style="">&nbsp; </span>DrugViz</span><span style="">实现的功能分析<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>11</span></span></p>

<p><span style="" lang="EN-US">3.1<span style="">&nbsp; </span></span><span style="">用户需求分析<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>11</span></span></p>

<p><span style="" lang="EN-US">3.2<span style="">&nbsp; </span></span><span style="">流程图设计<span lang="EN-US"><span style=""> </span>12</span></span></p>

<p><span style="" lang="EN-US">4<span style="">&nbsp; </span>DrugViz </span><span style="">的设计与实现<span lang="EN-US"><span style=""> </span>14</span></span></p>

<p><span style="" lang="EN-US">4.1<span style="">&nbsp; </span>java</span><span style="">常用设计模式<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>14</span></span></p>

<p><span style="" lang="EN-US">4.2<span style="">&nbsp; </span>DrugViz</span><span style="">的设计模式<span lang="EN-US"><span style="">&nbsp; </span>15</span></span></p>

<p><span style="" lang="EN-US">4.2.1<span style="">&nbsp; </span></span><span style="">本系统用到的<span lang="EN-US">java</span>模式设计<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>15</span></span></p>

<p><span style="" lang="EN-US">4.2.2<span style="">&nbsp; </span></span><span style="">模式设计的实现<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>17</span></span></p>

<p><span style="" lang="EN-US">4.3<span style="">&nbsp; </span>DrugViz</span><span style="">主要模块的详细设计<span lang="EN-US"><span style="">&nbsp; </span>18</span></span></p>

<p><span style="" lang="EN-US">4.3.1<span style="">&nbsp; </span></span><span style="">聚类<span lang="EN-US">(Cluster)</span>的使用<span lang="EN-US"><span style="">&nbsp; </span>18</span></span></p>

<p><span style="" lang="EN-US">4.3.2<span style="">&nbsp; </span></span><span style="">显示分子结构<span lang="EN-US"><span style=""> </span>23</span></span></p>

<p><span style="" lang="EN-US">4.3.3<span style="">&nbsp; </span></span><span style="">进入编辑器界面<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>25</span></span></p>

<p><span style="" lang="EN-US">4.3.4<span style="">&nbsp; </span></span><span style="">化学结构搜索<span lang="EN-US"><span style=""> </span>26</span></span></p>

<p><span style="" lang="EN-US">4.3.5<span style="">&nbsp;&nbsp; </span></span><span style="">最短路径（<span lang="EN-US">target</span>）<span lang="EN-US"><span style="">&nbsp; </span>33</span></span></p>

<p><span style="" lang="EN-US">4.3.6<span style="">&nbsp; </span></span><span style="">最短路径<span lang="EN-US"><span style=""> </span>34</span></span></p>

<p><span style="" lang="EN-US">4.3.7<span style="">&nbsp; </span>Bind
target<span style="">&nbsp; </span>37</span></p>

<p><span style="" lang="EN-US">4.3.8<span style="">&nbsp; </span>Bind drug<span style="">&nbsp;&nbsp;&nbsp; </span>39</span></p>

<p><span style="" lang="EN-US">4.4. </span><span style="">调试<span lang="EN-US"><span style="">&nbsp;
</span></span>测试<span lang="EN-US"><span style=""> </span>40</span></span></p>

<p><span style="" lang="EN-US">4.4.1<span style="">&nbsp; </span>JUnit </span><span style="">概述<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>40</span></span></p>

<p><span style="" lang="EN-US">4.4.2<span style="">&nbsp; </span></span><span style="">测试方法<span lang="EN-US"><span style=""> </span>41</span></span></p>

<p><span style="" lang="EN-US">5<span style="">&nbsp; </span>DrugViz</span><span style="">的部署<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>44</span></span></p>

<p><span style="" lang="EN-US">5.1<span style="">&nbsp; </span></span><span style="">安装<span lang="EN-US">,</span>配置<span lang="EN-US">java</span>环境<span lang="EN-US"><span style=""> </span>44</span></span></p>

<p><span style="" lang="EN-US">5.2<span style="">&nbsp; </span></span><span style="">安装<span lang="EN-US">Cytoscape</span>和<span lang="EN-US">DrugViz<span style="">&nbsp;&nbsp;&nbsp; </span>44</span></span></p>

<p><span style="" lang="EN-US">6<span style="">&nbsp; </span></span><span style="">总结<span lang="EN-US"><span style=""> </span>45</span></span></p>

<p><span style="">参考文献<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>46</span></span></p>

<p><span style="">致谢<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>47</span></span></p>

<p><span style="">附录<span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>48</span></span></p>

<p><span style="">附录<span lang="EN-US">1<span style="">&nbsp; </span></span>文件格式<span lang="EN-US"><span style=""> </span>48</span></span></p>

<p><span style="">附录<span lang="EN-US">2<span style="">&nbsp; </span></span>下载安装：<span lang="EN-US"><span style="">&nbsp;&nbsp; </span>48</span></span></p>

<p><span style="">附录<span lang="EN-US">3<span style="">&nbsp; </span>DrugViz </span>截图<span lang="EN-US"><span style=""> </span>48</span></span></p>

<p><span style="" lang="EN-US">&nbsp;</span></p>

<p style=""><span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><a href="#_Toc201122570"><span style="" lang="EN-US"><span lang="EN-US"></span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">. </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc201122570 \h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">48</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]>
 08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300031003100320032003500370030000000
<![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>

<!--[if supportFields]><span lang=EN-US style='font-size:12.0pt;font-family: 宋体;mso-bidi-font-family:"Times New Roman";mso-font-kerning:1.0pt;mso-ansi-language: EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA'><span style='mso-element:field-end'></span></span><![endif]--><br></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/25557121200851461911950</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/25557121200851461911950</guid>
    <pubDate>Sat, 14 Jun 2008 18:19:11 +0800</pubDate>
    <dcterms:modified>2008-06-14T18:43:54+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[实习展示：cytoscape 插件之DrugViz 截图]]></title>	
    <link>http://souljava.blog.163.com/blog/static/25557121200841624021579</link>
    <description><![CDATA[<div><P><A href="http://img.blog.163.com/photo/6AVZhXt6aSmNiaXntDe9QQ==/2285576810890961544.jpg" target=_blank></A>&nbsp;</P>
<P>相关下载 ：&nbsp;<A href="http://202.127.30.184:8080/software.html">http://202.127.30.184:8080/software.html</A>&nbsp;</P>
<P>我开发的^_^ !! </P>
<P>前面两张华丽截图出自导师（PD.Xiong） 欢迎去相册看大图</P><A href="http://img.blog.163.com/photo/79w9BToytDeqYUS0fqu5bA==/5354498481967147862.jpg" target=_blank></A>
<P><A href="http://img.blog.163.com/photo/79w9BToytDeqYUS0fqu5bA==/5354498481967147862.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/79w9BToytDeqYUS0fqu5bA==/5354498481967147862.jpg"></A></P>
<P>&nbsp;显示命中分子的 化学结构</P>
<P><A href="http://img.blog.163.com/photo/xdaf1KUcp293rZSLgY8cmQ==/5354498481967147863.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/xdaf1KUcp293rZSLgY8cmQ==/5354498481967147863.jpg"></A></P>
<P>绘制分子，可以在左边选择搜索方式（基于jchempaint,cdk）</P>
<P><A href="http://img.blog.163.com/photo/PiDBdIuMaJe8qOvwno5A7A==/867787353199552571.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/PiDBdIuMaJe8qOvwno5A7A==/867787353199552571.jpg"></A></P>
<P>&nbsp;Cluster 层次聚类的 导出图片</P>
<P><A href="http://img.blog.163.com/photo/4isEVXnJZ_V2HSXkVqnXfQ==/2889622110912280030.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/4isEVXnJZ_V2HSXkVqnXfQ==/2889622110912280030.jpg"></A></P><A href="http://img.blog.163.com/photo/xdaf1KUcp293rZSLgY8cmQ==/5354498481967147863.jpg" target=_blank></A>
<P><A href="http://img.blog.163.com/photo/79w9BToytDeqYUS0fqu5bA==/5354498481967147862.jpg" target=_blank></A><A href="http://img.blog.163.com/photo/xdaf1KUcp293rZSLgY8cmQ==/5354498481967147863.jpg" target=_blank></A></P><A href="http://img.blog.163.com/photo/YI9cEA_21hYrGSJUGMnyJQ==/2285576810890961545.jpg" target=_blank></A></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/25557121200841624021579</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/25557121200841624021579</guid>
    <pubDate>Fri, 16 May 2008 14:40:21 +0800</pubDate>
    <dcterms:modified>2008-05-17T12:24:18+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[JPhotoShop 开源啦（Java选择的艺术 8）]]></title>	
    <link>http://souljava.blog.163.com/blog/static/255571212008347343223</link>
    <description><![CDATA[<div><P>links:</P>
<P>&nbsp;&nbsp;&nbsp;<FONT color=#000000><STRONG><FONT color=#ff0000>&nbsp;&nbsp;&nbsp; 直接下载</FONT>：&nbsp;</STRONG></FONT><A href="http://soulnew.googlepages.com/jphotoshop.rar"><FONT color=#000000><STRONG>http://soulnew.googlepages.com/jphotoshop.rar</STRONG></FONT></A></P>
<P style="TEXT-INDENT: 2em; MARGIN-RIGHT: 0px"><STRONG><FONT color=#ff0000>sourceforge</FONT>: </STRONG><FONT color=#000000><STRONG><A href="https://sourceforge.net/projects/jphotoshop/">https://sourceforge.net/projects/jphotoshop/</A></STRONG></FONT><FONT color=#000000><STRONG><FONT color=#ff0000></FONT></STRONG></FONT></A></P>
<P style="TEXT-INDENT: 2em; MARGIN-RIGHT: 0px"><FONT color=#000000><STRONG><FONT color=#ff0000>sourceforge svn</FONT>:&nbsp; </STRONG></FONT><A href="https://jphotoshop.svn.sourceforge.net/svnroot/jphotoshop"><FONT color=#000000><STRONG><A href="https://jphotoshop.svn.sourceforge.net/svnroot/jphotoshop">https://jphotoshop.svn.sourceforge.net/svnroot/jphotoshop</A></STRONG></FONT></A><FONT color=#000000><STRONG><FONT color=#ff0000></FONT></STRONG></FONT></A></P>
<P style="TEXT-INDENT: 2em; MARGIN-RIGHT: 0px"><FONT color=#000000><STRONG><FONT color=#ff0000>download</FONT>: </STRONG></FONT><A href="http://sourceforge.net/project/showfiles.php?group_id=220691"><FONT color=#000000><STRONG>http://sourceforge.net/project/showfiles.php?group_id=220691</STRONG></FONT></A></P>
<P></P>
<P><A href="https://jphotoshop.svn.sourceforge.net/svnroot/jphotoshop"></A></P>&nbsp;<FONT color=#000000>最近忙着实习和找工作，欢迎感兴趣的朋友接过手来继续开发～</FONT> 
<P><FONT color=#000000>期望：</FONT></P>
<P><FONT color=#000000>1.它需要美化，它真的长得真的很丑陋</FONT></P>
<P><FONT color=#000000>2.最近我希望是它能实现photoshop通道功能，原理上很简单，但是代码结构设计上却矛盾重重～</FONT></P>
<P><FONT color=#000000>3.我觉得你最好在netbeans下开发它。用eclipse的话，还没找到合适的插件来阅读，国际化文本配置文件。</FONT></P>
<P><FONT color=#000000>4.如果你有什么想法欢迎联系我：&nbsp;email/msn&nbsp; : </FONT><A href="mailto:soulnew@gmail.com"><FONT color=#000000>soulnew@gmail.com</FONT></A></P>
<P><FONT color=#000000>5.为了简洁，你可以把它叫做 jps，因为它可以保存成 JPhotoShop 的专用图像格式 ：.jps , 它的结构很简单：图层数据，经过zip压缩后，得到的0失真图像格式。</FONT></P>
<P><FONT color=#000000>6.谁能帮给JPhotoShop想个什么口号？</FONT></P>
<P><FONT color=#000000>我：归来吧java桌面时代</FONT></P>
<P><FONT color=#000000>马丁路德：我有个梦想，java什么都能做</FONT></P>
<P><FONT color=#000000>培训学校： 来学java吧，它连photoshop都能搞哦</FONT></P>
<P><FONT color=#000000>sun鄙视adobe： ps算什么，我家的java连jps都能开发～</FONT></P>
<P><FONT color=#000000>情人： 你总是给我一波一波的惊喜</FONT></P>
<P><FONT color=#000000>你的了？</FONT></P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/255571212008347343223</comments>
    <slash:comments>4</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/255571212008347343223</guid>
    <pubDate>Fri, 4 Apr 2008 19:03:43 +0800</pubDate>
    <dcterms:modified>2008-05-26T17:09:21+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[vc 图像处理 课设的代码]]></title>	
    <link>http://souljava.blog.163.com/blog/static/2555712120082732610149</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">下面是一些截图.</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/8byDPt8fFy3XVq-jA32omw==/4828140275518063804.jpg"><IMG src="http://img.blog.163.com/photo/8byDPt8fFy3XVq-jA32omw==/4828140275518063804.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">初始界面</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/669XpjgAG8lS69Gn0grQVg==/5707186627785499014.jpg"><IMG src="http://img.blog.163.com/photo/669XpjgAG8lS69Gn0grQVg==/5707186627785499014.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">杂点</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/JkNdrtFKnEzPgsGla0rd9g==/4828140275518063805.jpg"><IMG src="http://img.blog.163.com/photo/JkNdrtFKnEzPgsGla0rd9g==/4828140275518063805.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">用中值滤波去杂点<A href="http://img.blog.163.com/photo/669XpjgAG8lS69Gn0grQVg==/5707186627785499014.jpg"></A></P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/dE-KqqW4Rp3SjclV9JIt4g==/323977698194525455.jpg"><IMG src="http://img.blog.163.com/photo/dE-KqqW4Rp3SjclV9JIt4g==/323977698194525455.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">油画滤镜</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/MSaM5wWvHJa7t-f0jWRoxg==/4828140275518063806.jpg"><IMG src="http://img.blog.163.com/photo/MSaM5wWvHJa7t-f0jWRoxg==/4828140275518063806.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">几何变化，这个在java的里叫仿射变换</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/afAk3EPNuRtF2CdcDeDZCg==/323977698194525423.jpg"><IMG src="http://img.blog.163.com/photo/afAk3EPNuRtF2CdcDeDZCg==/323977698194525423.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">波浪滤镜</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/g3RC15WzwkZRDjkg5deqew==/5634003133840756295.jpg"><IMG src="http://img.blog.163.com/photo/g3RC15WzwkZRDjkg5deqew==/5634003133840756295.jpg" border=0></A><A href="http://img.blog.163.com/photo/Frz6hJ-HdzKJkBEMYqoguw==/323977698194525417.jpg"></A></P>
<P style="TEXT-INDENT: 2em">球面滤镜<A href="http://img.blog.163.com/photo/Frz6hJ-HdzKJkBEMYqoguw==/323977698194525417.jpg"></A></P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/5VGMCxAw4F_URK6IHRmNsQ==/323977698194525411.jpg"><IMG src="http://img.blog.163.com/photo/5VGMCxAw4F_URK6IHRmNsQ==/323977698194525411.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">挤压</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/Frz6hJ-HdzKJkBEMYqoguw==/323977698194525417.jpg"><IMG src="http://img.blog.163.com/photo/Frz6hJ-HdzKJkBEMYqoguw==/323977698194525417.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">再挤压</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/zv9tmedzFPZRBhwIkMJ5SA==/5634003133840756292.jpg"><IMG src="http://img.blog.163.com/photo/zv9tmedzFPZRBhwIkMJ5SA==/5634003133840756292.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">右旋</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/ky48tUj1Kc-qD-VDiXDl7Q==/5634003133840756282.jpg"><IMG src="http://img.blog.163.com/photo/ky48tUj1Kc-qD-VDiXDl7Q==/5634003133840756282.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">右旋再左旋，变回原图，有一点失真</P>
<P style="TEXT-INDENT: 2em"><A href="http://img.blog.163.com/photo/BEbkTVRSkncCKl6rgDapRg==/5634003133840756279.jpg"><IMG src="http://img.blog.163.com/photo/BEbkTVRSkncCKl6rgDapRg==/5634003133840756279.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">左旋
</P><P style="TEXT-INDENT: 2em">完全源代码下载地址：<A href="http://soulnew.googlepages.com/liuke.rar">http://soulnew.googlepages.com/liuke.rar</A>
</P><P>很简单的一些东西，有些麻烦的是boss 的指令：在原来通用的从文本创建bmp</P>
<P>遇到一些问题：</P>
<P>1.从文本读出的图是歪的。搞了很久很久发现原因是bmp的规定，图像宽度必须是4的整数倍。</P>
<P>2. 自己构建的HDIB无法显示，原因是默认经典框架，需要的数据HDIB不包含 BITMAPFILEHEADER. 如果你想当然的把辛辛苦苦构建的完整bmp放入HDIB，哈哈不好意思，HDIB解析错误，所以画不出来。</P>
<P>感悟</P>
<P>工欲善其事必先厉其器。&nbsp; c/c++的语法,vc的调试器使用，要搞清楚，要构建bmp就要把bmp的结构文档好好看看，事情做多了，但是时间却节省了下来。</P>
<P>
<TABLE style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" cellSpacing=1 cellPadding=1 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD>
<P>&nbsp;//BITMAPFILEHEADER *m_pBitmapFileHeader;&nbsp; //BMP文件头<BR>BITMAPINFOHEADER *m_pBitmapInfoHeader;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //BMP位图信息头<BR>DWORD m_FileLength;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文件长度<BR>RGBQUAD *m_pRGBQuad;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调色板数组<BR>PBITMAPINFO m_pBitmapInfo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指向BITMAPINFO结构的指针<BR>// to add element <BR>BYTE* lpBits;<BR>BYTE *lpHead; <BR>int Length;<BR>int lWidth;<BR>int lHeight;<BR>int LineBits; </P>
<P>&nbsp;</P>
<P>void ReadText(CString lpszPathName){<BR>&nbsp;BYTE v=0;<BR>&nbsp;BYTE*&nbsp;&nbsp; DestArray;&nbsp;&nbsp; <BR>&nbsp;<BR>&nbsp;long&nbsp;&nbsp; FileLength; <BR>&nbsp;long&nbsp;&nbsp; PixTotal; <BR>&nbsp;long&nbsp;&nbsp; i,j; <BR>&nbsp;<BR>&nbsp;CString&nbsp;&nbsp; result; <BR>&nbsp;CFile&nbsp;&nbsp; file; <BR>&nbsp;&nbsp;&nbsp; CFileException&nbsp;&nbsp; fe;&nbsp;&nbsp; <BR>&nbsp;<BR>&nbsp;if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&amp;fe))<BR>&nbsp;{<BR>&nbsp;&nbsp;return;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;LiuKeHeader header;<BR>&nbsp;file.Read(&amp;header,sizeof(LiuKeHeader));//get size info of lkbmp<BR>&nbsp;<BR>&nbsp;FileLength=file.GetLength(); <BR>&nbsp;lWidth=header.xLength;<BR>&nbsp;lHeight=header.yLength;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; PixTotal=lWidth*lHeight; //@ 3-5<BR>&nbsp;<BR>&nbsp;DestArray=new BYTE[PixTotal]; <BR>&nbsp;<BR>&nbsp;for(&nbsp;&nbsp; i=0;i &lt;lHeight;i++&nbsp;&nbsp; ) <BR>&nbsp;{ <BR>&nbsp;&nbsp;for(&nbsp;&nbsp; j=0;j &lt;lWidth;j++&nbsp;&nbsp; ) <BR>&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;TRY <BR>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;file.Read(&amp;DestArray[i*lWidth+j],sizeof(byte));<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;CATCH(CFileException,eLoad&nbsp;&nbsp; ) <BR>&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;file.Abort(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;return; <BR>&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;END_CATCH <BR>&nbsp;&nbsp;}<BR>&nbsp;} <BR>&nbsp;<BR>&nbsp;LineBits&nbsp;&nbsp; =&nbsp; WIDTHBYTES(lWidth*8); <BR>&nbsp;Length&nbsp;&nbsp; =&nbsp; LineBits*lHeight; //the length of bmp pixel,but not the useful pixel<BR>&nbsp;<BR>&nbsp;if(&nbsp;&nbsp; lpBits&nbsp;&nbsp; ) <BR>&nbsp;&nbsp;delete&nbsp;&nbsp; []&nbsp;&nbsp; lpBits; <BR>&nbsp;lpBits=&nbsp;&nbsp; new&nbsp;&nbsp; BYTE&nbsp;&nbsp; [Length]; <BR>&nbsp;for(&nbsp;&nbsp; i=0;i &lt;Length;i++&nbsp;&nbsp; ) <BR>&nbsp;{ <BR>&nbsp;&nbsp;lpBits[i]&nbsp;&nbsp; = 125; <BR>&nbsp;} <BR>&nbsp;<BR>&nbsp;for(&nbsp;&nbsp; i=0;i &lt;lHeight;i++&nbsp;&nbsp; ) <BR>&nbsp;{ <BR>&nbsp;&nbsp;for(&nbsp;&nbsp; j=0;j &lt;lWidth;j++&nbsp;&nbsp; ) <BR>&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;if(&nbsp;&nbsp; i*lWidth+j&nbsp;&nbsp; &lt;&nbsp;&nbsp; PixTotal&nbsp;&nbsp; &amp;&amp;&nbsp;&nbsp; DestArray[i*lWidth+j] &lt;256&nbsp;&nbsp; ) <BR>&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;lpBits[ i*LineBits+j&nbsp;&nbsp; ]&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp; DestArray[&nbsp;&nbsp; i*lWidth+j&nbsp;&nbsp; ]; <BR>&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;} <BR>&nbsp;}//需要注意存储的方式 <BR>&nbsp;<BR>&nbsp;<BR>}//end read text<BR>//Length是图象数据数组的长度。 <BR>//lpBits指向图象数据的指针。 <BR>//第二步：创建bmp，申请内存，创建bmp文件头，根据图象数据数组写入bmp数据区，同时显示在屏幕上</P>
<P>void&nbsp;&nbsp; CreatInfo() <BR>{ <BR>&nbsp;<BR>&nbsp;m_FileLength&nbsp;&nbsp; =&nbsp;&nbsp; 1064&nbsp;&nbsp; +&nbsp;&nbsp; Length; <BR>&nbsp;LineBits&nbsp;&nbsp; =&nbsp;&nbsp; WIDTHBYTES(8*lWidth); <BR>&nbsp;m_pBitmapInfoHeader&nbsp;&nbsp; =&nbsp;&nbsp; (BITMAPINFOHEADER*)(lpHead); <BR>&nbsp;m_pRGBQuad&nbsp;&nbsp; =&nbsp;&nbsp; (RGBQUAD*)(&nbsp;&nbsp; lpHead&nbsp;&nbsp; + 40); //not include BITMAPFILEHEADER</P>
<P>&nbsp;m_pBitmapInfoHeader-&gt; biBitCount&nbsp;&nbsp; =&nbsp;&nbsp; 8; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biClrImportant&nbsp;&nbsp; =&nbsp;&nbsp; 0; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biClrUsed&nbsp;&nbsp; =&nbsp;&nbsp; 0; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biCompression&nbsp;&nbsp; =&nbsp;&nbsp; BI_RGB; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biHeight&nbsp;&nbsp; =&nbsp;&nbsp; lHeight; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biWidth&nbsp;&nbsp; =&nbsp;&nbsp; lWidth; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biPlanes&nbsp;&nbsp; =&nbsp;&nbsp; 1; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biSize&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; 40; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biSizeImage&nbsp;&nbsp; =&nbsp;&nbsp; lHeight*LineBits; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biXPelsPerMeter&nbsp;&nbsp; =&nbsp;&nbsp; 3799; <BR>&nbsp;m_pBitmapInfoHeader-&gt; biYPelsPerMeter&nbsp;&nbsp; =&nbsp;&nbsp; 3799; <BR>&nbsp;<BR>&nbsp;m_pBitmapInfo&nbsp;&nbsp; =&nbsp;&nbsp; (BITMAPINFO&nbsp;&nbsp; *)&nbsp;&nbsp; (m_pBitmapInfoHeader); <BR>&nbsp;m_pBitmapInfo-&gt; bmiHeader&nbsp;&nbsp; =&nbsp;&nbsp; *m_pBitmapInfoHeader; <BR>&nbsp;<BR>&nbsp;for(&nbsp;&nbsp; int&nbsp;&nbsp; i=0;i &lt;256;i++&nbsp;&nbsp; ) <BR>&nbsp;{ <BR>&nbsp;&nbsp;m_pRGBQuad[i].rgbBlue=&nbsp;&nbsp; i; <BR>&nbsp;&nbsp;m_pRGBQuad[i].rgbGreen&nbsp;&nbsp; =&nbsp;&nbsp; i; <BR>&nbsp;&nbsp;m_pRGBQuad[i].rgbRed&nbsp;&nbsp; =i; <BR>&nbsp;&nbsp;m_pRGBQuad[i].rgbReserved&nbsp;&nbsp; =&nbsp;&nbsp; 0; <BR>&nbsp;} <BR>} </P>
<P>HDIB&nbsp; CreatBMP() <BR>{ <BR>&nbsp;long&nbsp;&nbsp; i; <BR>&nbsp;int headSize=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD) ;<BR>&nbsp;lpHead&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; BYTE [headSize+Length]&nbsp;&nbsp; ; <BR>&nbsp;CreatInfo();<BR>&nbsp;for( i=0;i &lt;Length;i++) <BR>&nbsp;{ <BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;*(lpHead+headSize+i) =lpBits[i]; <BR>&nbsp;} <BR>&nbsp;&nbsp;<BR>&nbsp; &nbsp;return (HDIB)lpHead ;<BR>} //end&nbsp; CreatBMP</P>
<P>HDIB&nbsp; OnFileOpen(CString fileName){<BR>&nbsp;<BR>&nbsp;ReadText(fileName); <BR>&nbsp;HDIB hdib=CreatBMP();<BR>&nbsp;return hdib; <BR>&nbsp;<BR>}</P></TD></TR></TBODY></TABLE></P>
<P>&nbsp;</P></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/2555712120082732610149</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/2555712120082732610149</guid>
    <pubDate>Fri, 7 Mar 2008 15:26:10 +0800</pubDate>
    <dcterms:modified>2008-05-16T16:11:51+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[实习]]></title>	
    <link>http://souljava.blog.163.com/blog/static/2555712120082173855201</link>
    <description><![CDATA[<div><P style="MARGIN-TOP: 5pt; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;<FONT face=宋体>最近在准备实习，以及毕业设计相关的东西，加上过年回家，所以blog很久没更新了。</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;<FONT face=宋体>实习</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>地</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><FONT face=宋体>是在上海的中科院药物所，毕业设计也是在这里做，内容是开发生物网络软件cytoscape的插件。最近在恶补图算法，和看cytoscape&nbsp;的相关文档。&nbsp;我心爱的jphotoshop已经停下来了，半年的心血怎么处理后续的事情，我一时也不知道怎么办好？谁有建议？把它做成开源项目？</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;3<FONT face=宋体>月中旬会离开相处一年多的boss严了，boss严本身真的很强（软件硬件方面都在创造不小价值），他带出的学长也是我的楷模。不提学长他们现在已经在大公司取得的成绩，至少在学生时代我没也做到他们那样专注的搞。</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;<FONT face=宋体>预告下本blog以后内容将以增大算法比重。&nbsp;</FONT></SPAN></P><!--EndFragment--></div>]]></description>
	    <author><![CDATA[souljava]]></author>
	    <comments>http://souljava.blog.163.com/blog/static/2555712120082173855201</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://souljava.blog.163.com/blog/static/2555712120082173855201</guid>
    <pubDate>Sat, 1 Mar 2008 19:38:55 +0800</pubDate>
    <dcterms:modified>2008-03-01T19:38:55+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[java  网络3.非阻塞式http服务器]]></title>	
    <link>http://souljava.blog.163.com/blog/static/2555712120080811179873</link>
    <description><![CDATA[<div><P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><FONT face=宋体></FONT></SPAN>&nbsp;</P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><FONT face=宋体>预备知识：</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">Selector</SPAN><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>为</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">ServerSocketChannel&nbsp;<FONT face=宋体>监控&nbsp;：接收&nbsp;，连接&nbsp;就绪事件</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;SocketChannel<FONT face=宋体>，监控：&nbsp;连接就绪，读写就绪事件</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">SelectionKey</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;Selector&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>被注册一个事件，就会产生一个</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">SelectionKey&nbsp;<FONT face=宋体>句柄。所有句柄放在Selector&nbsp;的</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">all_keys&nbsp;<FONT face=宋体>集合中。当所注册的事件发生时，该</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">SelectionKey</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>会被添加到</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">Selector&nbsp;<FONT face=宋体>的</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">selected_keys&nbsp;<FONT face=宋体>集合中</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;<FONT face=宋体>判断一个有选择事件（selected）发生并移到</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><FONT face=宋体>消键集</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>（&nbsp;canceled_keys）中</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; WIDTH: 442.8pt; PADDING-TOP: 0pt; BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid" vAlign=top width=590>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;readyKeys&nbsp;=&nbsp;selector.selectedKeys();&nbsp;//<FONT face=宋体>取得selected_keys&nbsp;</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;=&nbsp;readyKeys.iterator();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(it.hasNext()){&nbsp;&nbsp;&nbsp;//selected_keys&nbsp;<FONT face=宋体>中有就绪的事件</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey&nbsp;key=null;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;(SelectionKey)&nbsp;it.next();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.remove();&nbsp;&nbsp;//<FONT face=宋体>移到canceled_key</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">A.<FONT face=宋体>事件业务处理设计：</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">Handler&lt;------+------RequestHandler&nbsp;&nbsp;//<FONT face=宋体>接受http请求和发送http&nbsp;响应</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-------AcceptHandler&nbsp;&nbsp;//<FONT face=宋体>处理接受连接就绪事件</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">public&nbsp;interface&nbsp;Handler&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;handle(SelectionKey&nbsp;key)&nbsp;throws&nbsp;IOException;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">B.<FONT face=宋体>服务器与客户端的连接核心流程</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>：</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">1.&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>给服务器注册连接就绪事件，</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">serverSocketChannel.register(selector,&nbsp;SelectionKey.OP_ACCEPT,new&nbsp;AcceptHandler());</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">//<FONT face=宋体>注册&nbsp;&nbsp;AcceptHandle</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">2&nbsp;<FONT face=宋体>有连接就绪可以读出上面注册的&nbsp;自定处理对象，做自己的进一步处理</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">Handler&nbsp;handler&nbsp;=&nbsp;(Handler)key.attachment();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">3.&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>用在第2步获得的</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'">SelectionKey</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>，注册读就绪事件</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestHandler&nbsp;rh&nbsp;=&nbsp;new&nbsp;RequestHandler(cio);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socketChannel.register(key.selector(),&nbsp;SelectionKey.OP_READ,&nbsp;rh);//<FONT face=宋体>相当于注册到了serverSocketChannel中</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">//<FONT face=宋体>注册&nbsp;&nbsp;RequestHandle</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">C.<FONT face=宋体>接流程中处理事件业务</FONT></SPAN><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">final&nbsp;Handler&nbsp;handler&nbsp;=&nbsp;(Handler)key.attachment();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">handler.handle(key);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>因为在</FONT></SPAN><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">B.</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><FONT face=宋体>中RequestHandler和AcceptHandler&nbsp;都被注册了，所以可以有相同的处理流程</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">D.<FONT face=宋体>分别设计RequestHandler和AcceptHandler</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; WIDTH: 442.8pt; PADDING-TOP: 0pt; BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid" vAlign=top width=590>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.io.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.channels.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">public&nbsp;class&nbsp;RequestHandler&nbsp;implements&nbsp;Handler&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;ChannelIO&nbsp;channelIO;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;ByteBuffer&nbsp;requestByteBuffer&nbsp;=&nbsp;null;&nbsp;&nbsp;//<FONT face=宋体>存放HTTP请求的缓冲区</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;boolean&nbsp;requestReceived&nbsp;=&nbsp;false;&nbsp;&nbsp;//<FONT face=宋体>是否已经接收到了所有的HTTP请求</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;Request&nbsp;request&nbsp;=&nbsp;null;&nbsp;&nbsp;//<FONT face=宋体>表示HTTP请求</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;Response&nbsp;response&nbsp;=&nbsp;null;&nbsp;&nbsp;//<FONT face=宋体>表示HTTP响应</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;RequestHandler(ChannelIO&nbsp;channelIO)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;this.channelIO&nbsp;=&nbsp;channelIO;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>接收HTTP请求，如果已经接收到了所有的HTTP请求数据，就返回true,否则返回false</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;boolean&nbsp;receive(SelectionKey&nbsp;sk)&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;tmp&nbsp;=&nbsp;null;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(requestReceived)return&nbsp;true;&nbsp;&nbsp;//<FONT face=宋体>如果已经接收到所有HTTP请求数据，返回true</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>如果已经读到通道的末尾，或者已经读到HTTP请求数据的末尾标志“\r\n”，就返回true</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((channelIO.read()&nbsp;&lt;&nbsp;0)&nbsp;||&nbsp;Request.isComplete(channelIO.getReadBuf()))&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestByteBuffer&nbsp;=&nbsp;channelIO.getReadBuf();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(requestReceived&nbsp;=&nbsp;true);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>通过Request类的parse()方法，解析requestByteBuffer中的HTTP请求数据，构造相应的Request对象&nbsp;</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;boolean&nbsp;parse()&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;=&nbsp;Request.parse(requestByteBuffer);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(MalformedRequestException&nbsp;x)&nbsp;{&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>如果HTTP请求的格式不正确，就发送错误信息</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;new&nbsp;Response(Response.Code.BAD_REQUEST,</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;StringContent(x));</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>创建HTTP响应&nbsp;</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;void&nbsp;build()&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;Request.Action&nbsp;action&nbsp;=&nbsp;request.action();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>仅仅支持GET和HEAD请求方式</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((action&nbsp;!=&nbsp;Request.Action.GET)&nbsp;&amp;&amp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(action&nbsp;!=&nbsp;Request.Action.HEAD)){</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;new&nbsp;Response(Response.Code.METHOD_NOT_ALLOWED,</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;StringContent("Method&nbsp;Not&nbsp;Allowed"));</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}else{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;new&nbsp;Response(Response.Code.OK,</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileContent(request.uri()),&nbsp;action);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*&nbsp;&nbsp;<FONT face=宋体>接收HTTP请求，发送HTTP响应&nbsp;*/</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;void&nbsp;handle(SelectionKey&nbsp;sk)&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(request&nbsp;==&nbsp;null)&nbsp;{&nbsp;//<FONT face=宋体>如果还没有接收到HTTP请求的所有数据</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>接收HTTP请求&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!receive(sk))return;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestByteBuffer.flip();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>如果成功解析了HTTP请求，就创建一个Response对象</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(parse())build();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.prepare();&nbsp;&nbsp;//<FONT face=宋体>准备HTTP响应的内容</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;x)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.release();&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;new&nbsp;Response(Response.Code.NOT_FOUND,</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;StringContent(x));</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.prepare();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(send())&nbsp;{&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>如果HTTP响应没有发送完毕，则需要注册写就绪事件，</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>以便在写就绪事件发生时继续发送数据</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk.interestOps(SelectionKey.OP_WRITE);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<FONT face=宋体>如果HTTP响应发送完毕，就断开底层的连接，并且释放Response占用的资源</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channelIO.close();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.release();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;//<FONT face=宋体>如果已经接收到HTTP请求的所有数据</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!send())&nbsp;{&nbsp;&nbsp;//<FONT face=宋体>如果HTTP响应发送完毕</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channelIO.close();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.release();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;x)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.printStackTrace();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channelIO.close();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(response&nbsp;!=&nbsp;&nbsp;null)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.release();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*&nbsp;<FONT face=宋体>发送HTTP响应，如果全部发送完毕，就返回false，否则返回true&nbsp;*/&nbsp;&nbsp;</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;boolean&nbsp;send()&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;response.send(channelIO);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'">}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN>
<P></P></TD></TR></TBODY></TABLE></DIV>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; WIDTH: 442.8pt; PADDING-TOP: 0pt; BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid" vAlign=top width=590>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.io.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.channels.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">public&nbsp;class&nbsp;AcceptHandler&nbsp;implements&nbsp;Handler&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;void&nbsp;handle(SelectionKey&nbsp;key)&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;ServerSocketChannel&nbsp;serverSocketChannel=(ServerSocketChannel)key.channel();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;SocketChannel&nbsp;socketChannel&nbsp;=&nbsp;serverSocketChannel.accept();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(socketChannel==&nbsp;null)return;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("<FONT face=宋体>接收到客户连接，来自:"&nbsp;+</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socketChannel.socket().getInetAddress()&nbsp;+</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;":"&nbsp;+&nbsp;socketChannel.socket().getPort());</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;ChannelIO&nbsp;cio&nbsp;=new&nbsp;ChannelIO(socketChannel,&nbsp;false/*<FONT face=宋体>非阻塞模式*/);</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;RequestHandler&nbsp;rh&nbsp;=&nbsp;new&nbsp;RequestHandler(cio);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;socketChannel.register(key.selector(),&nbsp;SelectionKey.OP_READ,&nbsp;rh);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'">}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN>
<P></P></TD></TR></TBODY></TABLE></DIV>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">E.<FONT face=宋体>可自动扩大2倍的缓冲区类设计</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"></SPAN></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; WIDTH: 442.8pt; PADDING-TOP: 0pt; BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid" vAlign=top width=590>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.io.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">import&nbsp;java.nio.channels.*;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">public&nbsp;class&nbsp;ChannelIO&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;protected&nbsp;SocketChannel&nbsp;socketChannel;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;protected&nbsp;ByteBuffer&nbsp;requestBuffer;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;private&nbsp;static&nbsp;int&nbsp;requestBufferSize&nbsp;=&nbsp;4096;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;ChannelIO(SocketChannel&nbsp;socketChannel,&nbsp;boolean&nbsp;blocking)</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;this.socketChannel&nbsp;=&nbsp;socketChannel;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;socketChannel.configureBlocking(blocking);&nbsp;//<FONT face=宋体>设置阻塞模式</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;requestBuffer&nbsp;=&nbsp;ByteBuffer.allocate(requestBufferSize);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;SocketChannel&nbsp;getSocketChannel()&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;socketChannel;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>如果原缓冲区的剩余容量不够，就创建一个新的缓冲区，容量为原来的两倍,</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>把原来缓冲区的数据拷贝到新缓冲区</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;protected&nbsp;void&nbsp;resizeRequestBuffer(int&nbsp;remaining)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(requestBuffer.remaining()&nbsp;&lt;&nbsp;remaining)&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;<FONT face=宋体>把容量增大到原来的两倍</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;bb&nbsp;=&nbsp;ByteBuffer.allocate(requestBuffer.capacity()&nbsp;*&nbsp;2);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestBuffer.flip();</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb.put(requestBuffer);&nbsp;&nbsp;//<FONT face=宋体>把原来缓冲区中的数据拷贝到新的缓冲区</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestBuffer&nbsp;=&nbsp;bb;</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>接收数据，把它们存放到requestBuffer中，如果requsetBuffer的剩余容量不足5%，</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>就调用resizeRequestBuffer()方法扩充容量</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;int&nbsp;read()&nbsp;throws&nbsp;IOException&nbsp;{</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;resizeRequestBuffer(requestBufferSize/20);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;socketChannel.read(requestBuffer);</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;/*</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*&nbsp;<FONT face=宋体>返回requestBuffer，它存放了所有的请求数据</FONT></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;*/</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'"></SPAN></P>
<P style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;public&nbsp;ByteBuf