📄 chapter18.htm
字号:
COLOR: #000000; TEXT-DECORATION: underline}.navigater { FONT-SIZE: 12px; COLOR: #333333; LINE-HEIGHT: 19px; TEXT-DECORATION: none}A.navigater:hover { COLOR: #cc0000}.g1 { FONT-SIZE: 14px}.g2 { PADDING-LEFT: 21px; PADDING-TOP: 5px}.g3 { FONT-WEIGHT: bold; COLOR: #ab6503}.g4 { COLOR: #ff0000}.img { BORDER-RIGHT: #800000 1px solid; BORDER-TOP: #800000 1px solid; BORDER-LEFT: #800000 1px solid; BORDER-BOTTOM: #800000 1px solid}.img1 { BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid}.f14 { FONT-SIZE: 14px; LINE-HEIGHT: 26px}.f20 { FONT-WEIGHT: bold; FONT-SIZE: 20px}.top_red { COLOR: #d70709; TEXT-DECORATION: none}.center01 { COLOR: #000000; LINE-HEIGHT: 20px}.center01 TD { COLOR: #000000; LINE-HEIGHT: 20px}.center01 A:link { COLOR: #000000; TEXT-DECORATION: none}.center01 A:visited { COLOR: #000000; TEXT-DECORATION: none}.center01 A:hover { COLOR: #2b7128; TEXT-DECORATION: underline}.center02 { COLOR: #194e00; LINE-HEIGHT: 20px}.center02 TD { COLOR: #194e00; LINE-HEIGHT: 20px}.center02 A:link { COLOR: #194e00; TEXT-DECORATION: none}.center02 A:visited { COLOR: #194e00; TEXT-DECORATION: none}.center02 A:hover { COLOR: #194e00; TEXT-DECORATION: underline}--></style><TABLE width=760 border=0 align=center cellPadding=0 cellSpacing=0 bgcolor="#F3F3F3" valign="top"> <tr class="center01"> <td width="488" style="padding-left:10px;padding-top:10px"> <a href="index.php">连载</a> > <a href="slist.php?class1=6">程序设计</a> > <a href="slist.php?class2=7">Java</a> > <a href="serialize.php?id=387">Java网络编程专辑</a> </td> <td width="280" style="padding-left:10px;padding-top:10px"> <div align="center"> <font color=#0000FF><a href='chapter.php?id=387&volume=2&chapter=4'>上一页</a></font> <font color=#0000FF><a href="serialize.php?id=387">回书目</a></font> <font color=#0000FF><a href='chapter.php?id=387&volume=2&chapter=6'>下一页</a></font> </div> </td> </tr> <tr class="center01"> <td colspan="2" align="center" style="padding-left:10px;padding-top:10px"> </td> </tr> <TBODY> <TR> <TD colspan="2" align=middle> <BR> <div style="FONT-SIZE: 18pt; COLOR: #990000; FONT-FAMILY: 楷体_GB2312" align=center><B>网络协议</b></div><br><div style="COLOR: #990000; font-family: ; font-size: 18px;宋体;" align=center>Java网络编程之传输控制协议(二3)</div> <DIV style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%" align=left> <br> <P>4、套接字选项<BR><BR> 套接字选项是改变套接字工作方式的设置,并且它们能影响(正反两方向)应用程序的性能。对于套接字选项的支持是在Java 1.1中引入的,在后面的一些版本中对其中一些做了改进(例如在Java 2 和Java 3中支持SO_KEEPALIVE选项)。通常情况下,不应该修改套接字选项,除非有很必要的原因,因为这种改变可能反面影响应用程序和网络的性能(例如,激活Nagle算法可能提高telnet类型应用程序的性能,但是会降低可以使用地网络带宽)。唯一的例外是SO_TIMEOUT选项--事实上,如果套接字连接的应用程序传输数据出现失败的时候,它都应该温和地处理超时问题,而不应该因此延迟速度。<BR><BR> ⑴SO_KEEPALIVE套接字操作<BR><BR> Keepalive(保持活动)套接字选项是很有争议的,一些开发者认为使用它会很强大。在默认情况下,两个连接的套接字之间没有数据发送,除非应用程序有需要发送的数据。这意味着在长期存活的进程中空闲地的接字可能几分钟、几小时、甚至于几天不会提交数据。但是,假设某个客户端崩溃了,并且连接终结序号没有发送给TCP服务器。贵重的资源(例如CPU时间和内存)将会浪费在哪个永远不会响应的客户端上。如果允许keepalive套接字选项,套接字的另一端可以探测以验证它是否仍然是活动的。但是,应用程序不能控制keepalive探测器的发送频率。为了激活keepalive,需要调用Socket.setSoKeepAlive(boolean)方法,参数的值为"true"("false"值将禁止它)。例如,为了在某个套接字上允许keepalive,可能使用下面的代码:<BR><BR>// 激活SO_KEEPALIVE<BR>someSocket.setSoKeepAlive(true);<BR><BR> 尽管keepalive的好处并不多,但是很多开发者提倡在更高层次的应用程序代码中控制超时设置和死的套接字。同时需要记住,keepalive不允许你为探测套接字终点(endpoint)指定一个值。我们建议开发者使用的另一种比keepalive更好的解决方案是修改超时设置套接字选项。<BR><BR> ⑵SO_RCVBUF套接字操作<BR><BR> 接收缓冲区套接字选项控制用于接收数据的缓冲区。你可以通过调用方法改变它的大小。例如,为了把缓冲区大小改变为4096,可以使用下面的代码:<BR><BR>// 修改缓冲区大小<BR>someSocket.setReceiveBufferSize(4096);<BR>注意:修改接收缓冲区大小的请求不能保证改变成功。例如,有些操作系统可能不允许修改这个套接字选项,并忽略对该值的任何改变。你可以调用Socket. getReceiveBufferSize()方法得到当前缓冲区的大小。使用缓冲的更好的选择是使用BufferedInputStream/BufferedReader。<BR><BR> ⑶ SO_SNDBUF套接字操作<BR><BR> 发送缓冲区套接字选项控制用于发送数据的缓冲区的大小。通过调用Socket.setSendBufferSize(int)方法,你能够试图改变缓冲区的大小,但是改变缓冲区大小的请求可能被操作系统拒绝。<BR><BR>// 把发送缓冲区的大小改为4096字节<BR>someSocket.setSendBufferSize(4096);<BR>为了得到当前发送缓冲区的大小,你可以调用Socket.getSendBufferSize()方法,它返回一个整型值。<BR>// 得到默认的大小<BR>int size = someSocket.getSendBufferSize();<BR><BR> 使用DatagramSocket类时改变缓冲区大小可能更有效。当对写进行缓冲的时候,更好的选择是使用BufferedOutputStream和BufferedWriter。<BR><BR> ⑷ SO_LINGER套接字操作<BR><BR> 当某个TCP套接字连接被关闭的时候,可能还有一些数据在队列中等待发送但是还没有被发送(特别是在IP数据报在传输过程中丢失了,必须重新发送的情况下)。Linger(拖延)套接字选项控制未发送的数据可能发送的时间总和,过了这个时间以后数据就会被完全删除。通过使用Socket.setSoLinger(boolean onFlag, int duration)方法完全激活/禁止linger选项、或者修改linger的持续时间都是可以的。<BR><BR>// 激活linger,持续50秒<BR>someSocket.setSoLinger( true, 50 );<BR><BR> ⑸ TCP_NODELAY套接字操作<BR><BR> 这个套接字选项是一个标记,它的状态控制着是否激活Nagle算法(RFC 896)。因为TCP数据是使用IP数据报在网络上发送的,因此每个包都有一定位数的开销(例如IP和TCP头部信息)。如果在某个时刻每个包中只发送了少量的字节,头部信息的大小将远远超过数据的大小。在局域网中,发送的额外的数据可能不会很多,但是在Internet上,成百、成千、甚至于成百万地客户端可能通过某个路由器发送这种数据包,加起来显著地增加了带宽的消耗。<BR><BR> 解决的方法是Nagle算法,它规定TCP在一个时刻只能发送一个数据报。当每个IP数据报得到肯定应答的时候,才能发送新的队列中包含数据的数据报。它限制了数据报头部信息消耗的带宽总量,但是有不太重要的代价--网络延迟。因为数据被排队了,它们不是立即发送的,因此需要快速响应时间的系统(例如X-Windows或telnet)的速度被减慢了。禁止Nagle算法可能提高性能,但是如果被太多的客户端使用,网络性能也会降低。<BR><BR> 可以通过调用Socket.setTcpNoDelay(boolean state)方法激活或禁止Nagle算法。例如,为了禁止该算法,可能使用下面的代码:<BR><BR>// 为了得到更快的响应时间禁止Nagle算法<BR>someSocket.setTcpNoDelay(false);<BR>为了获取Nagle算法的状态和TCP_NODELAY标识符,可以使用Socket.getTcpNoDelay()方法:<BR>// 得到TCP_NODELAY标识符的状态<BR>boolean state = someSocket.getTcpNoDelay();<BR><BR> ⑹ SO_TIMEOUT套接字操作<BR><BR> 超时设置选项是最有用的套接字选项。在默认情况下,I/O操作(基于文件的或基于网络的)都是阻塞的操作。试图从InputStream读取数据将无限期等待直到输入到达。如果输入永远没有到达,应用程序将停止并且在大多数情况下变得不可用(除非使用了多线程)。用户不喜欢不能响应的应用程序,他们认为这类应用程序行为很讨厌。更牢固的应用程序应该预料到这类问题并采取正确的操作。<BR><BR> 注意<BR><BR> 在测试期间的本地内部网环境中网络问题很少,但是在Internet上,应用程序停止是很可能的。服务器应用程序并没有免疫力--服务器也使用Socket类连接客户端,并且很容易停止。因为这个原因,所有的应用程序(无论是客户端或者服务器)都应该温和地处理网络超时的问题。<BR><BR> 当激活SO_TIMEOUT选项时,任何向套接字的InputStream的读取请求都会启动一个计时器。当数据没有按时到达并且计时器超期的时候,就产生java.io.InterruptedIOException异常,你可以捕捉该异常。接着就是应用程序开发者的工作了--可以再次尝试、通知用户或取消连接。可以调用Socket. setSoTimeout(int)方法控制计时器的持续时间,它的参数是等待数据的毫秒数。例如,为了设置5秒钟超时,将使用下面的代码:<BR><BR>// 设置5秒钟超时<BR>someSocket.setSoTimeout ( 5 * 1000 );<BR><BR> 激活设置后,任何读取数据的企图都可能产生InterruptedIOException异常,该异常扩展自java.io.IOException类。由于读取数据的企图可能已经产生了IOException异常,所以不需要更多的代码来处理该异常了--但是,有些应用程序可能希望逐步捕捉与超时设置相关地异常,在这种情况下可能需要添加另外地异常处理代码:<BR><BR>try<BR>{<BR>Socket s = new Socket (...);<BR>s.setSoTimeout ( 2000 ); </P>
<P> </P>
<P>// 执行一些读取操作<BR>}<BR>catch (InterruptedIOException iioe)<BR>{<BR>timeoutFlag = true; // 执行一些操作,例如设置标识符<BR>}<BR>catch (IOException ioe)<BR>{<BR>System.err.println ("IO error " + ioe);<BR>System.exit(0);<BR>}<BR><BR> 为了得到TCP计时器的长度,可以使用Socket.getSoTimeout()方法,它返回一个整型值。如果返回值为零表明超时设定被禁止了,任何读取操作将无限期阻塞。<BR><BR>// 查看超时设定是否为零<BR>if ( someSocket.getSoTimeout() == 0) someSocket.setSoTimeout (500);</P><br><br> </DIV> </TD> </TR> <TR> <TD class=center01> <div align="center">来源:天极网 作者:<div> </TD> <TD width="280" class=center01> <div align="center"> <font color=#0000FF><a href='chapter.php?id=387&volume=2&chapter=4'>上一页</a></font> <font color=#0000FF><a href="serialize.php?id=387">回书目</a></font> <font color=#0000FF><a href='chapter.php?id=387&volume=2&chapter=6'>下一页</a></font> </div> </TD> </TR> </TBODY></TABLE><table><tr><td width="760"> <table width="760" height="10" border="0" cellpadding="0" cellspacing="0"> <tr> <td></td> </tr> </table> <!------------ 评论 ----------------> <table width="760" border="0" cellpadding="0" cellspacing="0"> <tr> <td><iframe width="100%" id=vs frameborder=0 scrolling=no src="comment_list1.php?id=387"></iframe> </td> </tr> </table><br><script language=javascript>function CheckNetwordForm(theForm){ if("" == theForm.content.value) { alert("写两句吧~~"); theForm.content.focus(); return false; } var index; for(index=0;index<theForm.content.value.length;index++) { if(" " != theForm.content.value.charAt(index)) break; } if(index == theForm.content.value.length) { alert("写两句吧~~"); theForm.content.focus(); return false; } if (theForm.content.value.length>100){ alert("评论字数不能超过100哦"); theForm.content.focus(); return false; } return true;}</script> <!------------------ 评论 ---------------> <form name=netword method=post action="insertnetword.php" onsubmit="javascript: return CheckNetwordForm(this);"> <table width="760" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="25" class="text6"> 给此书打分:<a name="1"></a> <select name="score"> <option value=5 selected>非常好</option> <option value=4>还凑合</option> <option value=3>一般吧</option> <option value=2>不太行</option> <option value=1>太差了</option> </select> 用户名: <input name="id" value=387 type="hidden" id="id"> <input name="backurl" value=/book/chapter.php?id=387&volume=2&chapter=5 type="hidden"> <input name="username" type="text" id="username" size="20" maxlength="20"> <font color="#666666">*评论字数请控制在一百字以内</font> </td> </tr> </table> <br> <textarea name="content" cols="80" rows="4" wrap="OFF" id="description"></textarea> <input type="submit" name="Submit" value="提交"> </form> </td> </tr></table></td></tr></table> <TABLE cellSpacing=0 cellPadding=0 width=760 border=0> <TBODY> <TR> <TD width="1003" height=9 background=images/t_bj01.gif><IMG height=1 src="images/ccc.gif" width=1></TD> </TR> </TBODY></TABLE><TABLE cellSpacing=0 cellPadding=0 width=760 bgColor=#ffffff border=0> <TBODY> <TR> <TD><HR width=760 noShade SIZE=1> </TD> </TR> <TR> <TD align=middle><A class=black href="http://www.chinaren.com/" target=_blank>ChinaRen</A> - <A class=black href="http://big5.www.sohu.com/" target=_blank>繁体版</A> - <A class=black href="http://hr.sohu.com/hrm.html" target=_blank>搜狐招聘</A> - <A class=black href="http://add.sohu.com/" target=_blank>网站登录</A> - <A class=black href="http://help.sohu.com/" target=_blank>帮助中心</A> - <A class=black href="http://book.news.sohu.com/onClick=this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.sohu.com');return" target=_blank false;>设置首页</A> - <A class=black href="http://adinfo.sohu.com/" target=_blank>广告服务</A> - <A class=black href="http://www.sohu.com/about/lianxi.htm" target=_blank>联系方式</A> - <A class=black href="http://www.sohu.com/about/privacy.html" target=_blank>保护隐私权</A> - <A class=black href="http://www.sohu.com/about/" target=_blank>About SOHU</A> - <A class=black href="http://www.sohu.com/about/" target=_blank>公司介绍</A><BR> <SPAN class=eng>Copyright © 2004 Sohu.com Inc. All rights reserved. 搜狐公司 版权所有</SPAN> </TD> </TR> </TBODY></TABLE></center></body></html><script language="JavaScript" src="http://nielsen.js.sohu.com/nnselect.js"></script><noscript><img src='http://ping.nnselect.com/ping.gif?c=119' height='1' width='1'></noscript>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -