﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-经验不在于年限，在于积累---专注互联网软件开发-随笔分类-网络开发+Mina+Netty</title><link>http://www.blogjava.net/hankchen/category/41480.html</link><description>把工作当事业做，把项目当作品做！</description><language>zh-cn</language><lastBuildDate>Mon, 09 Apr 2012 20:57:45 GMT</lastBuildDate><pubDate>Mon, 09 Apr 2012 20:57:45 GMT</pubDate><ttl>60</ttl><item><title>Netty长连接的事件处理顺序问题</title><link>http://www.blogjava.net/hankchen/archive/2012/04/08/373572.html</link><dc:creator>hankchen</dc:creator><author>hankchen</author><pubDate>Sun, 08 Apr 2012 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/hankchen/archive/2012/04/08/373572.html</guid><wfw:comment>http://www.blogjava.net/hankchen/comments/373572.html</wfw:comment><comments>http://www.blogjava.net/hankchen/archive/2012/04/08/373572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hankchen/comments/commentRss/373572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hankchen/services/trackbacks/373572.html</trackback:ping><description><![CDATA[<p>最近的一个线上项目（认证服务器）老是出现服务延迟的情况。具体的问题描述：</p> <p>（1）客户端发送一个请求A（长连接），在服务器端的业务层需要20秒以上才能接收到。</p> <p>（2）客户端发送一个请求B（端连接），在服务器端的业务层可以迅速接收到。</p> <p>从现象大致知道问题出在服务器端的网络接收层，大量通过长连接发送过来的请求都堵塞在网络层得不到处理（在网络层排队，还没到应用层）。</p> <p>（友情提示：本博文章欢迎转载，但请注明出处：hankchen，<a href="http://www.blogjava.net/hankchen"><strong>http://www.blogjava.net/hankchen</strong></a><strong>）</strong></p> <p><strong></strong>&nbsp;</p> <p>后来经过排查，发现是Netty中的OrderedMemoryAwareThreadPoolExecutor原因。相关代码如下：</p> <p>MemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(threadNums, maxChannelMemorySize,<br>&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxTotalMemorySize, keepAliveTime,<br>&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeUnit.SECONDS);<br>ExecutionHandler executionHandler = new ExecutionHandler(executor); <p>public ChannelPipeline getPipeline() throws Exception<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ChannelPipeline pipeline = pipeline();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipeline.addLast("decoder", new AuthDecoder());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipeline.addLast("encoder", new AuthEncoder());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipeline.addLast("executor", executionHandler);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipeline.addLast("handler", new AuthServerHandler(commandFactory));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pipeline;<br>} <p>&nbsp;</p> <p>先介绍下背景知识，再来分析问题。</p> <p>大家都知道，Netty是一个基于事件的NIO框架。在Netty中，一切网络动作都是通过事件来传播并处理的，例如：Channel读、Channel写等等。回忆下Netty的流处理模型：</p> <p><strong>Boss线程（一个服务器端口对于一个）---接收到客户端连接---生成Channel---交给Work线程池（多个Work线程）来处理。</strong></p> <p><strong>具体的Work线程---读完已接收的数据到ChannelBuffer---触发ChannelPipeline中的ChannelHandler链来处理业务逻辑。</strong></p> <p>注意：执行ChannelHandler链的整个过程是同步的，如果业务逻辑的耗时较长，会将导致Work线程长时间被占用得不到释放，从而影响了整个服务器的并发处理能力。</p> <p>所以，为了提高并发数，一般通过ExecutionHandler线程池来异步处理ChannelHandler链（worker线程在经过ExecutionHandler后就结束了，它会被ChannelFactory的worker线程池所回收）。在Netty中，只需要增加一行代码：</p><pre>public <a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelPipeline.html"><code>ChannelPipeline</code></a> getPipeline() {
         return <a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/Channels.html"><code>Channels</code></a>.pipeline(
                 new DatabaseGatewayProtocolEncoder(),
                 new DatabaseGatewayProtocolDecoder(),
                 <b><font color="#ff0000">executionHandler, // Must be shared</font></b>
                 new DatabaseQueryingHandler());</pre><pre>}</pre><pre>例如：</pre><pre><b><a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/execution/ExecutionHandler.html"><code>ExecutionHandler</code></a> executionHandler = new <a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/execution/ExecutionHandler.html"><code>ExecutionHandler</code></a>(
             new <a href="http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/execution/OrderedMemoryAwareThreadPoolExecutor.html"><code>OrderedMemoryAwareThreadPoolExecutor</code></a>(16, 1048576, 1048576))</b></pre>
<p>&nbsp;</p>
<p>对于ExecutionHandler需要的线程池模型，Netty提供了两种可选：
<p>1） MemoryAwareThreadPoolExecutor 通过对线程池内存的使用控制，可控制Executor中待处理任务的上限（超过上限时，后续进来的任务将被阻塞），并可控制单个Channel待处理任务的上限，防止内存溢出错误；
<p>2） OrderedMemoryAwareThreadPoolExecutor 是 MemoryAwareThreadPoolExecutor 的子类。除了MemoryAwareThreadPoolExecutor 的功能之外，它还可以保证同一Channel中处理的事件流的顺序性，这主要是控制事件在异步处理模式下可能出现的错误的事件顺序，但它并不保证同一Channel中的事件都在一个线程中执行（通常也没必要）。
<p>例如：<pre>Thread X: --- Channel A (Event A1) --.   .-- Channel B (Event B2) --- Channel B (Event B3) ---&gt;
                                      \ /
                                       X
                                      / \
Thread Y: --- Channel B (Event B1) --'   '-- Channel A (Event A2) --- Channel A (Event A3) ---&gt;</pre>
<p>上图表达的意思有几个：
<p>（1）对整个线程池而言，处理同一个Channel的事件，必须是按照顺序来处理的。例如，必须先处理完Channel A (Event A1) ，再处理Channel A (Event A2)、Channel A (Event A3)
<p>（2）同一个Channel的多个事件，会分布到线程池的多个线程中去处理。
<p>（3）不同Channel的事件可以同时处理（分担到多个线程），互不影响。&nbsp;&nbsp; <p>OrderedMemoryAwareThreadPoolExecutor 的这种事件处理有序性是有意义的，因为通常情况下，请求发送端希望服务器能够按照顺序处理自己的请求，特别是需要多次握手的应用层协议。例如：XMPP协议。
<p>&nbsp; <p>现在回到具体业务上来，我们这里的认证服务也使用了OrderedMemoryAwareThreadPoolExecutor。认证服务的其中一个环节是使用长连接，不断处理来自另外一个服务器的认证请求。通信的数据包都很小，一般都是200个字节以内。一般情况下，处理这个过程很快，所以没有什么问题。但是，由于认证服务需要调用第三方的接口，如果第三方接口出现延迟，将导致这个过程变慢。一旦一个事件处理不完，由于要保持事件处理的有序性，其他事件就全部堵塞了！而短连接之所以没有问题，是因为短连接一个Channel就一个请求数据包，处理完Channel就关闭了，根本不存在顺序的问题，所以在业务层可以迅速收到请求，只是由于同样的原因（第三方接口），处理时间会比较长。
<p>其实，认证过程都是独立的请求数据包（单个帐号），每个请求数据包之间是没有任何关系的，保持这样的顺序没有意义！
<p>&nbsp; <p>最后的改进措施：
<p>1、去掉OrderedMemoryAwareThreadPoolExecutor，改用MemoryAwareThreadPoolExecutor。
<p>2、减少调用第三方接口的超时时间，让处理线程尽早回归线程池。
<p>（友情提示：本博文章欢迎转载，但请注明出处：hankchen，<a href="http://www.blogjava.net/hankchen"><strong>http://www.blogjava.net/hankchen</strong></a><strong>）</strong></p> <img src ="http://www.blogjava.net/hankchen/aggbug/373572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hankchen/" target="_blank">hankchen</a> 2012-04-08 12:32 <a href="http://www.blogjava.net/hankchen/archive/2012/04/08/373572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Netty实现通用二进制协议的高效数据传输</title><link>http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html</link><dc:creator>hankchen</dc:creator><author>hankchen</author><pubDate>Sat, 04 Feb 2012 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html</guid><wfw:comment>http://www.blogjava.net/hankchen/comments/369378.html</wfw:comment><comments>http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hankchen/comments/commentRss/369378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hankchen/services/trackbacks/369378.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Netty是一个高性能的NIO通信框架，提供异步的、事件驱动的网络编程模型。使用Netty可以方便用户开发各种常用协议的网络程序。例如：TCP、UDP、HTTP等等。 Netty的最新版本是3.2.7，官网地址是：http://www.jboss.org/netty 本文的主要目的是基于Netty实现一个通用二进制协议的高效数据传输。协议是通用的二进制协议，高效并且扩展性很好。 一个好的协议有两个...&nbsp;&nbsp;<a href='http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html'>阅读全文</a><img src ="http://www.blogjava.net/hankchen/aggbug/369378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hankchen/" target="_blank">hankchen</a> 2012-02-04 16:33 <a href="http://www.blogjava.net/hankchen/archive/2012/02/04/369378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用httpclient模拟站点的登录发帖回复</title><link>http://www.blogjava.net/hankchen/archive/2009/09/17/295398.html</link><dc:creator>hankchen</dc:creator><author>hankchen</author><pubDate>Thu, 17 Sep 2009 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/hankchen/archive/2009/09/17/295398.html</guid><wfw:comment>http://www.blogjava.net/hankchen/comments/295398.html</wfw:comment><comments>http://www.blogjava.net/hankchen/archive/2009/09/17/295398.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/hankchen/comments/commentRss/295398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hankchen/services/trackbacks/295398.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp; 本文采用 HttpClient 来模拟站点的登录发帖回复，介绍 HttpClient 的用法和常见问题的解决方案。  HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供支持 HTTP 协议的客户端编程工具包，模拟浏览器的行为。它提供了很多的方法来简化网络的访问，虽然大部分的功能可以使用较底层的 java.net.HttpURLC...&nbsp;&nbsp;<a href='http://www.blogjava.net/hankchen/archive/2009/09/17/295398.html'>阅读全文</a><img src ="http://www.blogjava.net/hankchen/aggbug/295398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hankchen/" target="_blank">hankchen</a> 2009-09-17 08:42 <a href="http://www.blogjava.net/hankchen/archive/2009/09/17/295398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现简单的多线程HTTP服务器</title><link>http://www.blogjava.net/hankchen/archive/2009/09/15/295130.html</link><dc:creator>hankchen</dc:creator><author>hankchen</author><pubDate>Tue, 15 Sep 2009 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/hankchen/archive/2009/09/15/295130.html</guid><wfw:comment>http://www.blogjava.net/hankchen/comments/295130.html</wfw:comment><comments>http://www.blogjava.net/hankchen/archive/2009/09/15/295130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hankchen/comments/commentRss/295130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hankchen/services/trackbacks/295130.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;本文实现了一个<font style="background-color: #cce8cf">简单的多线程HTTP服务器</font>。接收HTTP GET请求，然后返回简单的文本信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;后期会丰富这个服务器，实现更多的功能，例如：<br />
1. 支持POST方式提交<br />
2. 支持二进制的流传送<br />
3. 支持线程池处理<br />
4. 采用NIO非阻塞形式实现<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;thread;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.BufferedReader;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStream;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStreamReader;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.OutputStream;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.PrintWriter;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.ServerSocket;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.Socket;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_250_324_Open_Image" onclick="this.style.display='none'; Codehighlighter1_250_324_Open_Text.style.display='none'; Codehighlighter1_250_324_Closed_Image.style.display='inline'; Codehighlighter1_250_324_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_250_324_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_250_324_Closed_Text.style.display='none'; Codehighlighter1_250_324_Open_Image.style.display='inline'; Codehighlighter1_250_324_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_250_324_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_250_324_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(C):&nbsp;2009<br />
</span><span style="color: #008080">14</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;陈新汉<br />
</span><span style="color: #008080">15</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;Jun&nbsp;27,&nbsp;2009&nbsp;2:39:39&nbsp;PM<br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_327_401_Open_Image" onclick="this.style.display='none'; Codehighlighter1_327_401_Open_Text.style.display='none'; Codehighlighter1_327_401_Closed_Image.style.display='inline'; Codehighlighter1_327_401_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_327_401_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_327_401_Closed_Text.style.display='none'; Codehighlighter1_327_401_Open_Image.style.display='inline'; Codehighlighter1_327_401_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_327_401_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_327_401_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">19</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Threaded&nbsp;Network&nbsp;Server<br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;这是一个简单的多线程HTTP服务器<br />
</span><span style="color: #008080">21</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;采用多线程来处理高并发的用户请求<br />
</span><span style="color: #008080">22</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_427_2135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_427_2135_Open_Text.style.display='none'; Codehighlighter1_427_2135_Closed_Image.style.display='inline'; Codehighlighter1_427_2135_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_427_2135_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_427_2135_Closed_Text.style.display='none'; Codehighlighter1_427_2135_Open_Image.style.display='inline'; Codehighlighter1_427_2135_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HttpServer&nbsp;</span><span id="Codehighlighter1_427_2135_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_427_2135_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img id="Codehighlighter1_469_789_Open_Image" onclick="this.style.display='none'; Codehighlighter1_469_789_Open_Text.style.display='none'; Codehighlighter1_469_789_Closed_Image.style.display='inline'; Codehighlighter1_469_789_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_469_789_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_469_789_Closed_Text.style.display='none'; Codehighlighter1_469_789_Open_Image.style.display='inline'; Codehighlighter1_469_789_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)</span><span id="Codehighlighter1_469_789_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_469_789_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServer&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpServer();<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;port</span><span style="color: #000000">=</span><span style="color: #000000">8888</span><span style="color: #000000">;<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;received</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_556_737_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_737_Open_Text.style.display='none'; Codehighlighter1_556_737_Closed_Image.style.display='inline'; Codehighlighter1_556_737_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_556_737_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_556_737_Closed_Text.style.display='none'; Codehighlighter1_556_737_Open_Image.style.display='inline'; Codehighlighter1_556_737_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_556_737_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_556_737_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocket&nbsp;server</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServerSocket(port);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img id="Codehighlighter1_619_733_Open_Image" onclick="this.style.display='none'; Codehighlighter1_619_733_Open_Text.style.display='none'; Codehighlighter1_619_733_Closed_Image.style.display='inline'; Codehighlighter1_619_733_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_619_733_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_619_733_Closed_Text.style.display='none'; Codehighlighter1_619_733_Open_Image.style.display='inline'; Codehighlighter1_619_733_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_619_733_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_619_733_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;received</span><span style="color: #000000">=</span><span style="color: #000000">server.accept();<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img id="Codehighlighter1_673_728_Open_Image" onclick="this.style.display='none'; Codehighlighter1_673_728_Open_Text.style.display='none'; Codehighlighter1_673_728_Closed_Image.style.display='inline'; Codehighlighter1_673_728_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_673_728_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_673_728_Closed_Text.style.display='none'; Codehighlighter1_673_728_Open_Image.style.display='inline'; Codehighlighter1_673_728_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(received</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_673_728_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_673_728_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs.</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ProcessThread(i</span><span style="color: #000000">++</span><span style="color: #000000">,received).start();<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img id="Codehighlighter1_758_786_Open_Image" onclick="this.style.display='none'; Codehighlighter1_758_786_Open_Text.style.display='none'; Codehighlighter1_758_786_Closed_Image.style.display='inline'; Codehighlighter1_758_786_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_758_786_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_758_786_Closed_Text.style.display='none'; Codehighlighter1_758_786_Open_Image.style.display='inline'; Codehighlighter1_758_786_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;e)</span><span id="Codehighlighter1_758_786_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_758_786_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProcessThread&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Thread<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img id="Codehighlighter1_830_2133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_830_2133_Open_Text.style.display='none'; Codehighlighter1_830_2133_Closed_Image.style.display='inline'; Codehighlighter1_830_2133_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_830_2133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_830_2133_Closed_Text.style.display='none'; Codehighlighter1_830_2133_Open_Image.style.display='inline'; Codehighlighter1_830_2133_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_830_2133_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_830_2133_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;thread_number</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Socket&nbsp;received</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img id="Codehighlighter1_957_1041_Open_Image" onclick="this.style.display='none'; Codehighlighter1_957_1041_Open_Text.style.display='none'; Codehighlighter1_957_1041_Closed_Image.style.display='inline'; Codehighlighter1_957_1041_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_957_1041_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_957_1041_Closed_Text.style.display='none'; Codehighlighter1_957_1041_Open_Image.style.display='inline'; Codehighlighter1_957_1041_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ProcessThread(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;thread_number,&nbsp;Socket&nbsp;received)&nbsp;</span><span id="Codehighlighter1_957_1041_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_957_1041_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">();<br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.thread_number&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;thread_number;<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.received&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;received;<br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img id="Codehighlighter1_1064_2130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1064_2130_Open_Text.style.display='none'; Codehighlighter1_1064_2130_Closed_Image.style.display='inline'; Codehighlighter1_1064_2130_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1064_2130_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1064_2130_Closed_Text.style.display='none'; Codehighlighter1_1064_2130_Open_Image.style.display='inline'; Codehighlighter1_1064_2130_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_1064_2130_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1064_2130_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">第</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">thread_number</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">个处理线程启动了&#8230;&#8230;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img id="Codehighlighter1_1142_2126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1142_2126_Open_Text.style.display='none'; Codehighlighter1_1142_2126_Closed_Image.style.display='inline'; Codehighlighter1_1142_2126_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1142_2126_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1142_2126_Closed_Text.style.display='none'; Codehighlighter1_1142_2126_Open_Image.style.display='inline'; Codehighlighter1_1142_2126_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(received</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_1142_2126_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1142_2126_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img id="Codehighlighter1_1151_1958_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1958_Open_Text.style.display='none'; Codehighlighter1_1151_1958_Closed_Image.style.display='inline'; Codehighlighter1_1151_1958_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1151_1958_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1151_1958_Closed_Text.style.display='none'; Codehighlighter1_1151_1958_Open_Image.style.display='inline'; Codehighlighter1_1151_1958_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_1151_1958_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1151_1958_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">连接用户的地址：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">received.getInetAddress().getHostAddress());<br />
</span><span style="color: #008080">57</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in</span><span style="color: #000000">=</span><span style="color: #000000">received.getInputStream();<br />
</span><span style="color: #008080">58</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;d</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(in));<br />
</span><span style="color: #008080">59</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">d.readLine();<br />
</span><span style="color: #008080">60</span><span style="color: #000000"><img id="Codehighlighter1_1429_1497_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1429_1497_Open_Text.style.display='none'; Codehighlighter1_1429_1497_Closed_Image.style.display='inline'; Codehighlighter1_1429_1497_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1429_1497_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1429_1497_Closed_Text.style.display='none'; Codehighlighter1_1429_1497_Open_Image.style.display='inline'; Codehighlighter1_1429_1497_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(result</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">result.equals(</span><span style="color: #000000">""</span><span style="color: #000000">))</span><span id="Codehighlighter1_1429_1497_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1429_1497_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">61</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">d.readLine();<br />
</span><span style="color: #008080">63</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">64</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;out</span><span style="color: #000000">=</span><span style="color: #000000">received.getOutputStream();<br />
</span><span style="color: #008080">65</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;outstream</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PrintWriter(out,</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
</span><span style="color: #008080">66</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg1</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;收到！&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">67</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.println(</span><span style="color: #000000">"</span><span style="color: #000000">HTTP/1.0&nbsp;200&nbsp;OK</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">返回应答消息,并结束应答</span><span style="color: #008000"><br />
</span><span style="color: #008080">68</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.println(</span><span style="color: #000000">"</span><span style="color: #000000">Content-Type:text/html;charset=GBK</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">69</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.println();</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;根据&nbsp;HTTP&nbsp;协议,&nbsp;空行将结束头信息</span><span style="color: #008000"><br />
</span><span style="color: #008080">70</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.println(msg1);<br />
</span><span style="color: #008080">71</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.flush();<br />
</span><span style="color: #008080">72</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outstream.close();<br />
</span><span style="color: #008080">73</span><span style="color: #000000"><img id="Codehighlighter1_1979_2011_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1979_2011_Open_Text.style.display='none'; Codehighlighter1_1979_2011_Closed_Image.style.display='inline'; Codehighlighter1_1979_2011_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1979_2011_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1979_2011_Closed_Text.style.display='none'; Codehighlighter1_1979_2011_Open_Image.style.display='inline'; Codehighlighter1_1979_2011_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;e)</span><span id="Codehighlighter1_1979_2011_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1979_2011_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">74</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">75</span><span style="color: #000000"><img id="Codehighlighter1_2019_2121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2019_2121_Open_Text.style.display='none'; Codehighlighter1_2019_2121_Closed_Image.style.display='inline'; Codehighlighter1_2019_2121_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2019_2121_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2019_2121_Closed_Text.style.display='none'; Codehighlighter1_2019_2121_Open_Image.style.display='inline'; Codehighlighter1_2019_2121_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">finally</span><span id="Codehighlighter1_2019_2121_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2019_2121_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">76</span><span style="color: #000000"><img id="Codehighlighter1_2029_2060_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2029_2060_Open_Text.style.display='none'; Codehighlighter1_2029_2060_Closed_Image.style.display='inline'; Codehighlighter1_2029_2060_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2029_2060_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2029_2060_Closed_Text.style.display='none'; Codehighlighter1_2029_2060_Open_Image.style.display='inline'; Codehighlighter1_2029_2060_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_2029_2060_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2029_2060_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">77</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;received.close();<br />
</span><span style="color: #008080">78</span><span style="color: #000000"><img id="Codehighlighter1_2081_2115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2081_2115_Open_Text.style.display='none'; Codehighlighter1_2081_2115_Closed_Image.style.display='inline'; Codehighlighter1_2081_2115_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2081_2115_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2081_2115_Closed_Text.style.display='none'; Codehighlighter1_2081_2115_Open_Image.style.display='inline'; Codehighlighter1_2081_2115_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;e)</span><span id="Codehighlighter1_2081_2115_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2081_2115_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">79</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080">80</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">81</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">82</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">83</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">84</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">85</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">86</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;运行这个程序启动服务器，然后在浏览器地址栏输入：<font style="background-color: #cce8cf"><a href="http://localhost:8888/">http://localhost:8888/</a></font>，即可看到返回结果。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;友情提醒：本博文章欢迎转载，但请注明出处：<a href="http://www.blogjava.net/hankchen">陈新汉</a> 
<img src ="http://www.blogjava.net/hankchen/aggbug/295130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hankchen/" target="_blank">hankchen</a> 2009-09-15 12:36 <a href="http://www.blogjava.net/hankchen/archive/2009/09/15/295130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>