﻿<?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-zhvfeng-随笔分类-Socket</title><link>http://www.blogjava.net/zhvfeng/category/45711.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Jul 2010 05:34:32 GMT</lastBuildDate><pubDate>Wed, 28 Jul 2010 05:34:32 GMT</pubDate><ttl>60</ttl><item><title>Socket Programming Considerations (2)</title><link>http://www.blogjava.net/zhvfeng/archive/2010/07/28/327281.html</link><dc:creator>天快黑了</dc:creator><author>天快黑了</author><pubDate>Wed, 28 Jul 2010 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhvfeng/archive/2010/07/28/327281.html</guid><wfw:comment>http://www.blogjava.net/zhvfeng/comments/327281.html</wfw:comment><comments>http://www.blogjava.net/zhvfeng/archive/2010/07/28/327281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhvfeng/comments/commentRss/327281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhvfeng/services/trackbacks/327281.html</trackback:ping><description><![CDATA[&nbsp;
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">Socket ack (acknowledgement)</span></h2>
<p style="margin-left: 21pt" class="MsoNormal">Socket ack<span style="font-family: 宋体">是指当</span>socket<span style="font-family: 宋体">接收到数据之后，发送一个</span>ack<span style="font-family: 宋体">字符串</span>(<span style="font-family: 宋体">比如</span>$ACK)<span style="font-family: 宋体">给</span>socket<span style="font-family: 宋体">发送方。这样，</span>socket<span style="font-family: 宋体">发送方可以根据是否收到了</span>ack<span style="font-family: 宋体">判断对方是否收到了数据。</span></p>
<p style="margin-left: 21pt" class="MsoNormal">Socket ack<span style="font-family: 宋体">是显示的在应用程序中加入的一种通讯协议。如果不使用</span>ack<span style="font-family: 宋体">，在</span>socket<span style="font-family: 宋体">通讯中，可能会丢失数据。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">比如，</span>socket client<span style="font-family: 宋体">要连续的给</span>socket server<span style="font-family: 宋体">发送</span>100<span style="font-family: 宋体">条消息。如果我们在</span>server<span style="font-family: 宋体">收到第</span>50<span style="font-family: 宋体">条消息的时候，强行</span>kill<span style="font-family: 宋体">了</span>server<span style="font-family: 宋体">。那么查询</span>client<span style="font-family: 宋体">端发送的</span>log<span style="font-family: 宋体">，可能</span>client<span style="font-family: 宋体">端成功发送了</span>51<span style="font-family: 宋体">条。只有当</span>client<span style="font-family: 宋体">端发送第</span>52<span style="font-family: 宋体">条消息的时候才遇到异常。这样第</span>51<span style="font-family: 宋体">条消息就丢失了。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">所以为了确保数据传输的准确性，我们可以引入</span>ack<span style="font-family: 宋体">协议。有时我们不仅要确保</span>server<span style="font-family: 宋体">不但收到了数据，而且还要保证</span>server<span style="font-family: 宋体">成功处理了数据。这时，可以等</span>server<span style="font-family: 宋体">成功处理完数据之后，再给</span>client<span style="font-family: 宋体">发</span>ack<span style="font-family: 宋体">。</span></p>
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">Socket Keep Alive</span></h2>
<p style="margin-left: 21pt" class="MsoNormal">Socket<span style="font-family: 宋体">连接像数据库连接一样，属于重量型资源。如果我们频繁的创建</span>socket<span style="font-family: 宋体">、发送</span>/<span style="font-family: 宋体">接收数据、关闭</span>socket<span style="font-family: 宋体">，那么会有很大一部分时间浪费在</span>socket<span style="font-family: 宋体">的创建和关闭上。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">所以，如果我们经常需要与同一个</span>socket<span style="font-family: 宋体">地址发送</span>/<span style="font-family: 宋体">接收数据时，应该考虑只创建一次</span>socket<span style="font-family: 宋体">，然后一直使用这个</span>socket<span style="font-family: 宋体">对象发送</span>/<span style="font-family: 宋体">接收数据。</span></p>
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">Heartbeat</span></h2>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">通常，我们会设置</span>socket<span style="font-family: 宋体">的</span>receive timeout<span style="font-family: 宋体">。这样，如果我们一直打开着</span>socket (keep alive)<span style="font-family: 宋体">，</span> <span style="font-family: 宋体">而很长时间又没有数据通讯，</span>socket<span style="font-family: 宋体">接收方就会</span>timeout<span style="font-family: 宋体">，最终导致打开的连接坏掉。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">如果很长时间没有数据通讯，防火墙或代理服务器也可能会关闭打开的</span>socket<span style="font-family: 宋体">连接。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">所以为了保证打开的</span>socket<span style="font-family: 宋体">连接一直可用，如果一段时间没有数据进行通讯（或指定一个时间间隔），我们可以显示的发送一个</span>heartbeat<span style="font-family: 宋体">消息</span>(<span style="font-family: 宋体">比如</span>: $HRT)<span style="font-family: 宋体">给对方，从而保证连接不会被异常关闭。</span></p>
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">Socket Close</span></h2>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">每一个socket</span><span style="font-family: 宋体">对象会持有一个socket descriptor (</span><span style="font-family: 宋体">其实就是file descriptor)</span><span style="font-family: 宋体">，操作系统对于socket descriptor</span><span style="font-family: 宋体">有一个最大限制</span><span style="font-family: 宋体">。因此当</span>socket<span style="font-family: 宋体">不再使用时，一定要记得关闭，即使</span>socket<span style="font-family: 宋体">连接失败或出现异常，只要</span>socket<span style="font-family: 宋体">对象不为</span>null<span style="font-family: 宋体">，一定要记得关闭。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">下面图显示了，当</span>socket<span style="font-family: 宋体">关闭时，</span>socket<span style="font-family: 宋体">的状态变化</span>(socket<span style="font-family: 宋体">状态可以通过</span>netstat<span style="font-family: 宋体">命令查看</span>)<span style="font-family: 宋体">。更详细的解释，可以</span>google<span style="font-family: 宋体">一下。<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/zhvfeng/image001.png" /><br />
</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当主动一方调用</span>close(<span style="font-family: 宋体">先调用</span>close)<span style="font-family: 宋体">时的状态变化</span>: </p>
<p style="margin-left: 21pt" class="MsoNormal">ESTABLISHED -&gt; FIN_WAIT_1-&gt; FIN_WAIT_2 -&gt; TIME_WAIT -&gt; CLOSED</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当被动一方调用</span>close(<span style="font-family: 宋体">后调用</span>close)<span style="font-family: 宋体">时的状态变化</span>:</p>
<p style="margin-left: 21pt" class="MsoNormal">ESTABLISHED -&gt; CLOSE_WAIT -&gt; LAST_ACK -&gt; CLOSED</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">通常，</span>TIME_WAIT <span style="font-family: 宋体">是正常状态，过一段时间</span>(2MSL, 1<span style="font-family: 宋体">到</span>4<span style="font-family: 宋体">分钟</span>)<span style="font-family: 宋体">就会自动消失</span>.</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">我们需要特别注意</span>CLOSE_WAIT <span style="font-family: 宋体">状态：</span></p>
<p style="text-indent: -20.5pt; margin-left: 41.5pt; tab-stops: list 41.5pt" class="MsoNormal">1．<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span><span style="font-family: 宋体">如果很长时间才消失，表明</span>socket server<span style="font-family: 宋体">处理太慢，很多</span>client<span style="font-family: 宋体">已经连接到</span>server<span style="font-family: 宋体">，发送完数据并</span>close<span style="font-family: 宋体">了。</span></p>
<p style="text-indent: -20.5pt; margin-left: 41.5pt; tab-stops: list 41.5pt" class="MsoNormal">2．<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span><span style="font-family: 宋体">如果一直也不消失，表明有</span>socket<span style="font-family: 宋体">没有正常</span>close (<span style="font-family: 宋体">对方已经</span>close<span style="font-family: 宋体">了</span>)</p>
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">SO_REUSEADDR Option</span></h2>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当</span>socket<span style="font-family: 宋体">主动调用</span>close<span style="font-family: 宋体">的时候，从上面可以知道，它最终会进入</span>TIME_WAIT <span style="font-family: 宋体">状态，需要过</span>1<span style="font-family: 宋体">到</span>4<span style="font-family: 宋体">分钟，才能完全</span>close<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当</span>socket<span style="font-family: 宋体">处于</span>TIME_WAIT <span style="font-family: 宋体">状态时，它仍然占用正在使用的</span>IP/PORT<span style="font-family: 宋体">。这样，如果我们的程序</span>(<span style="font-family: 宋体">比如</span>socket server)<span style="font-family: 宋体">使用了一个固定的</span>IP/PORT<span style="font-family: 宋体">，当</span>socket<span style="font-family: 宋体">处于</span>TIME_WAIT <span style="font-family: 宋体">状态时，程序将不能立即重启，会出现端口占用错误。</span></p>
<p style="margin-left: 21pt" class="MsoNormal">Socket<span style="font-family: 宋体">提供了一个</span>setReuseAddress()<span style="font-family: 宋体">方法，可以设置当</span>socket<span style="font-family: 宋体">处于</span>TIME_WAIT <span style="font-family: 宋体">状态时，是否允许其它进程绑定这个端口。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">如果我们正在开发</span>socket server<span style="font-family: 宋体">，一定要记得调用</span>ServerSocket.setReuseAddress(true).</p>
<p style="margin-left: 21pt" class="MsoNormal">Client socket<span style="font-family: 宋体">也有这个方法，而且有时可能需要指明</span>client<span style="font-family: 宋体">连接</span>server<span style="font-family: 宋体">时所使用的本地</span>IP/PORT(<span style="font-family: 宋体">一般不用指明，系统会随机选择一个</span>PORT)<span style="font-family: 宋体">。但实际测试，在</span>client socket<span style="font-family: 宋体">上设置这个方法在</span>Windows<span style="font-family: 宋体">和</span>Solaris<span style="font-family: 宋体">下并不起作用。当</span>socket<span style="font-family: 宋体">处于</span>TIME_WAIT <span style="font-family: 宋体">状态时，重启</span>client<span style="font-family: 宋体">仍然出现端口占用错误。上网搜索了很长时间，很多人都碰到了这个问题，可能是操作系统底层</span>socket<span style="font-family: 宋体">实现问题。因为测试使用</span>C<span style="font-family: 宋体">语言开发的</span>socket client<span style="font-family: 宋体">，同样也有这个错误。有人说</span>LINUX<span style="font-family: 宋体">下好用，还有就是可以尝试修改</span>tcp_time_wait_interval<span style="font-family: 宋体">来减小</span>TIME_WAIT<span style="font-family: 宋体">等待时间</span></p>
 <img src ="http://www.blogjava.net/zhvfeng/aggbug/327281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhvfeng/" target="_blank">天快黑了</a> 2010-07-28 09:23 <a href="http://www.blogjava.net/zhvfeng/archive/2010/07/28/327281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket Programming Considerations (1)</title><link>http://www.blogjava.net/zhvfeng/archive/2010/07/26/327114.html</link><dc:creator>天快黑了</dc:creator><author>天快黑了</author><pubDate>Mon, 26 Jul 2010 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/zhvfeng/archive/2010/07/26/327114.html</guid><wfw:comment>http://www.blogjava.net/zhvfeng/comments/327114.html</wfw:comment><comments>http://www.blogjava.net/zhvfeng/archive/2010/07/26/327114.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhvfeng/comments/commentRss/327114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhvfeng/services/trackbacks/327114.html</trackback:ping><description><![CDATA[第一次开博，第一次写文章。文笔不好，只是记录一下个人心得。<br />
