📄 chapter17.htm
字号:
}.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=3'>上一页</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=5'>下一页</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网络编程之传输控制协议(二2)</div> <DIV style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%" align=left> <br> <P>1、建立套接字<BR><BR> 在正常环境下,建立套接字的时候它就连接了某台计算机和端口。尽管有一个空的构造函数,它不需要主机名称或端口,但是它是受保护的(protected),在正常的应用程序中不能够调用它。此外,不存在用于在以后指定这些细节信息的connect()方法,因此在正常的环境下建立套接字的时候就应该连接了。如果网络是好的,在建立连接的时候,调用套接字构造函数将立即返回,但是如果远程计算机没有响应,构造函数方法可能会阻塞一段时间。这是随着系统的不同而不同的,它依赖于多种因素,例如正在使用的操作系统和默认的网络超时设置(例如本地局域网中的一些计算机一般比Internet上的计算机响应得快)。你甚至不能肯定套接字将阻塞多长的时间,但是这是非正常的行为,并且它不会频繁出现。即使如此,在关键事务系统中把此类调用放在第二个线程中或许更合适,这样可以防止应用程序停止。<BR><BR> 注意<BR><BR> 在较低的层次,套接字是由套接字产生组件(socket factory)产生的,它是一个负责建立适当的套接字实现的特殊的类。在正常环境下,将会产生标准的java.net.Socket,但是在一些特殊的情形中,例如使用自定义套接字的特殊的网络环境(例如通过使用特殊的代理服务器穿透防火墙),套接字产生组件实际上可能返回一个套接字子类(subclass)。对于错综复杂的Java网络编程比较熟悉,明确为了建立自定义套接字和套接字产生组件的有经验的开发者可以去了解套接字产生组件的细节信息。对于这个主题的更多信息,你可以查看java.net.SocketFactory和java.net.SocketImplFactory类的Java API文档。<BR><BR> 2、使用套接字<BR><BR> 套接字可以执行大量的事务,例如读取信息、发送数据、关闭连接、设置套接字选项等等。此外,下面提供的方法可以获取套接字的信息(例如地址和端口位置):<BR><BR> 方法<BR><BR> · void close()产生java.io.IOException异常--关闭套接字连接。关闭连接可能允许也可能不允许继续发送剩余的数据,这依赖于SO_LINGER套接字选项的设定。我们建议开发者在关闭套接字连接之前清除所有的输出流。<BR><BR> · InetAddress getInetAddress()--返回连接到套接字的远程主机的地址。<BR><BR> · InputStream getInputStream()产生java.io.IOException异常--返回一个输入流,它从该套接字连接到的应用程序读取信息。<BR><BR> · OutputStream getOutputStream()产生java.io.IOException异常--返回一个输出流,它向套接字连接到的应用程序写入信息。<BR><BR> · boolean getKeepAlive()产生java.net.SocketException异常--返回SO_KEEPALIVE套接字选项的状态。<BR><BR> · InetAddress getLocalAddress()--返回与套接字关联的本地地址(在多地址计算机中有用)。<BR><BR> · int getLocalPort()--返回该套接字绑定在本地计算机上的端口号。<BR><BR> · int getPort()--返回套接字连接到的远程服务的端口号。<BR><BR> · int getReceiveBufferSize()产生java.net.SocketException异常--返回套接字使用的接收缓冲区大小,由SO_RCVBUF套接字选项的值决定。<BR><BR> · int getSendBufferSize()产生java.net.SocketException异常--返回套接字使用的发送缓冲区大小,由SO_SNDBUF套接字选项的值决定。<BR><BR> · int getSoLinger()产生java.net.SocketException异常--返回SO_LINGER套接字选项的值,它控制连接终止的时候未发送的数据将排队多长时间。<BR> <BR> · int getSoTimeout()产生java.net.SocketException异常--返回SO_TIMEOUT套接字选项的值,它控制读取操作将阻塞多少毫秒。如果返回值为0,计时器就被禁止了,该线程将无限期阻塞(直到数据可以使用或流被终止)。<BR><BR> · boolean getTcpNoDelay()产生java.net.SocketException异常--如果TCP_NODELAY套接字选项的设置打开了返回"true",它控制是否允许使用Nagle算法。<BR><BR> · void setKeepAlive(boolean onFlag)产生java.net.SocketException异常--允许或禁止SO_KEEPALIVE套接字选项。<BR><BR> · void setReceiveBufferSize(int size)产生java.net.SocketException异常--修改SO_RCVBUF套接字选项的值,它为操作系统的网络代码推荐用于接收输入的数据的缓冲区大小。并不是每种系统都支持这种功能或允许绝对控制这个特性。如果你希望缓冲输入的数据,我们建议你改用BufferedInputStream或BufferedReader。<BR><BR> · void setSendBufferSize(int size)产生java.net.SocketException异常--修改SO_SNDBUF套接字选项的值,它为操作系统的网络代码推荐用于发送输入的数据的缓冲区大小。并不是每种系统都支持这种功能或允许绝对控制这个特性。如果你希望缓冲输入的数据,我们建议你改用BufferedOutputStream或Buffered Writer。<BR><BR> · static void setSocketImplFactory (SocketImplFactory factory)产生java.net.SocketException、java.io.IOException、java. lang.SecurityException异常--为JVM指定一个套接字实现的产生组件,它可以已经存在,也可能违反了安全性约束条件,无论是哪种情况都会产生异常。只能指定一个产生组件,当建立套接字的时候都会使用这个产生组件。<BR><BR> · void setSoLinger(boolean onFlag, int duration)产生java.net. SocketException、java.lang.IllegalArgumentException异常--激活或禁止SO_LINGER套接字选项(根据布尔型参数onFlag的值),并指定按秒计算的持续时间。如果指定负值,将产生异常。<BR><BR> · void setSoTimeout(int duration)产生java.net.SocketException异常--修改SO_TIMEOUT套接字选项的值,它控制读取操作将阻塞多长时间(按毫秒计)。0值会禁止超时设置,引起无限期阻塞。如果发生了超时,当套接字的输入流上发生读取操作的时候,会产生java.io.IOInterruptedException异常。这与内部的TCP计时器是截然不同的,它触发未知报文包的重新发送过程。<BR><BR> · void setTcpNoDelay(boolean onFlag)产生java.net.SocketException异常--激活或禁止TCP_NODELAY套接字选项,它决定是否使用Nagle算法。<BR><BR> · void shutdownInput()产生java.io.IOException异常--关闭与套接字关联的输入流,并删除所有发送的更多的信息。对输入流的进一步的读取将会遭遇流的结束标识符。<BR><BR> · void shutdownOutput()产生java.io.IOException异常--关闭与套接字关联的输出流。前面写入的、但没有发送的任何信息将被清除,紧接着是TCP连接终止,它通知应用程序没有更多的数据可以使用了(在Java应用程序中,这样就到达了流的末尾)。向套接字进一步写入信息将引起IOException异常。<BR><BR> 3、 向TCP套接字读取和写入信息<BR><BR> 在Java中使用TCP建立用于通讯的客户端软件极其简单,无论使用哪种操作系统都一样。Java网络API提供了一致的、平台无关的接口,它允许客户端应用程序连接到远程服务。一旦建立了套接字,它就已经连接了并准备使用输入和输出流读取/写入信息了。这些流都不需要建立,它们是Socket. getInputStream()和Socket.getOutputStream()方法提供的。<BR><BR> 为了简化编程,过滤器可以很容易地连接到套接字流。下面的代码片断演示了一个简单的TCP客户端,它把BufferedReader连接到套接字输入流,把PrintStream连接到套接字输出流。<BR><BR>try<BR>{<BR>// 把套接字连接到某台主机和端口<BR>Socket socket = new Socket ( somehost, someport ); </P>
<P> </P>
<P>// 连接到被缓冲地读取程序<BR>BufferedReader reader = new BufferedReader ( <BR>new InputStreamReader ( socket.getInputStream() ) );</P>
<P>// 连接到打印流<BR>PrintStream pstream = <BR>new PrintStream( socket.getOutputStream() );<BR>}<BR>catch (Exception e)<BR>{<BR>System.err.println ("Error - " + e);<BR>}<BR></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=3'>上一页</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=5'>下一页</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=4 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 + -