chapter14.htm
来自「这是一个学写JAVA的好东西」· HTM 代码 · 共 461 行 · 第 1/2 页
HTM
461 行
}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=1&chapter=14'>上一页</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=2'>下一页</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网络编程之传输控制协议(一1)</div> <DIV style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; COLOR: black; LINE-HEIGHT: 180%" align=left> <br> <P>传输控制协议是一种基于流的网络通讯方法,它与其它的任何协议都有很大的不同。本文讨论TCP流以及在Java中怎样操作它。<BR><BR> <STRONG>一、概述<BR></STRONG><BR> TCP提供的网络通讯接口与用户数据报协议(UDP)截然不同。TCP的特性使网络编程很具魅力,而且它删除了UDP的很多干扰部分(例如数据包的排序和丢失),简化了网络通讯。UDP关心的是数据包的传输,而TCP关注的是建立网络连接,并在网络连接中发送和接收字节流。</P>
<P> 数据包可以通过网络用多种方法发送,并且它们到达的时间可能不同。这有利于性能的提高和程序的健壮性,因为单个包的丢失不一定干扰其它包的传输。但是,这样的系统使程序员必须作更多的工作,他们必须保证数据的送达(delivery)。TCP通过对发送和次序的保证消除了这些额外的工作,为客户端和支持两路(two-way)通讯的服务器之间提供了可靠的字节通讯流。它在两台计算机之间建立了"虚拟连接",可以通过虚拟连接发送数据流。<BR></P>
<P align=center><BR><IMG src="/book/images/upload/1100139557-1.jpg" align=baseline border=0><BR>图1:TCP建立虚拟连接传输数据<BR></P>
<P><BR> TCP使用更低层的(lower-level)的IP通讯协议在两台计算机之间建立连接。这种连接提供了一个允许字节流发送和接收的接口,并且采用透明的方式把数据转换为IP数据报。数据报(datagram)的问题之一是不能保证数据包到达目的地。TCP解决了这个问题,它提供了有保证的数据字节的送达。当然,网络错误影响了送达也是可能的,但是TCP通过类似重新发送数据包解决了这种实现的问题,并且只在情况很严重(例如没有到网络主机的路由或连接丢失了)的时候才提醒程序员。</P>
<P><SPAN class=f14> 两台计算机之间的虚拟连接表现为套接字(socket)。套接字允许数据的发送和接收,但是UDP套接字和TCP套接字之间有本质的区别。首先TCP套接字连接到单个计算机,然而UDP套接字可以向多台计算机传输或接收数据;其次,UDP套接字只能发送和接收数据包,然而TCP允许通过字节流的数据传输(表现为输入流(InputStream)和输出流(OutputStream))。为了在网络上传输,它们被转换为数据包,不需要程序员干涉(如图2所示)。<BR></SPAN></P><SPAN class=f14>
<P align=center><BR><IMG src="/book/images/upload/1100139563-2.jpg" align=baseline border=0><BR>图2:TCP把数据流处理为协议的命令,但是为在网络上传输把流转换为IP数据报<BR></P>
<P><BR> 1、 UDP(用户数据报协议)上的TCP的优点<BR><BR> ⑴自动化地错误控制<BR><BR> TCP流上的数据传输比通过UDP的信息包的传输更可靠。在TCP下层,通过虚拟连接发送的数据包括一个检查机制以确保它们没有被破坏(与UDP类似)。但是,TCP保证了数据的送达--在传输过程中丢失的数据包将被重新传输。<BR><BR> 你也许想知道这是如何实现的--实际上,IP和UDP不保证送达,当数据包丢失的时候它们也不会发出任何警告。在TCP使用数据包发送了某个数据集合的时候就会启动一个计时器。在UDP中,我们使用 DatagramSocket.setSoTimeout为receive()操作启动一个计时器。在TCP中,如果接收者发送一个肯定的应答就禁止计时器,但是如果在超时前还没有收到肯定的应答,数据包就被重新传输。这意味着写入某个TCP套接字的任何数据将到达另一方而不需要程序员的进一步干涉(除非发生大的事故造成整个网络瘫痪)。错误控制的代码都由TCP处理了。<BR><BR> ⑵可靠性<BR><BR> 因为在TCP连接中有多方参与的两台计算机之间发送的数据通过IP数据报传输,数据包到达的次序可能经常出现不同。这可能需要使用一个循环从TCP套接字读取信息,因为字节流的次序可能被打乱并且频繁遇到不可靠的问题。幸运的是,次序等问题已经被TCP处理好了--每一个数据包都包含一个用于排序的序列号。后发送、先到达的数据包将保持在一个队列中,直到排好次序的数据可以使用为止。接着数据就可以通过套接字的接口传递到应用程序中。<BR><BR> ⑶易于使用<BR><BR> 尽管把信息存储为数据包的确没有超越程序员的范围,但这不会是计算机之间通讯的最高效率的途径。还应该有另外一些的复杂性,你可以讨论在某个底线之上设计和建立软件,为程序员提供足够的复杂性。典型情况下开发者欢迎软件开发复杂性的降低,TCP就实现了这种功能。TCP允许程序员用一种完全不同的方式思考问题,而这种方式更加现代化。数据不是被处理为不连续的单元(数据报包),而是被处理为连续的流,就像目前读者所熟悉的I/O流。TCP套接字延续了传统的Unix编程,在Unix编程中通讯与文件输入和输出是一样处理的。无论开发者写入网络套接字、通讯管道、数据结构、用户控制台或文件的时候,这种机制都时相同的。当然它也同样应用与读取信息。这使得通过TCP套接字进行通讯比通过数据报包通讯更加简单。<BR><BR> 2、使用端口在应用程序之间通讯<BR><BR> 很明显,TCP与UDP之间差别巨大,但是在两种协议之间也有一项重要的相似性。两种都共享了通讯端口的概念,它可以区别各个应用程序。在相同的端口上可以运行多个服务和客户端,而且希望不给它们分配端口号而挑选出某个应用程序是不可能的。当TCP套接字建立到某台计算机的连接的时候,它需要两部分非常重要的信息才能连接到远程客户端--该计算机的IP地址和端口号。此外,本地的IP地址和端口号也将绑定到它上面,因此远程计算机能够识别是哪一个应用程序建立了连接(图3所示)。总之,你不会希望你自己的电子邮件被在相同系统上运行软件的其它用户访问。<BR></P>
<P align=center><BR><IMG src="/book/images/upload/1100139568-3.jpg" align=baseline border=0><BR>图3:本地端口识别了其它程序建立的到某个应用程序的连接,<BR></P>
<P><BR> 允许多个TCP应用程序在同一台计算机上运行<BR><BR> TCP中的端口与UDP中的端口相似--它们的数字范围都是1-65535。1024以下的端口是受限制的,只能被知名的服务(例如HTTP、FTP、SMTP、POP3和telnet)使用。表1列举了一些知名的服务以及与它们对应的端口。<BR><BR> 表1:协议和与它们相关的端口<BR><BR>知名的服务 服务端口<BR>Telnet 23<BR>SMTP(简单邮件传输协议) 25<BR>HTTP(超文本传输协议) 80<BR>POP 3 110 </P>
<P> 3、套接字操作<BR><BR> TCP套接字可以执行多种操作,包括:<BR><BR> 建立到某个远程主机的连接。<BR> 给远程主机发送数据。<BR> 从远程主机接收数据。<BR> 关闭连接。<BR><BR> 此外还有一些特殊类型的套接字,它们提供绑定到特定端口号的服务。这类套接字通常用在服务器中,可以执行下面一些操作:<BR><BR> 绑定到某个本地端口<BR> 从远程主机接收输入的连接<BR> 从本地端口取消绑定。<BR><BR> 这两种套接字可以被分为不同的类,要么是客户端使用的,要么是服务器使用的(由于某些客户端可以象服务器一样操作,还有些服务器可以象客户端一样操作)。但是,客户端和服务器的角色还是可以靠经验区分的。</SPAN></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=1&chapter=14'>上一页</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=2'>下一页</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=1 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 + =
减小字号Ctrl + -
显示快捷键?