<br />
最近一直在做Socket程序，这里把一些Socket程序的注意事项总结一下。今天先说说Socket中的Timeout，其它的下次补全。<br />
<br />
<br />
<h2 style="text-indent: -21pt; margin-left: 21pt; tab-stops: list 21.0pt"><span style="line-height: 173%; font-size: 12pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 173%; font-size: 12pt">Socket Timeout</span></h2>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">写</span>Socket<span style="font-family: 宋体">程序的时候需要注意设置下面的</span>timeout<span style="font-family: 宋体">，避免对方没有响应的时候，导致</span>Socket<span style="font-family: 宋体">程序挂起或等待时间过长</span></p>
<h3 style="line-height: normal; text-indent: -1cm; margin-left: 49.6pt; tab-stops: list 49.6pt"><span style="font-size: 12pt">1.1<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">&nbsp;Accept Timeout</span></h3>
<p style="margin-left: 21pt" class="MsoNormal">Accept timeout <span style="font-family: 宋体">仅对</span>ServerSocket<span style="font-family: 宋体">有用。</span>ServerSocket <span style="font-family: 宋体">使用</span>accept()<span style="font-family: 宋体">方法来监听客户端</span>Socket<span style="font-family: 宋体">的连接。</span></p>
<p style="text-indent: 0.05pt; margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">默认，</span>ServerSocket.accept() <span style="font-family: 宋体">方法会一直阻塞直到有客户端来连接</span><span style="font-family: 宋体">。通常，我们不需要设置</span>accept timeout.</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">但有时候特殊情况，还是要考虑设置</span>accept timeout. </p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">比如</span>: <span style="font-family: 宋体">程序</span>A<span style="font-family: 宋体">给程序</span>B<span style="font-family: 宋体">发了一个</span>JMS<span style="font-family: 宋体">消息，然后程序</span>A<span style="font-family: 宋体">启动一个</span>Socket Server<span style="font-family: 宋体">，想通过</span>socket<span style="font-family: 宋体">等待接收程序</span>B<span style="font-family: 宋体">的返回消息。如果不设置</span>accept timeout, <span style="font-family: 宋体">并且程序</span>B<span style="font-family: 宋体">因为某些原因一直不能连接</span>Socket Server<span style="font-family: 宋体">，最终会导致程序</span>A<span style="font-family: 宋体">挂起。</span></p>
<p style="margin-left: 21pt" class="MsoNormal">Accept Timeout<span style="font-family: 宋体">可以这样设置：</span></p>
<p style="margin-left: 21pt" class="MsoNormal">ServerSocket serverSocket = new ServerSocket(5555);</p>
<p style="margin-left: 21pt" class="MsoNormal">serverSocket.setSoTimeout(5000); // in milliseconds</p>
<p style="margin-left: 21pt" class="MsoNormal">while (true) {</p>
<p style="margin-left: 21pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; Socket socket = serverSocket.accept();</p>
<p style="margin-left: 21pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;</p>
<p style="margin-left: 21pt" class="MsoNormal">}</p>
<h3 style="line-height: normal; text-indent: -17.85pt; margin-left: 38.85pt; tab-stops: list 49.6pt"><span style="font-size: 12pt">1.2<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">&nbsp;Connect Timeout</span></h3>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当</span>Client<span style="font-family: 宋体">端连接</span>Server<span style="font-family: 宋体">端的时候，可以指定</span>Connect Timeout</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">如果没有指定，会使用操作系统的默认值</span>:</p>
<div align="center">
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0">
    <tbody>
        <tr style="height: 13.85pt">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; background: #e0e0e0; height: 13.85pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p><strong>OS</strong></p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; background: #e0e0e0; height: 13.85pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p><strong>Default TCP timeout</strong></p>
            </td>
        </tr>
        <tr style="height: 13.85pt">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.85pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>BSD</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.85pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>75 seconds</p>
            </td>
        </tr>
        <tr style="height: 13.85pt">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.85pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>Linux</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.85pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>189 seconds</p>
            </td>
        </tr>
        <tr style="height: 13.3pt">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.3pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>Solaris</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 13.3pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>225 seconds</p>
            </td>
        </tr>
        <tr style="height: 14.4pt">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 14.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>Windows XP</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 174pt; padding-right: 5.4pt; height: 14.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="314">
            <p>21 seconds</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin-left: 21pt" class="MsoNormal">Connect Timeout<span style="font-family: 宋体">可以这样设置：</span></p>
<p style="margin-left: 21pt" class="MsoNormal">SocketAddress socketAddress = new InetSocketAddress(host, port);</p>
<p style="margin-left: 21pt" class="MsoNormal">socket = new Socket();</p>
<p style="margin-left: 21pt" class="MsoNormal">socket.connect(socketAddress, connectTimeout);</p>
<h3 style="line-height: normal; text-indent: -17.85pt; margin-left: 38.85pt; tab-stops: list 49.6pt"><span style="font-size: 12pt">1.3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">&nbsp;Receive Timeout</span></h3>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当</span>socket<span style="font-family: 宋体">从另一方接收数据时，可以设置</span>Receive Timeout</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">默认没有</span>timeout<span style="font-family: 宋体">，</span>socket<span style="font-family: 宋体">会一直阻塞直到有数据可读取。</span></p>
<p style="margin-left: 21pt" class="MsoNormal">Receive Timeout<span style="font-family: 宋体">可以这样设置：</span></p>
<p style="margin-left: 21pt" class="MsoNormal">Socket socket = new Socket(host, port);</p>
<p style="margin-left: 21pt" class="MsoNormal">socket.setSoTimeout(timeout);</p>
<h3 style="line-height: normal; text-indent: -17.85pt; margin-left: 38.85pt; tab-stops: list 49.6pt"><span style="font-size: 12pt">1.4<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">&nbsp;Send Timeout</span></h3>
<p style="margin-left: 21pt" class="MsoNormal">Send Timeout<span style="font-family: 宋体">是</span>socket<span style="font-family: 宋体">给另一方发送数据时使用的。</span></p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">不过</span>Java<span style="font-family: 宋体">里没有办法设置</span>Send Timeout.</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 宋体">当然，</span>socket<span style="font-family: 宋体">发送数据的时候，会首先发送到本机</span>OS<span style="font-family: 宋体">的一个</span>buffer<span style="font-family: 宋体">内。一般只要一次发送的数据不是很大，即使对方挂起或暂时不能接收数据，也不会导致发送方挂起。</span></p>
<br />
       <img src ="http://www.blogjava.net/zhvfeng/aggbug/327114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhvfeng/" target="_blank">天快黑了</a> 2010-07-26 09:31 <a href="http://www.blogjava.net/zhvfeng/archive/2010/07/26/327114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>