100165789.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 684 行 · 第 1/3 页
HTM
684 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
31.5 较低层的协议
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165789.htm">
31.5 较低层的协议
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165789.htm'><font color='red'>31.5 较低层的协议</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165785.htm'>31.4 实用工具类</a></div><div style='float:right;width:49%'>·<a href='100165786.htm'>31.4.1 URI</a></div><div style='float:left;width:49%'>·<a href='100165787.htm'>31.4.2 IP地址和DNS名称</a></div><div style='float:right;width:49%'>·<a href='100165790.htm'>31.6 小结</a></div><div style='float:left;width:49%'>·<a href='100165791.htm'>32.1 Windows服务</a></div><div style='float:right;width:49%'>·<a href='100165792.htm'>32.2 Windows服务的体系结构</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style='margin-top:11.4pt;margin-right:0cm;FTEL:11.4pt;margin-left:
0cm'><a FTEL="_Toc535009266"></a><a FTEL="_Toc507815538"><span lang=EN-US>31.5 </span></a><span
style='font-family:楷体_GB2312'>较低层的协议</span></h3>
<p class=MsoNormal><span style='font-family:宋体'>本节简要介绍一些在较低层次上进行通信的</span><span
lang=EN-US>.NET</span><span style='font-family:宋体'>类。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>网络的通信分为几个不同的层次,本章迄今为止讨论的类都是工作在最高层,即处理某些命令的一层。如果考虑使用</span><span
lang=EN-US>FTP</span><span style='font-family:宋体'>传输文件,这个概念就非常容易理解,目前的</span><span
lang=EN-US>GUI</span><span style='font-family:宋体'>应用程序隐藏了许多</span><span
lang=EN-US>FTP </span><span style='font-family:宋体'>细节,但在命令行上执行</span><span
lang=EN-US>FTP</span><span style='font-family:宋体'>还是不久之前的事。在这个环境中,我们显式地键入一些要发送至服务器的命令,以进行下载、上传和列出文件。</span></p>
<p class=MsoNormal><span lang=EN-US>FTP</span><span style='font-family:宋体'>并不是依赖于文本命令的惟一高层协议,</span><span
lang=EN-US>HTTP</span><span style='font-family:宋体'>、</span><span lang=EN-US>SMTP</span><span
style='font-family:宋体'>、</span><span lang=EN-US>POP</span><span
style='font-family:宋体'>和其他的协议都基于相似的行为类型,许多现代的图形工具隐藏了命令的传输过程,因此用户一般意识不到这些命令的存在。例如,在</span><span
lang=EN-US>Web</span><span style='font-family:宋体'>浏览器中键入</span><span
lang=EN-US>URL</span><span style='font-family:宋体'>时、</span><span lang=EN-US>Web</span><span
style='font-family:宋体'>请求发送给服务器时,浏览器实际上发送给服务器的是一个纯文本的</span><span lang=EN-US>GET</span><span
style='font-family:宋体'>命令,这个命令与</span><span lang=EN-US>FTP</span><span
style='font-family:宋体'>的</span><span lang=EN-US>get</span><span
style='font-family:宋体'>命令相似。此外,浏览器也可以发送</span><span lang=EN-US>POST</span><span
style='font-family:宋体'>命令,要求浏览器在请求上附有其他的数据。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>但是,这些协议本身都不足以实现计算机之间的通信。即使客户和服务器都理解某个协议,例如</span><span
lang=EN-US>HTTP</span><span style='font-family:宋体'>,它们仍然不能互相理解对方,除非另外有协议说明字符是如何传输的,使用的是什么二进制格式,什么电压用于代表二进制数据中的</span><span
lang=EN-US>0</span><span style='font-family:宋体'>和</span><span lang=EN-US>1</span><span
style='font-family:宋体'>?这些问题都需要协议规定它们,网络领域的开发人员和硬件工程师通常要查阅协议栈。在列出两个主机进行通信所需的各种协议和机制时,就创建了一个协议栈,其中既有最高层的协议,也有最低层的协议。这种方法利用模块化和分层的方式获得了很有效的通信。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>幸运的是,对于大多数的开发工作而言,我们都不需要使用协议堆栈或处理电压级别。但是,如果要编写代码,以便在计算机之间进行高效率的通信,则需要编写的代码可以直接在计算机之间传送二进制数据包。这是</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>之类协议的领域,</span><span
lang=EN-US>Microsoft</span><span style='font-family:宋体'>提供的许多类都允许方便地使用该层次上的二进制数据来工作。</span></p>
<h3 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;margin-left:
0cm'><a FTEL="_Toc535009267"></a><a FTEL="_Toc507815539"><span
style='font-family:黑体'>低层类</span></a></h3>
<p class=MsoNormal><span lang=EN-US>System.Net.Sockets</span><span
style='font-family:宋体'>命名空间包含一些相关类,允许直接发送</span><span lang=EN-US>TCP</span><span
style='font-family:宋体'>网络请求或在某个端口监听</span><span lang=EN-US>TCP</span><span
style='font-family:宋体'>网络请求。其中主要的类如表</span><span lang=EN-US>31-1</span><span
style='font-family:宋体'>所示。</span></p>
<p class=a5 style='margin-top:8.15pt'><span style='font-family:黑体'>表</span><span
lang=EN-US> 31-1</span></p>
<div align=center>
<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 width=588
style='width:440.85pt;margin-left:39.15pt;border-collapse:collapse;border:
none'>
<tr>
<td width=119 valign=top style='width:89.55pt;border:solid windowtext 1.0pt;
border-left:none;padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a2><span style='font-family:黑体'>类</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border-top:solid windowtext 1.0pt;
border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a2><span style='font-family:黑体'>用</span><span lang=EN-US>
</span><span style='font-family:黑体'>途</span></p>
</td>
</tr>
<tr>
<td width=119 valign=top style='width:89.55pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span lang=EN-US>Socket</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border:none;border-bottom:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span style='font-family:宋体'>这个低层的类用于管理连接。</span><span
lang=EN-US>WebRequest</span><span style='font-family:宋体'>、</span><span
lang=EN-US>TcpClient</span><span style='font-family:宋体'>和</span><span
lang=EN-US>UdpClient</span><span style='font-family:宋体'>等类在内部使用这个类</span></p>
</td>
</tr>
<tr>
<td width=119 valign=top style='width:89.55pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span
lang=EN-US>NetworkStream</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border:none;border-bottom:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span style='font-family:宋体'>这个类是从</span><span
lang=EN-US>Stream </span><span style='font-family:宋体'>派生出来的,它表示来自网络的数据流</span></p>
</td>
</tr>
<tr>
<td width=119 valign=top style='width:89.55pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span
lang=EN-US>TcpClient</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border:none;border-bottom:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span style='font-family:宋体'>允许创建和使用</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>连接</span></p>
</td>
</tr>
<tr>
<td width=119 valign=top style='width:89.55pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span lang=EN-US>TcpListener</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border:none;border-bottom:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span style='font-family:宋体'>允许监听传入的</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>连接请求</span></p>
</td>
</tr>
<tr>
<td width=119 valign=top style='width:89.55pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span lang=EN-US>UdpClient</span></p>
</td>
<td width=468 valign=top style='width:351.3pt;border:none;border-bottom:solid windowtext 1.0pt;
padding:0cm 9.9pt 0cm 9.9pt'>
<p class=a4 style='margin-left:10.7pt'><span style='font-family:宋体'>用于为</span><span
lang=EN-US>UDP</span><span style='font-family:宋体'>客户创建连接</span><span
lang=EN-US>(UDP</span><span style='font-family:宋体'>是另一种</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>协议,但没有得到广泛的使用,主要用于本地网络</span><span
lang=EN-US>)</span></p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal><a FTEL="_Toc535009268"></a><a FTEL="_Toc507815540"><span
lang=EN-US style='color:black'> </span></a></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>1. </span><span
style='font-family:黑体'>使用</span><span lang=EN-US>TCP</span><span
style='font-family:黑体'>类</span></h4>
<p class=MsoNormal><a FTEL=tcp><span style='font-family:宋体'>传输控制协议</span><span
lang=EN-US>(TCP)</span></a><span style='font-family:宋体'>类为连接和发送两个点之间的数据提供了简单的方法。端点是</span><span
lang=EN-US>IP</span><span style='font-family:宋体'>地址和端口号的组合。现有的协议很好地定义了端口号,例如,</span><span
lang=EN-US>HTTP</span><span style='font-family:宋体'>使用端口</span><span lang=EN-US>80</span><span
style='font-family:宋体'>,而</span><span lang=EN-US>SMTP</span><span
style='font-family:宋体'>使用端口</span><span lang=EN-US>25</span><span
style='font-family:宋体'>,</span><span lang=EN-US>Internet Assigned Number
Authority(</span><span style='font-family:宋体'>即</span><span lang=EN-US>IANA</span><span
style='font-family:宋体'>,</span><span lang=EN-US>http://www.iana.org/)</span><span
style='font-family:宋体'>把端口号赋予这些已知的服务。除非执行某个已知的服务,否则应选择</span><span lang=EN-US>1024</span><span
style='font-family:宋体'>以上的端口号。</span></p>
<p class=MsoNormal><span lang=EN-US>TCP</span><span style='font-family:宋体'>数据流构成了目前</span><span
lang=EN-US>Internet</span><span style='font-family:宋体'>上的主要传输流。</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>通常是首选的协议,因为它提供了有保证的传输、错误校正和缓存。</span><span
lang=EN-US>TcpClient</span><span style='font-family:宋体'>类封装了</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>连接,提供了许多属性来控制连接,包括缓存、缓存器的大小和超时。通过</span><span
lang=EN-US>GetStream()</span><span style='font-family:宋体'>方法请求</span><span
lang=EN-US>NetworkStream</span><span style='font-family:宋体'>对象时可以附带读写功能。</span></p>
<p class=MsoNormal><span lang=EN-US>TcpListener</span><span style='font-family:
宋体'>类用</span><span lang=EN-US>Start()</span><span style='font-family:宋体'>方法监听传入的</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>连接。当连接请求到达时,可以使用</span><span
lang=EN-US>AcceptSocket()</span><span style='font-family:宋体'>方法返回一个套接字,以与远程机器通信,或使用</span><span
lang=EN-US>AcceptTcpClient()</span><span style='font-family:宋体'>方法通过高层的</span><span
lang=EN-US>TcpClient</span><span style='font-family:宋体'>对象进行通信。阐明</span><span
lang=EN-US>TcpListener </span><span style='font-family:宋体'>和</span><span
lang=EN-US> TcpClient</span><span style='font-family:宋体'>类如何工作的最简单的方式是举一个示例。</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>2. TcpSend</span><span
style='font-family:黑体'>和</span><span lang=EN-US>TcpReceive</span><span
style='font-family:黑体'>示例</span></h4>
<p class=MsoNormal><a FTEL=tcpex><span style='font-family:宋体'>为了说明这两个类,需要建立两个应用程序。第一个应用程序是</span><span
lang=EN-US>TcpSend</span></a><span style='font-family:宋体'>客户应用程序,如图</span><span
lang=EN-US>31-8</span><span style='font-family:宋体'>所示。这个应用程序打开一个到服务器的</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>连接,并为它自己发送</span><span
lang=EN-US>C#</span><span style='font-family:宋体'>源代码。</span></p>
<p align=center style='margin-top:3.25pt'><span lang=EN-US><img width=174
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?