﻿<?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>教师博客-阿土仔的世界</title><link>http://www.teachblog.net/tangzz/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 16 Mar 2010 10:23:10 GMT</lastBuildDate><pubDate>Tue, 16 Mar 2010 10:23:10 GMT</pubDate><ttl>60</ttl><item><title>Visual C# HTTP协议开发</title><link>http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Thu, 30 Nov 2006 01:05:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3458.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3458.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3458.html</trackback:ping><description><![CDATA[
		<h1>Visual C# HTTP协议开发</h1>
		<ol>
				<li>HTTP协议简介 
<ol type="i"><li><a href="#11">HTTP协议简介</a></li><li><a href="#12">HTTP的请求</a></li><li><a href="#13">HTTP的响应</a></li></ol></li>
				<li>与HTTP相关类的简介 
<ol type="i"><li><a href="#21">WebRequest类</a></li><li><a href="#22">WebResponse类</a></li><li><a href="#23">HttpWebRequest类</a></li><li><a href="#24">HttpWebResponse类</a></li><li><a href="#25">Uri类</a></li></ol></li>
		</ol>
		<h2 class="title1">HTTP协议简介</h2>
		<h3 class="title2">
				<a name="11">
				</a>HTTP协议简介</h3>
		<p align="left">在TCP/IP体系结构中，HTTP属于应用层协议，位于TCP/IP协议的顶层。浏览Web时，浏览器通过HTTP协议与Web服务器交换信息。这些信息（文档）类型的格式由MIME定义。</p>
		<p align="left">HTTP协议具有以下的特点： </p>
		<ol>
				<li>HTTP按客户/服务器模式工作<br />HTTP支持客户（一般情况是浏览器）与服务器的通讯，相互传输数据。<br />HTTP定义的事务处理由以下四步组成： 
<ul><li>客户与服务器建立连接； 
</li><li>客户向服务器提出请求； 
</li><li>如果请求被接受，则服务器送回响应，在响应中包括状态码和所需的文件； 
</li><li>客户与服务器断开连接 </li></ul><table width="75%"><tbody><tr bgcolor="#ccccff"><td bgcolor="#ccccff"><i>一次HTTP操作称为一次<font color="#ff0000">事务</font>（<font color="#0000ff">transaction</font>）。</i></td></tr></tbody></table></li>
				<li>HTTP是无状态的<br />也就是说，浏览器和服务器每进行一次HTTP操作，就建立一次连接，但任务结束就中断连接。 
</li>
				<li>HTTP使用元信息作为头标<br />HTTP对所有事务都加了<font color="#ff0000">头标</font>（<font color="#0000ff">header</font>）。也就是说，在主要数据前加上一块信息，称为<font color="#ff0000">元信息</font>（<font color="#0000ff">metainformation</font>）。它使服务器能够提供正在传送数据的有关信息。例如，传送对象是哪种类型，是用哪种语言书写的等。<br />从功能上讲，HTTP支持四类元信息：一般信息头标、请求头标、响应头标和实体头标。 
</li>
				<li>HTTP支持两种请求和响应格式<br />HTTP由不同的两部分组成，一是从浏览器发往服务器的请求，二是服务器对客户的响应。<br />HTTP支持两种请求和响应，即简单请求与完全请求和简单响应与完全响应。 
</li>
				<li>HTTP是基于文本的简单协议 </li>
		</ol>
		<h3 class="title2">
				<a name="12">
				</a>HTTP的请求 </h3>
		<p>HTTP的常用请求方法：</p>
		<table width="85%" border="1">
				<tbody>
						<tr>
								<td width="32%">
										<b>方 法</b>
								</td>
								<td width="68%">
										<b>说 明</b>
								</td>
						</tr>
						<tr>
								<td width="32%">GET</td>
								<td width="68%">请求读取一个Web页面</td>
						</tr>
						<tr>
								<td width="32%">HEAD</td>
								<td width="68%">请求读取一个Web页面的头标</td>
						</tr>
						<tr>
								<td width="32%">PUT</td>
								<td width="68%">请求存储一个Web页面</td>
						</tr>
						<tr>
								<td width="32%">POST</td>
								<td width="68%">附加到命名资源中</td>
						</tr>
						<tr>
								<td width="32%">DELETE</td>
								<td width="68%">删除Web页面</td>
						</tr>
						<tr>
								<td width="32%">LINK</td>
								<td width="68%">连接两个已有资源</td>
						</tr>
						<tr>
								<td width="32%">UNLINK</td>
								<td width="68%">取消两个资源之间的已有连接</td>
						</tr>
				</tbody>
		</table>
		<p>HTTP请求的格式如下所示：</p>
		<div class="code">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">＜request-line＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜headers＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜blank line＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />[＜request-body＞]</span>
				</div>
		</div>
		<p>在HTTP请求中，第一行必须是一个请求行（request line），用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部（header）小节，用来说明服务器要使用的附加信息。在首部之后是一个空行，再此之后可以添加任意的其他数据[称之为主体（body）]。<br />在HTTP中，定义了大量的请求类型，不过Ajax开发人员关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL，浏览器就将基于该URL向服务器发送一个GET请求，以告诉服务器获取并返回什么资源。对于<a href="http://www.wzu.edu.cn/">www.wzu.edu.cn</a>的GET请求如下所示：</p>
		<div class="code">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">GET / HTTP/1.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Host: www.wzu.edu.cn <br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Gecko/20050225 Firefox/1.0.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Connection: Keep-Alive </span>
				</div>
		</div>
		<p>请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠（/），用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本（另一个可选项是1.0）。那么请求发到哪里去呢？这就是第二行的内容。<br />第2行是请求的第一个首部，HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠（/），可以通知服务器请求的是www.wzu.edu.cn/（HTTP 1.1才需要使用首部HOST，而原来的1.0版本则不需要使用）。第三行中包含的是首部User-Agent，服务器端和客户端脚本都能够访问它，它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义（在本例中是Firefox 1.0.1），并且在每个请求中将自动发送。最后一行是首部Connection，通常将浏览器操作设置为Keep-Alive（当然也可以设置为其他值，但这已经超出了本书讨论的范围）。注意，在最后一个首部之后有一个空行。即使不存在请求主体，这个空行也是必需的。</p>
		<p>如果要获取一个诸如http://www.wzu.edu.cn/books的www.wzu.edu.cn域内的页面，那么该请求可能类似于：<br /></p>
		<div class="code">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">GET /books/ HTTP/1.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Host: www.wzu.edu.cn<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Gecko/20050225 Firefox/1.0.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Connection: Keep-Alive</span>
				</div>
		</div>
		<p>注意只有第一行的内容发生了变化，它只包含URL中www.wzu.edu.cn后面的部分。</p>
		<p>要发送GET请求的参数，则必须将这些额外的信息附在URL本身的后面。其格式类似于：<br /></p>
		<div class="code">URL ? name1=value1&amp;name2=value2&amp;..&amp;nameN=valueN</div>
		<br />该信息称之为查询字符串（query string），它将会复制在HTTP请求的请求行中，如下所示：<br /><div class="code"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">GET /books/?name=Professional%20Ajax HTTP/1.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Host: www.wzu.edu.cn<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Gecko/20050225 Firefox/1.0.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Connection: Keep-Alive</span></div></div><p>另一方面，POST请求在请求主体中为服务器提供了一些附加的信息。通常，当填写一个在线表单并提交它时，这些填入的数据将以POST请求的方式发送给服务器。</p><p>以下就是一个典型的POST请求：<br /></p><div class="code"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">POST / HTTP/1.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Host: www.wzu.edu.cn<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Gecko/20050225 Firefox/1.0.1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Content-Type: application/x-www-form-urlencoded<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Content-Length: 40<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Connection: Keep-Alive<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />name=Professional%20Ajax</span><span style="COLOR: #ff0000">&amp;publisher</span><span style="COLOR: #000000">=Wiley</span></div></div><p>从上面可以发现， POST请求和GET请求之间有一些区别。首先，请求行开始处的GET改为了POST，以表示不同的请求类型。你会发现首部Host和User-Agent仍然存在，在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据，这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部Connection后是一个空行，再后面就是请求主体。与大多数浏览器的POST请求一样，这是以简单的“名称—值”对的形式给出的，其中name是Professional Ajax，publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。</p><p>正如前面所提到的，还有其他的HTTP请求类型，它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。</p><h3>HTTP响应</h3><p>如下所示，HTTP响应的格式与请求的格式十分类似：<br /></p><div class="code"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">＜status-line＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜headers＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜blank line＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />[＜response-body＞]</span></div></div><p>正如你所见，在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行（status line）通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子： <br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">HTTP/1.1 200 OK<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Date: Sat, 31 Dec 2005 23:59:59 GMT<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Content-Type: text/html;charset=ISO-8859-1<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />Content-Length: 122<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜html＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜head＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜title＞Wrox Homepage＜/title＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜/head＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜body＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜!-- body goes here --＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜/body＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />＜/html＞<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br /></p><p>在本例中，状态行给出的HTTP状态代码是200，以及消息OK。状态行始终包含的是状态码和相应的简短消息，以避免混乱。最常用的状态码有：</p><ul><li>200 (OK): 找到了该资源，并且一切正常。 
</li><li>304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。 
</li><li>401 (UNAUTHORIZED):<b></b>客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码，以登录到服务器。 
</li><li>403 (FORBIDDEN):<b></b>客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。 
</li><li>404 (NOT FOUND):<b></b>在指定的位置不存在所申请的资源。 </li></ul><p>在状态行之后是一些首部。通常，服务器会返回一个名为Date的首部，用来说明响应生成的日期和时间（服务器通常还会返回一些关于其自身的信息，尽管并非是必需的）。接下来的两个首部大家应该熟悉，就是与POST请求中一样的Content-Type和Content-Length。在本例中，首部Content-Type指定了MIME类型HTML（text/html），其编码类型是ISO-8859-1（这是针对美国英语资源的编码标准）。响应主体所包含的就是所请求资源的HTML源文件（尽管还可能包含纯文本或其他资源类型的二进制数据）。浏览器将把这些数据显示给用户。<br />注意，这里并没有指明针对该响应的请求类型，不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据，并决定如何使用这些数据。 </p><h2 class="title1">与HTTP相关类的简介</h2><h3 class="title2"><a name="21"></a>WebRequest类</h3><p><b>WebRequest</b> 是 .NET Framework 的用于访问 Internet 数据的请求/响应模型的抽象基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据。在这种方式下，应用程序处理 <b>WebRequest</b> 类的实例，而协议特定的子类则执行请求的具体细节。</p><p>请求从应用程序发送到某个特定的 URI，如服务器上的 Web 页。URI 从一个为应用程序注册的 <b>WebRequest</b> 子代列表中确定要创建的适当子类。注册 <b>WebRequest</b> 子代通常是为了处理某个特定的协议（如 HTTP 或 FTP），但是也可以注册它以处理对特定服务器或服务器上的路径的请求。</p><p>由于 <b>WebRequest</b> 类是一个抽象类，所以 <b>WebRequest</b> 实例在运行时的实际行为由 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclasscreatetopic.htm">WebRequest.Create</a> 方法所返回的子类确定。</p><p><span class="emphtitle"><b class="le"><font color="#ff0000">注意 </font></b></span><span class="emph"><em><font color="#0000ff">使用 <b>Create</b> 方法初始化新的 <b>WebRequest</b> 实例。不要使用 <b>WebRequest</b> 构造函数。</font></em></span></p><p>下面的示例说明如何创建 <b>WebRequest</b> 实例并返回响应。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Initialize the WebRequest.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">WebRequest myRequest </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Return the response. </span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">WebResponse myResponse </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> myRequest.GetResponse();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Code to use the WebResponse goes here.<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Close the response to free resources.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">myResponse.Close();</span></div><h3>WebResponse类</h3><p><b>WebResponse</b> 类是抽象（在 Visual Basic 中为 <b>MustInherit</b>）基类，协议特定的响应类从该抽象基类派生。应用程序可以使用 <b>WebResponse</b> 类的实例以协议不可知的方式参与请求和响应事务，而从 <b>WebResponse</b> 派生的协议特定的类携带请求的详细信息。</p><p>客户端应用程序不直接创建 <b>WebResponse</b> 对象，而是通过调用 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclasstopic.htm">WebRequest</a> 实例上的 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclassgetresponsetopic.htm">GetResponse</a> 方法来创建它。</p><p>下面的示例从 WebRequest 创建 WebResponse 实例。 <br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Initialize the WebRequest.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">WebRequest myRequest </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Return the response. </span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">WebResponse myResponse </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> myRequest.GetResponse();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Code to use the WebResponse goes here.<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Close the response to free resources.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">myResponse.Close();</span></div><h3>HttpWebRequest类</h3><p><b>HttpWebRequest</b> 类对 <a href="#21">WebRequest</a> 中定义的属性和方法提供支持，也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。</p><p>不要使用 <a href="#23">HttpWebRequest</a> 构造函数。使用 <span class="emph"><em><font color="#0000ff">WebRequest.Create</font></em></span> 方法初始化 <b>HttpWebRequest</b> 的一个新实例。如果 URI 的方案是 <code class="ce">http://</code> 或 <code class="ce">https://</code>，则 <b>Create</b> 将返回 <b>HttpWebRequest</b> 实例。</p><p><strong>GetResponse</strong> 方法向 <strong>RequestUri</strong> 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 <a href="#24">HttpWebResponse</a> 实例。可以使用 <strong>BeginGetResponse</strong> 和 <strong>EndGetResponse</strong> 方法对 Internet 资源发出异步请求。</p><p>当要向 Internet 资源发送数据时，<strong>GetRequestStream</strong> 方法返回用于发送数据的Stream实例。<strong>BeginGetRequestStream</strong> 和 <strong>EndGetRequestStream</strong> 方法提供对发送数据流的异步访问。</p><p style="DISPLAY: block">下面的示例为 URI http://www.contoso.com/ 创建 <b>HttpWebRequest</b>。</p><pre class="code" style="DISPLAY: block"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">HttpWebRequest myReq </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HttpWebRequest)WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div></pre><h3><a name="24"></a>HttpWebResponse类</h3><p>此类包含对 <a href="#22">WebResponse</a> 类中的属性和方法的 HTTP 特定用法的支持。<b>HttpWebResponse</b> 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。</p><p><span class="emphtitle"><strong><font color="#ff0000">注意：</font></strong></span><span class="emph"><em><font color="#0000ff">不要混淆 <b>HttpWebResponse</b> 和 <strong>HttpResponse</strong>；后者用于 ASP.NET 应用程序，而且它的方法和属性是通过 ASP.NET 的内部 <b>HttpResponse</b> 对象公开的。</font></em></span></p><p>决不要直接创建 <b>HttpWebResponse</b> 类的实例。而应当使用通过调用 <span class="emph"><em><font color="#0000ff">HttpWebRequest.GetResponse</font></em></span> 所返回的实例。</p><p>从 Internet 资源返回的公共标头信息公开为该类的属性。有关完整的列表，请参见下表。可以从 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnethttpwebresponseclassheaderstopic.htm">Headers</a> 属性以名称/值对的形式读取其他标头。</p><p>下表显示可以通过 <b>HttpWebResponse</b> 类的属性使用的公共 HTTP 标头。</p><div class="tablediv"><table class="dtTABLE" cellspacing="0" width="600" border="1"><tbody><tr valign="top"><th width="50%">标头</th><th width="50%">属性</th></tr><tr valign="top"><td width="50%"><div align="center">Content-Encoding</div></td><td width="50%"><div align="center">ContentEncoding </div></td></tr><tr valign="top"><td width="50%"><div align="center">Content-Length</div></td><td width="50%"><div align="center">ContentLength </div></td></tr><tr valign="top"><td width="50%"><div align="center">Content-Type</div></td><td width="50%"><div align="center">ContentType </div></td></tr><tr valign="top"><td width="50%"><div align="center">Last-Modified</div></td><td width="50%"><div align="center">LastModified </div></td></tr><tr valign="top"><td width="50%"><div align="center">服务器</div></td><td width="50%"><div align="center">Server </div></td></tr></tbody></table></div><p>通过调用 <strong>GetResponseStream</strong> 方法，以 <strong>Stream</strong> 的形式返回来自 Internet 资源的响应的内容。</p><p style="DISPLAY: block">下面的示例返回 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnethttpwebrequestclasstopic.htm">HttpWebRequest</a> 的 <b>HttpWebResponse</b>：</p><pre class="code" style="DISPLAY: block"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">HttpWebRequest HttpWReq </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HttpWebRequest)WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />HttpWebResponse HttpWResp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HttpWebResponse)HttpWReq.GetResponse();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Insert code that uses the response object.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">HttpWResp.Close()</span></div></pre><h3><a name="25"></a><span class="title2">Uri类</span></h3><p>URI 是 Internet 上可由应用程序使用的资源的简洁表示形式。<b>Uri</b> 类定义了属性和方法来处理 URI，包括分析、比较和组合。<b>Uri</b> 类属性是只读的，修改 <b>Uri</b> 实例需使用 <strong>UriBuilder</strong> 类。</p><p><b>Uri</b> 类只存储绝对 URI（例如“http://www.contoso.com/index.htm”）。相对 URI（例如“/new/index.htm”）必须相对于基 URI 展开，这样才是绝对的。提供了 <strong>MakeRelative</strong> 方法在必要时将绝对 URI 转换为相对 URI。</p><p>URI 由转义编码存储为规范化 URI，所有 ASCII 值大于 127 的字符都被替换为它们的等效十六进制数。为使 URI 具有规范化格式，<b>Uri</b> 构造函数执行以下步骤。</p><ul type="disc"><li>将 URI 方案转换为小写。 
</li><li>将主机名转换为小写。 
</li><li>移除默认端口号和空端口号。 
</li><li>移除多余的段（如“/”和“/test”段）以简化 URI。 </li></ul><p>使用 <strong>ToString</strong> 方法，可以将 <b>Uri</b> 类的内容从转义编码的 URI 引用转换为可读的 URI 引用。</p><p>一些 URI 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本，存储在 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemuriclassfragmenttopic.htm">Fragment</a> 属性中。查询信息是 URI 中跟在问号 (?) 后的任何文本，存储在 <strong>Query</strong> 属性中。</p><p><b class="emphtitle"><font color="#ff0000">注意：</font></b><span class="emph"><em><font color="#0000ff">URI 类支持使用以下格式的 IP 地址：四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。请记住在 IPv6 地址两边括上方括号，如 http://[::1]。</font></em></span></p><p style="DISPLAY: block">下面的示例创建 <b>Uri</b> 类的实例，并用它来创建 <a href="#21">WebRequest</a>。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Uri siteUri </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Uri(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />WebRequest wr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WebRequest.Create(siteUri);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p style="DISPLAY: block"> </p><img src ="http://www.teachblog.net/tangzz/aggbug/3458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-30 09:05 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.Net下FCKEditor按照不同用户自动设置不同浏览上传目录的实现</title><link>http://www.teachblog.net/tangzz/archive/2006/11/18/3372.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Sat, 18 Nov 2006 07:53:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/18/3372.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3372.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/18/3372.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3372.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3372.html</trackback:ping><description><![CDATA[By：tzz<br /><br />此设置方法通用于Image，Flash和Link类的浏览目录。这里所说的浏览上传目录指的是在点击Flash或者Image或者Link按钮时，选择“浏览服务器”时的初始目录，下文称之为用户文件目录。我们现在要实现的，就是将用户文件目录根据用户的不同而改变。比如我根据用户ID来建立文件夹来为用户提供上传服务。则ID=1的用户，其用户文件目录就是...../1/，而ID=2的用户，其用户文件目录就是...../2/。有点啰嗦，<img height="19" src="http://www.teachblog.net/Emoticons/red_smile.gif" width="19" border="0" />。下文我就根据用户ID来设置用户文件目录。<br /><br />首先我们来分析FckEditor是如何来确定用户文件目录的。我们来看看FckEditor设置用户文件目录的代码。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> UserFilesPath<br /><img id="Codehighlighter1_31_1213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_1213_Open_Text.style.display='none'; Codehighlighter1_31_1213_Closed_Image.style.display='inline'; Codehighlighter1_31_1213_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_1213_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_1213_Closed_Text.style.display='none'; Codehighlighter1_31_1213_Open_Image.style.display='inline'; Codehighlighter1_31_1213_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_31_1213_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_31_1213_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_39_1211_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_1211_Open_Text.style.display='none'; Codehighlighter1_39_1211_Closed_Image.style.display='inline'; Codehighlighter1_39_1211_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_39_1211_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_1211_Closed_Text.style.display='none'; Codehighlighter1_39_1211_Open_Image.style.display='inline'; Codehighlighter1_39_1211_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_39_1211_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_39_1211_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( sUserFilesPath </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_75_1182_Open_Image" onclick="this.style.display='none'; Codehighlighter1_75_1182_Open_Text.style.display='none'; Codehighlighter1_75_1182_Closed_Image.style.display='inline'; Codehighlighter1_75_1182_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_75_1182_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_1182_Closed_Text.style.display='none'; Codehighlighter1_75_1182_Open_Image.style.display='inline'; Codehighlighter1_75_1182_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_75_1182_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_75_1182_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Try to get from the "Application".</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">)Application[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FCKeditor:UserFilesPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Try to get from the "Session".</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( sUserFilesPath </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> sUserFilesPath.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_291_928_Open_Image" onclick="this.style.display='none'; Codehighlighter1_291_928_Open_Text.style.display='none'; Codehighlighter1_291_928_Closed_Image.style.display='inline'; Codehighlighter1_291_928_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_291_928_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_291_928_Closed_Text.style.display='none'; Codehighlighter1_291_928_Open_Image.style.display='inline'; Codehighlighter1_291_928_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span id="Codehighlighter1_291_928_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_291_928_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">)Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FCKeditor:UserFilesPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Try to get from the Web.config file.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( sUserFilesPath </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> sUserFilesPath.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_476_923_Open_Image" onclick="this.style.display='none'; Codehighlighter1_476_923_Open_Text.style.display='none'; Codehighlighter1_476_923_Closed_Image.style.display='inline'; Codehighlighter1_476_923_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_476_923_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_476_923_Closed_Text.style.display='none'; Codehighlighter1_476_923_Open_Image.style.display='inline'; Codehighlighter1_476_923_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span id="Codehighlighter1_476_923_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_476_923_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Configuration.ConfigurationSettings.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FCKeditor:UserFilesPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Otherwise use the default value.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( sUserFilesPath </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> sUserFilesPath.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                        sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DEFAULT_USER_FILES_PATH ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Try to get from the URL.</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( sUserFilesPath </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> sUserFilesPath.Length </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ) <br /><img id="Codehighlighter1_851_917_Open_Image" onclick="this.style.display='none'; Codehighlighter1_851_917_Open_Text.style.display='none'; Codehighlighter1_851_917_Closed_Image.style.display='inline'; Codehighlighter1_851_917_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_851_917_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_851_917_Closed_Text.style.display='none'; Codehighlighter1_851_917_Open_Image.style.display='inline'; Codehighlighter1_851_917_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                    </span><span id="Codehighlighter1_851_917_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_851_917_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                        sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Request.QueryString[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ServerPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Check that the user path ends with slash ("/")</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"> sUserFilesPath.EndsWith(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) )<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                sUserFilesPath </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> add by tzz for multiuser<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">sUserFilesPath = sUserFilesPath + Session["user_id"].ToString() + "/" ;</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> sUserFilesPath ;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />可以看到，FckEditor是从“UserFilesPath”来获取用户文件目录的。我们可以看到FckEditor取UserFilesPath的顺序为：Application["FCKeditor:UserFilesPath"] --&gt;Session["FCKeditor:UserFilesPath"]---&gt;System.Configuration.ConfigurationSettings.AppSettings["FCKeditor:UserFilesPath"]--&gt;默认值。Application、web.config都是全局的，我们不用，所以我们的目标就是通过设置Session["FCKeditor:UserFilesPath"]来根据不同的用户设置不同的用户文件目录。可能会有朋友问，为什么不直接引用Solution中的Session，比如自己的webapplication中的Session[UserID]，然后直接在上述代码里修改，比如加入：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">sUserFilesPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sUserFilesPath </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user_id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].ToString() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ;</span></div>这是行不通的。<font color="#ff0000">Session不能在两个不同的应用程序之间传递！<br /></font><br />接下来的问题就在于在哪里改变Session["FCKeditor:UserFilesPath"]。这里很重要。切忌，<font color="#ff0000">要在“~\FCKeditor\editor\filemanager\browser\default\connectors\aspx\connector.aspx”的OnInit事件中设定</font>，而不能在Page_Load事件中设定。上文说过我们不能通过使用启动工程中的Session，那我们如果得到用户的ID呢？对，通过url的参数。为了实现通过url传递有关用户ID的参数，我们就必须在使用FckEditor的页面增加如下代码，设置ImageBrowserURL、LinkBrowserURL、FlashBrowserURL的值：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> sImageBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/demo/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/aspx/connector.aspx&amp;UserID=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> user_id.ToString();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> sFlashBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/demo/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/aspx/connector.aspx&amp;UserID=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> user_id.ToString();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> sLinkBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/demo/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/aspx/connector.aspx&amp;UserID=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> user_id.ToString();<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />FCKeditor_diary.ImageBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sImageBrowserURL;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />FCKeditor_diary.LinkBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sLinkBrowserURL;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />FCKeditor_diary.FlashBrowserURL </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sFlashBrowserURL;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span></div>其中，“demo”是你的应用程序。现在我们可以在connector.aspx的OnInit事件中加代码了：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">script runat</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">server</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> language</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C#</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnInit(EventArgs e)<br /><img id="Codehighlighter1_90_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_374_Open_Text.style.display='none'; Codehighlighter1_90_374_Closed_Image.style.display='inline'; Codehighlighter1_90_374_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_374_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_374_Closed_Text.style.display='none'; Codehighlighter1_90_374_Open_Image.style.display='inline'; Codehighlighter1_90_374_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_90_374_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_90_374_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (Request.QueryString[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UserID</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_151_233_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_233_Open_Text.style.display='none'; Codehighlighter1_151_233_Closed_Image.style.display='inline'; Codehighlighter1_151_233_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_151_233_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_233_Closed_Text.style.display='none'; Codehighlighter1_151_233_Open_Image.style.display='inline'; Codehighlighter1_151_233_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_151_233_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_151_233_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FCKeditor:UserFilesPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">~/uploaded/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置默认值</span><span style="COLOR: #008000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_256_368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_256_368_Open_Text.style.display='none'; Codehighlighter1_256_368_Closed_Image.style.display='inline'; Codehighlighter1_256_368_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_256_368_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_256_368_Closed_Text.style.display='none'; Codehighlighter1_256_368_Open_Image.style.display='inline'; Codehighlighter1_256_368_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_256_368_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.teachblog.net/images/dot.gif" /></span><span id="Codehighlighter1_256_368_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FCKeditor:UserFilesPath</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">~/uploaded/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Request.QueryString[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UserID</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">script</span><span style="COLOR: #000000">&gt;</span></div><p><br />然后编译，运行。该方法不用修改FckEditor的源文件，感觉还是比较简单的。<img height="20" src="http://www.teachblog.net/Emoticons/QQ/15.gif" width="20" border="0" /></p><img src ="http://www.teachblog.net/tangzz/aggbug/3372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-18 15:53 <a href="http://www.teachblog.net/tangzz/archive/2006/11/18/3372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[课件]第四章：Visual C# FTP编程</title><link>http://www.teachblog.net/tangzz/archive/2006/11/08/3296.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Wed, 08 Nov 2006 09:50:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/08/3296.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3296.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/08/3296.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3296.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3296.html</trackback:ping><description><![CDATA[
		<h1>Visual C# FTP编程</h1>
		<ol>
				<li>FTP协议 
<ol type="a"><li><a href="#11">FTP协议简介</a></li><li><a href="#12">FTP命令</a></li><li><a href="#13">FTP响应码</a></li></ol></li>
				<li>FTP站点的建立</li>
				<li>FTP浏览器的开发 
<ol type="i"><li>AxDHTMLEdit控件介绍</li><li>FTP浏览器开发</li></ol></li>
				<li>文件传输系统开发</li>
				<li>本章小结</li>
		</ol>
		<h2>FTP协议</h2>
		<h3>
				<a name="11">
				</a>FTP协议简介</h3>
		<p>文件传输协议（FTP）使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息，然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。FTP 的主要功能如下：</p>
		<ul>
				<li>提供文件的共享（计算机程序 / 数据）； 
</li>
				<li>支持间接使用远程计算机； 
</li>
				<li>使用户不因各类主机文件存储器系统的差异而受影响； 
</li>
				<li>可靠且有效的传输数据。 </li>
		</ul>
		<p>FTP ，尽管可以直接被终端用户使用，但其应用主要还是通过程序实现。FTP协议通过FTP控制帧使用TCP协议进行通信。FTP 控制帧即指 TELNET 交换信息，包含 TELNET 命令和选项。然而，大多数 FTP 控制帧是简单的 ASCII 文本，可以分为 FTP 命令或 FTP 消息。 FTP 消息是对 FTP 命令的响应，它由带有解释文本的应答代码构成。 </p>
		<h3>
				<a name="12">
				</a>FTP命令</h3>
		<table cellspacing="1" cellpadding="5" width="600" border="1">
				<tbody>
						<tr bgcolor="#f5f5f5">
								<td width="150">
										<strong>命令</strong>
								</td>
								<td width="450">
										<strong>描述</strong>
								</td>
						</tr>
						<tr>
								<td>ABOR</td>
								<td>中断数据连接程序</td>
						</tr>
						<tr>
								<td>ACCT &lt;account&gt;</td>
								<td>系统特权帐号</td>
						</tr>
						<tr>
								<td>ALLO &lt;bytes&gt; </td>
								<td>为服务器上的文件存储器分配字节</td>
						</tr>
						<tr>
								<td>APPE &lt;filename&gt;</td>
								<td>添加文件到服务器同名文件</td>
						</tr>
						<tr>
								<td>CDUP &lt;dir path&gt;</td>
								<td>改变服务器上的父目录</td>
						</tr>
						<tr>
								<td>CWD &lt;dir path&gt;</td>
								<td>改变服务器上的工作目录</td>
						</tr>
						<tr>
								<td>DELE &lt;filename&gt;</td>
								<td>删除服务器上的指定文件</td>
						</tr>
						<tr>
								<td>HELP &lt;command&gt;</td>
								<td>返回指定命令信息</td>
						</tr>
						<tr>
								<td>LIST &lt;name&gt;</td>
								<td>如果是文件名列出文件信息，如果是目录则列出文件列表</td>
						</tr>
						<tr>
								<td>MODE &lt;mode&gt;</td>
								<td>传输模式（S=流模式，B=块模式，C=压缩模式）</td>
						</tr>
						<tr>
								<td>MKD &lt;directory&gt;</td>
								<td>在服务器上建立指定目录</td>
						</tr>
						<tr>
								<td>NLST &lt;directory&gt;</td>
								<td>列出指定目录内容</td>
						</tr>
						<tr>
								<td>NOOP</td>
								<td>无动作，除了来自服务器上的承认</td>
						</tr>
						<tr>
								<td>PASS &lt;password&gt;</td>
								<td>系统登录密码</td>
						</tr>
						<tr>
								<td>PASV</td>
								<td>请求服务器等待数据连接</td>
						</tr>
						<tr>
								<td>PORT &lt;address&gt;</td>
								<td>IP 地址和两字节的端口 ID</td>
						</tr>
						<tr>
								<td>PWD</td>
								<td>显示当前工作目录</td>
						</tr>
						<tr>
								<td>QUIT</td>
								<td>从 FTP 服务器上退出登录</td>
						</tr>
						<tr>
								<td>REIN</td>
								<td>重新初始化登录状态连接</td>
						</tr>
						<tr>
								<td>REST &lt;offset&gt;</td>
								<td>由特定偏移量重启文件传递</td>
						</tr>
						<tr>
								<td>RETR &lt;filename&gt;</td>
								<td>从服务器上找回（复制）文件</td>
						</tr>
						<tr>
								<td>RMD &lt;directory&gt;</td>
								<td>在服务器上删除指定目录</td>
						</tr>
						<tr>
								<td>RNFR &lt;old path&gt;</td>
								<td>对旧路径重命名</td>
						</tr>
						<tr>
								<td>RNTO &lt;new path&gt;</td>
								<td>对新路径重命名</td>
						</tr>
						<tr>
								<td>SITE &lt;params&gt;</td>
								<td>由服务器提供的站点特殊参数</td>
						</tr>
						<tr>
								<td>SMNT &lt;pathname&gt;</td>
								<td>挂载指定文件结构</td>
						</tr>
						<tr>
								<td>STAT &lt;directory&gt;</td>
								<td>在当前程序或目录上返回信息</td>
						</tr>
						<tr>
								<td>STOR &lt;filename&gt;</td>
								<td>储存（复制）文件到服务器上</td>
						</tr>
						<tr>
								<td>STOU &lt;filename&gt;</td>
								<td>储存文件到服务器名称上</td>
						</tr>
						<tr>
								<td>STRU &lt;type&gt;</td>
								<td>数据结构（F=文件，R=记录，P=页面）</td>
						</tr>
						<tr>
								<td>SYST</td>
								<td>返回服务器使用的操作系统</td>
						</tr>
						<tr>
								<td>TYPE &lt;data type&gt;</td>
								<td>数据类型（A=ASCII，E=EBCDIC，I=binary）</td>
						</tr>
						<tr>
								<td>USER &lt;username&gt;&gt;</td>
								<td>系统登录的用户名</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<h3>
				<a name="13">
				</a>FTP响应码</h3>
		<br />
		<table cellspacing="1" cellpadding="5" width="550" border="1">
				<tbody>
						<tr bgcolor="#f5f5f5">
								<td>
										<strong>响应代码</strong>
								</td>
								<td>
										<strong>解释说明</strong>
								</td>
						</tr>
						<tr>
								<td>110</td>
								<td>新文件指示器上的重启标记</td>
						</tr>
						<tr>
								<td>120</td>
								<td>服务器准备就绪的时间（分钟数）</td>
						</tr>
						<tr>
								<td>125</td>
								<td>打开数据连接，开始传输</td>
						</tr>
						<tr>
								<td>150</td>
								<td>打开连接</td>
						</tr>
						<tr>
								<td>200</td>
								<td>成功</td>
						</tr>
						<tr>
								<td>202</td>
								<td>命令没有执行</td>
						</tr>
						<tr>
								<td>211</td>
								<td>系统状态回复</td>
						</tr>
						<tr>
								<td>212</td>
								<td>目录状态回复</td>
						</tr>
						<tr>
								<td>213</td>
								<td>文件状态回复</td>
						</tr>
						<tr>
								<td>214</td>
								<td>帮助信息回复</td>
						</tr>
						<tr>
								<td>215</td>
								<td>系统类型回复</td>
						</tr>
						<tr>
								<td>220</td>
								<td>服务就绪</td>
						</tr>
						<tr>
								<td>221</td>
								<td>退出网络</td>
						</tr>
						<tr>
								<td>225</td>
								<td>打开数据连接</td>
						</tr>
						<tr>
								<td>226</td>
								<td>结束数据连接</td>
						</tr>
						<tr>
								<td>227</td>
								<td>进入被动模式（IP 地址、ID 端口）</td>
						</tr>
						<tr>
								<td>230</td>
								<td>登录因特网</td>
						</tr>
						<tr>
								<td>250</td>
								<td>文件行为完成</td>
						</tr>
						<tr>
								<td>257</td>
								<td>路径名建立</td>
						</tr>
						<tr>
								<td>331</td>
								<td>要求密码</td>
						</tr>
						<tr>
								<td>332</td>
								<td>要求帐号</td>
						</tr>
						<tr>
								<td>350</td>
								<td>文件行为暂停</td>
						</tr>
						<tr>
								<td>421</td>
								<td>服务关闭</td>
						</tr>
						<tr>
								<td>425</td>
								<td>无法打开数据连接</td>
						</tr>
						<tr>
								<td>426</td>
								<td>结束连接</td>
						</tr>
						<tr>
								<td>450</td>
								<td>文件不可用</td>
						</tr>
						<tr>
								<td>451</td>
								<td>遇到本地错误</td>
						</tr>
						<tr>
								<td>452</td>
								<td>磁盘空间不足</td>
						</tr>
						<tr>
								<td>500</td>
								<td>无效命令</td>
						</tr>
						<tr>
								<td>501</td>
								<td>错误参数</td>
						</tr>
						<tr>
								<td>502</td>
								<td>命令没有执行</td>
						</tr>
						<tr>
								<td>503</td>
								<td>错误指令序列</td>
						</tr>
						<tr>
								<td>504</td>
								<td>无效命令参数</td>
						</tr>
						<tr>
								<td>530</td>
								<td>未登录网络</td>
						</tr>
						<tr>
								<td>532</td>
								<td>存储文件需要帐号</td>
						</tr>
						<tr>
								<td>550</td>
								<td>文件不可用</td>
						</tr>
						<tr>
								<td>551</td>
								<td>不知道的页类型</td>
						</tr>
						<tr>
								<td>552</td>
								<td>超过存储分配</td>
						</tr>
						<tr>
								<td>553</td>
								<td>文件名不允许</td>
						</tr>
				</tbody>
		</table>
		<h2>
				<a name="21">
				</a>FTP站点的建立</h2>
		<ol>
				<li>首先要在“控制面版”“添加/删除程序”“添加/删除Windows组件”里面添加“Internet服务(IIS)”。因为这里面包含了IIS服务需要的所有文件，其中就有FTP传输协议。</li>
				<li>在添加过Internet服务以后，“控制面板”中就会出现“管理工具”选项。双击“管理工具”选择“Internet服务器管理”。</li>
				<li>选择“默认FTP站点”，点击鼠标右键选择“属性”，进行FTP站点的设置。其中包括“FTP站点”、“安全账号”、“消息”、“主目录”、“目录安全性”等设置。 
<ol type="a"><li>FTP站点:主要用于设置FTP 标识说明，连接设置和设置起用日志记录等功能。</li><li>安全账号:主要用于账号的设置。</li><li>消息:在这里可以设置用户访问本服务器时所显示的消息。</li><li>FTP主目录:用于设置用户访问本FTP站点时所访问的主目录路径。</li><li>目录安全性:用于设置访问本FTP服务器用户IP访问限制的授权列表</li></ol></li>
		</ol>
		<p> </p>
<img src ="http://www.teachblog.net/tangzz/aggbug/3296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-08 17:50 <a href="http://www.teachblog.net/tangzz/archive/2006/11/08/3296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[课件]第三章：Visual C#TCP协议编程</title><link>http://www.teachblog.net/tangzz/archive/2006/11/06/3282.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Mon, 06 Nov 2006 08:48:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/06/3282.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3282.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/06/3282.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3282.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3282.html</trackback:ping><description><![CDATA[
		<h1>Visual C#TCP协议编程</h1>
		<ol>
				<li>Visual C# TCP协议编程基础 
<ol><li><a href="/tangzz/admin/TCP.htm#11">TCP协议层次结构</a></li><li>TCP协议规范</li></ol></li>
				<li>TCP协议相关类简介 
<ol><li><a href="/tangzz/admin/EditArticles.aspx#21">TcpListener</a></li><li><a href="/tangzz/admin/EditArticles.aspx#22">TcpClient</a></li><li><a href="/tangzz/admin/EditArticles.aspx#23">NetworkStream</a></li></ol></li>
		</ol>
		<h2 class="title1">Visual C# TCP协议编程基础</h2>
		<p class="title2">
				<a id="11" name="11">
				</a>TCP协议层次结构</p>
		<p>
				<strong>OSI七层模型：</strong>在计算机网络产生之初，每个计算机厂商都有一套自己的网络体系结构的概念，它们之间互不相容。由于不同的局域网有不同的网络协议，不同的传输介质也各有其电气性能，为了使不同的网络能够互连，必须建立统一的网络互连协议。为此，ISO(国际标准化组织)提出了网络互连协议的基本框架，称为开放系统互连(OSI)参考模型,只要遵循OSI标准，一个系统可以和位于世界上任何地方的、也遵循OSI标准的其他任何系统进行连接.现在此模型已成为计算机间和网络间进行通信的主要结构模型。目前使用的大多数网络通信协议的结构都是基于 OSI 模型的。</p>
		<p>OSI将通信过程定义为七层，即将连网计算机间传输信息的任务划分为七个更小、更易于处理的任务组。每一个任务或任务组则被分配到各个 OSI 层。每一层都是独立存在的，因此分配到各层的任务能够独立地执行。这样使得变更其中某层提供的方案时不影响其他层。OSI参考模型分为７层，分别是<span class="style1">物理层(Physical Layer)，数据链路层(Data Link Layer)，网络层(Network Layer)，传输层(Transport Layer)，会话层(Session Layer)，表示层(Presentation Layer)和应用层(Application Layer)</span>。</p>
		<p>
				<img height="374" src="http://www.teachblog.net/images/teachblog_net/tangzz/3.1.1.jpg" width="616" />
		</p>
		<p>
				<strong>TCP/IP模型：</strong>ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照，由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如下图所示，是TCP/IP参考模型和OSI参考模型的对比示意图。</p>
		<p>
				<img height="211" src="http://www.teachblog.net/images/teachblog_net/tangzz/3.1.2.jpg" width="351" />
		</p>
		<p>TCP/IP协议栈是美国国防部高级研究计划局计算机网（Advanced Research Projects Agency Network，ARPANET）和其后继因特网使用的参考模型。TCP/IP参考模型分为四个层次：<span class="style1">应用层、传输层、网络互连层和主机到网络层</span>。如下图所示。</p>
		<p>
				<img height="208" src="http://www.teachblog.net/images/teachblog_net/tangzz/3.1.3.jpg" width="438" />
		</p>
		<p class="title1">TCP协议相关类的简介</p>
		<p>在TCP协议编程中，经常使用的类有TcpListener类，TcpClient类，NetworkStream类。</p>
		<p class="title2">
				<a id="21" name="21">
				</a>TcpListener类：</p>
		<b>TcpListener</b> 类从 TCP 网络客户端侦听连接。<b>TcpListener</b> 类提供一些简单方法，用于在阻塞同步模式下侦听和接受传入连接请求。可使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclasstopic.htm">TcpClient</a> 或 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasstopic.htm">Socket</a> 来连接 <b>TcpListener</b>。可使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipendpointclasstopic.htm">IPEndPoint</a>、本地 IP 地址及端口号或者仅使用端口号，来创建 <b>TcpListener</b>。可以将本地 IP 地址指定为 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassanytopic.htm">Any</a>，将本地端口号指定为 0（如果希望基础服务提供程序为您分配这些值）。如果选择这样做，可使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclasslocalendpointtopic.htm">LocalEndpoint</a> 来标识已指定的信息。 
<p><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassstarttopic.htm">Start</a> 方法用来开始侦听传入的连接请求。<b>Start</b> 将对传入连接进行排队，直至您调用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassstoptopic.htm">Stop</a> 方法或它已经完成 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketoptionnameclasstopic.htm">MaxConnections</a> 排队为止。可使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassacceptsockettopic.htm">AcceptSocket</a> 或 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassaccepttcpclienttopic.htm">AcceptTcpClient</a> 从传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻塞，可首先使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclasspendingtopic.htm">Pending</a> 方法来确定队列中是否有可用的连接请求。调用 <b>Stop</b> 方法来关闭 <b>TcpListener</b>。</p><p><b class="emphtitle">注意</b><span class="emphtitle">:</span><span class="emph"><b>Stop</b> 方法不会关闭任何已接受的连接。需要用户负责分别关闭这些连接</span></p><div class="tablediv"><table class="dtTABLE" cellspacing="0" width="79%" border="1"><tbody><tr valign="top"><td height="48"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassctortopic.htm">TcpListener 构造函数</a><br />受 .NET Framework 精简版的支持。</td><td>初始化 <b>TcpListener</b> 类的新实例。</td></tr><tr valign="top"><td><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassstarttopic.htm">Start</a><br />受 .NET Framework 精简版的支持。</td><td>开始侦听传入的连接请求。</td></tr><tr valign="top"><td><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassacceptsockettopic.htm">AcceptSocket<br /></a>受 .NET Framework 精简版的支持。</td><td>接受挂起的连接请求。</td></tr><tr valign="top"><td><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassaccepttcpclienttopic.htm">AcceptTcpClient</a><br />受 .NET Framework 精简版的支持。</td><td>接受挂起的连接请求。</td></tr><tr valign="top"><td><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclassstoptopic.htm">Stop</a><br />受 .NET Framework 精简版的支持。</td><td>关闭侦听器。</td></tr></tbody></table></div><p class="title2"><a name="22"></a>TcpClient类:</p><p>为 TCP 网络服务提供客户端连接。<b>TcpClient</b> 类提供了一些简单的方法，用于在同步阻塞模式下通过网络来连接、发送和接收流数据。</p><p>为使 <b>TcpClient</b> 连接并交换数据，使用 TCP <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsprotocoltypeclasstopic.htm">ProtocolType</a> 创建的 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcplistenerclasstopic.htm">TcpListener</a> 或 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasstopic.htm">Socket</a> 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器： </p><ul type="disc"><li>创建一个 <b>TcpClient</b>，并调用三个可用的 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassconnecttopic.htm">Connect</a> 方法之一。 
</li><li>使用远程主机的主机名和端口号创建 <b>TcpClient</b>。此构造函数将自动尝试一个连接。 </li></ul><h4 class="dtH4">公共构造函数</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img height="16" alt="公共构造函数" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassctortopic.htm">TcpClient 构造函数</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重载。初始化 <b>TcpClient</b> 类的新实例。</td></tr></tbody></table></div><h4 class="dtH4">公共属性</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclasslingerstatetopic.htm">LingerState</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">获取或设置有关套接字逗留时间的信息。</td></tr><tr valign="top"><td width="50%"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassnodelaytopic.htm">NoDelay</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">获取或设置一个值，该值在发送或接收缓冲区未满时禁用延迟。</td></tr><tr valign="top"><td width="50%"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassreceivebuffersizetopic.htm">ReceiveBufferSize</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">获取或设置接收缓冲区的大小。</td></tr><tr valign="top"><td width="50%"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassreceivetimeouttopic.htm">ReceiveTimeout</a></td><td width="50%">获取或设置在初始化一个读取操作以后 <b>TcpClient</b> 等待接收数据的时间量。</td></tr><tr valign="top"><td width="50%"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclasssendbuffersizetopic.htm">SendBufferSize</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">获取或设置发送缓冲区的大小。</td></tr><tr valign="top"><td width="50%"><img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclasssendtimeouttopic.htm">SendTimeout</a></td><td width="50%">获取或设置 <b>TcpClient</b> 等待发送操作成功完成的时间量。</td></tr></tbody></table><h4 class="dtH4">公共方法</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassclosetopic.htm">Close</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">关闭 TCP 连接并释放与 <b>TcpClient</b> 关联的所有资源。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassconnecttopic.htm">Connect</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重载。使用指定的主机名和端口号将客户端连接到 TCP 主机。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketstcpclientclassgetstreamtopic.htm">GetStream</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">返回用于发送和接收数据的 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasstopic.htm">NetworkStream</a>。</td></tr></tbody></table></div><p class="title2"><a name="23"></a>NetworkStream类：</p>提供用于网络访问的基础数据流。 <b>NetworkStream</b> 类提供在阻塞模式下通过 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssockettypeclasstopic.htm">Stream</a> 套接字发送和接收数据的方法。您可以使用 <b>NetworkStream</b> 类进行同步和异步数据传输。要创建 <b>NetworkStream</b>，必须提供连接的 <b>Socket</b>。也可指定 <b>NetworkStream</b> 对所提供的 <b>Socket</b> 具有哪些 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemiofileaccessclasstopic.htm">FileAccess</a> 权限。默认情况下，关闭 <b>NetworkStream</b> 并不会关闭所提供的 <b>Socket</b>。如果要使 <b>NetworkStream</b> 拥有关闭所提供的 <b>Socket</b> 的权限，则必须将 <i>ownsSocket</i> 构造函数参数的值指定为 <b>true</b>。 
<p>将 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasswritetopic.htm">Write</a> 和 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassreadtopic.htm">Read</a> 方法用于简单的单线程同步阻塞 I/O。若要使用不同的线程来处理 I/O，则请考虑使用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassbeginwritetopic.htm">BeginWrite</a>/ <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassendwritetopic.htm">EndWrite</a> 和 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassbeginreadtopic.htm">BeginRead</a>/ <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassendreadtopic.htm">EndRead</a> 方法进行通信。</p><p><b>NetworkStream</b> 不支持对网络数据流的随机访问。<a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasscanseektopic.htm">CanSeek</a> 属性用于指示流是否支持查找，它的值始终为 <b>false</b>。读取 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasspositiontopic.htm">Position</a> 属性、读取 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasslengthtopic.htm">Length</a> 属性或者调用 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassseektopic.htm">Seek</a> 方法都会引发 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnotsupportedexceptionclasstopic.htm">NotSupportedException</a>。</p><h4 class="dtH4">公共构造函数</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img height="16" alt="公共构造函数" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" width="16" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassctortopic.htm">NetworkStream 构造函数<br /></a>受 .NET Framework 精简版的支持。</td><td width="50%">已重载。创建 <b>NetworkStream</b> 类的新实例。</td></tr></tbody></table></div><h4 class="dtH4">公共属性</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasscanreadtopic.htm">CanRead</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。获取一个值，该值指示 <b>NetworkStream</b> 是否支持读取。</td></tr><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasscanseektopic.htm">CanSeek</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。获取一个值，该值指示流是否支持查找。该属性总是返回 <b>false</b>。</td></tr><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasscanwritetopic.htm">CanWrite</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。获取一个值，该值指示 <b>NetworkStream</b> 是否支持写入。</td></tr><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassdataavailabletopic.htm">DataAvailable</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">获取一个值，该值指示在要读取的 <b>NetworkStream</b> 上是否有可用的数据。</td></tr><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasslengthtopic.htm">Length</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。获取流上可用数据的长度。此属性始终引发 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnotsupportedexceptionclasstopic.htm">NotSupportedException</a>。</td></tr><tr valign="top"><td width="50%"><img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasspositiontopic.htm">Position</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。获取或设置流中的当前位置。此属性始终引发 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnotsupportedexceptionclasstopic.htm">NotSupportedException</a>。</td></tr></tbody></table></div><h4 class="dtH4">公共方法</h4><div class="tablediv"><table class="dtTABLE" cellspacing="0" border="1"><tbody><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassbeginreadtopic.htm">BeginRead</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。从 <b>NetworkStream</b> 开始异步读取。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassbeginwritetopic.htm">BeginWrite</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。开始向流异步写入。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassclosetopic.htm">Close</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。关闭 <b>NetworkStream</b>。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassendreadtopic.htm">EndRead</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。处理异步读取的结束。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassendwritetopic.htm">EndWrite</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。处理异步写入的结束。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassflushtopic.htm">Flush</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。刷新流中的数据。保留此方法供将来使用。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassreadtopic.htm">Read</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。从 <b>NetworkStream</b> 读取数据。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemiostreamclassreadbytetopic.htm">ReadByte</a>（从 <b>Stream</b> 继承） <br />受 .NET Framework 精简版的支持。</td><td width="50%">从流中读取一个字节，并将流内的位置向前推进一个字节，或者如果已到达流的末尾，则返回 -1。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclassseektopic.htm">Seek</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。将流的当前位置设置为给定值。此方法始终引发 <a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnotsupportedexceptionclasstopic.htm">NotSupportedException</a>。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketsnetworkstreamclasswritetopic.htm">Write</a><br />受 .NET Framework 精简版的支持。</td><td width="50%">已重写。将数据写入 <b>NetworkStream</b>。</td></tr><tr valign="top"><td width="50%"><img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.jpg" border="0" /><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemiostreamclasswritebytetopic.htm">WriteByte</a>（从 <b>Stream</b> 继承） <br />受 .NET Framework 精简版的支持。</td><td width="50%">将一个字节写入流内的当前位置，并将流内的位置向前推进一个字节。</td></tr></tbody></table></div><p> </p></div><img src ="http://www.teachblog.net/tangzz/aggbug/3282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-06 16:48 <a href="http://www.teachblog.net/tangzz/archive/2006/11/06/3282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[实验指导]C#网络编程实验二：聊天室的开发</title><link>http://www.teachblog.net/tangzz/archive/2006/11/06/3281.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Mon, 06 Nov 2006 08:47:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/06/3281.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3281.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/06/3281.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3281.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3281.html</trackback:ping><description><![CDATA[
		<div class="div_topic-content">
				<h1>实验二：聊天室的开发</h1>
				<p>
						<strong>实验目的：</strong>
				</p>
				<ul>
						<li>学习Visual C#.Net Socket类的使用 
</li>
						<li>学习基本UI控件的使用 
</li>
						<li>学习多线程的开发 
</li>
						<li>学习聊天室的原理 </li>
				</ul>
				<p>
						<strong>实验内容：</strong>开发一套聊天室软件。根据已经完成的服务器端和通信信令，开发客户端：</p>
				<ul>
						<li>能够设置服务器信息，包括服务器地址和服务端口； 
</li>
						<li>能够设定用户在聊天室的昵称； 
</li>
						<li>能够显示聊天室在线人员列表； 
</li>
						<li>用户可以对所有人聊天，也可以对具体某一个人聊天。两人之间还可以进行私聊； 
</li>
						<li>滚动显示聊天信息； 
</li>
						<li>当有新成员进入聊天室，或者有成员退出聊天室时，会显示提示信息。 </li>
				</ul>
				<p>具体实验指导，请点击：<a href="http://tzzblog.51086.com/Uploaded/doc/网络编程实验指导.doc" target="_blank">网络编程实验指导.doc</a><br />点击下载实验报告模板：<a href="http://tzzblog.51086.com/Uploaded/doc/网络编程实验二.doc" target="_blank">网络编程实验二.doc</a><br />点击下载服务器端程序：<a class="" title="Server.rar" href="http://tzzblog.51086.com/Uploaded/app/Server.rar" target="">Server.rar</a><br /><br /><strong>参考代码：<br /></strong></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">接收线程的处理函数</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> rec()<br /><img id="Codehighlighter1_31_1595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_1595_Open_Text.style.display='none'; Codehighlighter1_31_1595_Closed_Image.style.display='inline'; Codehighlighter1_31_1595_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_1595_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_1595_Closed_Text.style.display='none'; Codehighlighter1_31_1595_Open_Image.style.display='inline'; Codehighlighter1_31_1595_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_31_1595_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.teachblog.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_31_1595_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">byte</span>
								<span style="COLOR: #000000">[] buff </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">byte</span>
								<span style="COLOR: #000000">[buffsize];<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000"> (sock.Connected)<br /><img id="Codehighlighter1_93_1593_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_1593_Open_Text.style.display='none'; Codehighlighter1_93_1593_Closed_Image.style.display='inline'; Codehighlighter1_93_1593_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_93_1593_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_1593_Closed_Text.style.display='none'; Codehighlighter1_93_1593_Open_Image.style.display='inline'; Codehighlighter1_93_1593_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_93_1593_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.teachblog.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_93_1593_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">从网络上接收数据，进而分析数据，根据不同的数据进行不同的处理<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">首先要判断接收到的数据是普通聊天信息还是信令<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">如果是普通聊天信息，接着要判断该聊天信息是否是私了<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">如果是信令，则根据不同的信令来做不同的处理。<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">rs表示接受到的字节数</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        </span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> rs </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> _____________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000"> (rs</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_273_1590_Open_Image" onclick="this.style.display='none'; Codehighlighter1_273_1590_Open_Text.style.display='none'; Codehighlighter1_273_1590_Closed_Image.style.display='inline'; Codehighlighter1_273_1590_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_273_1590_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_273_1590_Closed_Text.style.display='none'; Codehighlighter1_273_1590_Open_Image.style.display='inline'; Codehighlighter1_273_1590_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
										<span id="Codehighlighter1_273_1590_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.teachblog.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_273_1590_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">将收到的字节数组转化为字符串</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">string</span>
												<span style="COLOR: #000000"> msg </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> Encoding.BigEndianUnicode.GetString(buff);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            msg </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> msg.Substring(</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">, rs</span>
												<span style="COLOR: #000000">/</span>
												<span style="COLOR: #000000">2</span>
												<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">提取msg的第一个字符<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">该字符用于判断接受到的数据是普通聊天信息还是信令</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">string</span>
												<span style="COLOR: #000000"> msgtype </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> msg.Substring(</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">,</span>
												<span style="COLOR: #000000">1</span>
												<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">将msg的第一个字符丢弃</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            msg </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> msg.Substring(</span>
												<span style="COLOR: #000000">1</span>
												<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">如果接收到的数据是普通聊天信息</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000"> (msgtype</span>
												<span style="COLOR: #000000">==</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">*</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_565_638_Open_Image" onclick="this.style.display='none'; Codehighlighter1_565_638_Open_Text.style.display='none'; Codehighlighter1_565_638_Closed_Image.style.display='inline'; Codehighlighter1_565_638_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_565_638_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_565_638_Closed_Text.style.display='none'; Codehighlighter1_565_638_Open_Image.style.display='inline'; Codehighlighter1_565_638_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span>
												<span id="Codehighlighter1_565_638_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.teachblog.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_565_638_Open_Text">
														<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">这里判断是否是聊天信息<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">并将聊天信息显示在聊天信息框中<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">请填写相关代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span>
														<span style="COLOR: #000000">            }</span>
												</span>
												<span style="COLOR: #000000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">如果接收到的数据是信令</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">else</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000"> (msgtype</span>
												<span style="COLOR: #000000">==</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">@</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_686_1581_Open_Image" onclick="this.style.display='none'; Codehighlighter1_686_1581_Open_Text.style.display='none'; Codehighlighter1_686_1581_Closed_Image.style.display='inline'; Codehighlighter1_686_1581_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_686_1581_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_686_1581_Closed_Text.style.display='none'; Codehighlighter1_686_1581_Open_Image.style.display='inline'; Codehighlighter1_686_1581_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span>
												<span id="Codehighlighter1_686_1581_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.teachblog.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_686_1581_Open_Text">
														<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">从msg的前两个字符获取信令的类别<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">具体信令类别请参考实验指导</span>
														<span style="COLOR: #008000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">                </span>
														<span style="COLOR: #0000ff">string</span>
														<span style="COLOR: #000000"> cmd </span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000"> msg.Substring(</span>
														<span style="COLOR: #000000">0</span>
														<span style="COLOR: #000000">,</span>
														<span style="COLOR: #000000">2</span>
														<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">如果是增加昵称的信令：<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">新用户进入聊天室以后，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">服务器需要把所有已经在线的用户发送给新的用户，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">此时的信令为：@AN 0 nickname；<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">新用户进入聊天室以后，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">服务器要通知所有在线用户有新用户进入聊天室,<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">信令为：@AN 1 nickname</span>
														<span style="COLOR: #008000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">                </span>
														<span style="COLOR: #0000ff">if</span>
														<span style="COLOR: #000000"> (cmd </span>
														<span style="COLOR: #000000">==</span>
														<span style="COLOR: #000000"> </span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">AN</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_962_1322_Open_Image" onclick="this.style.display='none'; Codehighlighter1_962_1322_Open_Text.style.display='none'; Codehighlighter1_962_1322_Closed_Image.style.display='inline'; Codehighlighter1_962_1322_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_962_1322_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_962_1322_Closed_Text.style.display='none'; Codehighlighter1_962_1322_Open_Image.style.display='inline'; Codehighlighter1_962_1322_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span>
														<span id="Codehighlighter1_962_1322_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																<img src="http://www.teachblog.net/images/dot.gif" />
														</span>
														<span id="Codehighlighter1_962_1322_Open_Text">
																<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">从第五个字符开始到信令结束部分，是昵称字段</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                    </span>
																<span style="COLOR: #0000ff">string</span>
																<span style="COLOR: #000000"> nick </span>
																<span style="COLOR: #000000">=</span>
																<span style="COLOR: #000000"> msg.Substring(</span>
																<span style="COLOR: #000000">5</span>
																<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">从第三个字符开始的后面一个字符，是ANTYPE字段，ANTYPE=0或者1</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                    </span>
																<span style="COLOR: #0000ff">string</span>
																<span style="COLOR: #000000"> antype </span>
																<span style="COLOR: #000000">=</span>
																<span style="COLOR: #000000"> msg.Substring(</span>
																<span style="COLOR: #000000">3</span>
																<span style="COLOR: #000000">, </span>
																<span style="COLOR: #000000">1</span>
																<span style="COLOR: #000000">);<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">将昵称加入到用户列表和聊天对象列表</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                    _____________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    _____________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">如果是新用户进入聊天室，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">需要在聊天信息框中显示有新用户的到来。</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                    </span>
																<span style="COLOR: #0000ff">if</span>
																<span style="COLOR: #000000"> (antype</span>
																<span style="COLOR: #000000">==</span>
																<span style="COLOR: #000000">"</span>
																<span style="COLOR: #000000">1</span>
																<span style="COLOR: #000000">"</span>
																<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1274_1316_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1274_1316_Open_Text.style.display='none'; Codehighlighter1_1274_1316_Closed_Image.style.display='inline'; Codehighlighter1_1274_1316_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1274_1316_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1274_1316_Closed_Text.style.display='none'; Codehighlighter1_1274_1316_Open_Image.style.display='inline'; Codehighlighter1_1274_1316_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                    </span>
																<span id="Codehighlighter1_1274_1316_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																		<img src="http://www.teachblog.net/images/dot.gif" />
																</span>
																<span id="Codehighlighter1_1274_1316_Open_Text">
																		<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                        </span>
																		<span style="COLOR: #008000">//</span>
																		<span style="COLOR: #008000">这里填写在聊天信息框中显示有新用户的到来的代码</span>
																		<span style="COLOR: #008000">
																				<br />
																				<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
																		</span>
																		<span style="COLOR: #000000">                    }</span>
																</span>
																<span style="COLOR: #000000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span>
														</span>
														<span style="COLOR: #000000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">有用户要退出聊天室时，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">服务器发送该信令给其他客户端，<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">将离开的用户的离开信息通知给其余在线用户。</span>
														<span style="COLOR: #008000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">                </span>
														<span style="COLOR: #0000ff">if</span>
														<span style="COLOR: #000000"> (cmd </span>
														<span style="COLOR: #000000">==</span>
														<span style="COLOR: #000000"> </span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">DN</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1418_1458_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1418_1458_Open_Text.style.display='none'; Codehighlighter1_1418_1458_Closed_Image.style.display='inline'; Codehighlighter1_1418_1458_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1418_1458_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1418_1458_Closed_Text.style.display='none'; Codehighlighter1_1418_1458_Open_Image.style.display='inline'; Codehighlighter1_1418_1458_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span>
														<span id="Codehighlighter1_1418_1458_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																<img src="http://www.teachblog.net/images/dot.gif" />
														</span>
														<span id="Codehighlighter1_1418_1458_Open_Text">
																<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">这里填写在聊天信息框中显示用户的离开信息的代码</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                }</span>
														</span>
														<span style="COLOR: #000000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">如果是出错信息，则从弹出对话框中显示该错误信息<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">弹出对话框使用MessageBox.Show方法</span>
														<span style="COLOR: #008000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">                </span>
														<span style="COLOR: #0000ff">if</span>
														<span style="COLOR: #000000"> (cmd </span>
														<span style="COLOR: #000000">==</span>
														<span style="COLOR: #000000"> </span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">ER</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1546_1576_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1546_1576_Open_Text.style.display='none'; Codehighlighter1_1546_1576_Closed_Image.style.display='inline'; Codehighlighter1_1546_1576_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1546_1576_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1546_1576_Closed_Text.style.display='none'; Codehighlighter1_1546_1576_Open_Image.style.display='inline'; Codehighlighter1_1546_1576_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span>
														<span id="Codehighlighter1_1546_1576_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																<img src="http://www.teachblog.net/images/dot.gif" />
														</span>
														<span id="Codehighlighter1_1546_1576_Open_Text">
																<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">这里填写显示出错信息的代码</span>
																<span style="COLOR: #008000">
																		<br />
																		<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
																</span>
																<span style="COLOR: #000000">                }</span>
														</span>
														<span style="COLOR: #000000">
																<br />
																<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
												</span>
												<span style="COLOR: #000000">                    <br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">发送消息的事件处理</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> btnSend_Click(</span>
						<span style="COLOR: #0000ff">object</span>
						<span style="COLOR: #000000"> sender, System.EventArgs e)<br /><img id="Codehighlighter1_1672_2146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1672_2146_Open_Text.style.display='none'; Codehighlighter1_1672_2146_Closed_Image.style.display='inline'; Codehighlighter1_1672_2146_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1672_2146_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1672_2146_Closed_Text.style.display='none'; Codehighlighter1_1672_2146_Open_Image.style.display='inline'; Codehighlighter1_1672_2146_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_1672_2146_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.teachblog.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1672_2146_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">发送消息的事件。<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">这里需要判断是否私聊<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">普通聊天信息的格式为：*(0/1)nickname_from nickname_to msg<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">具体参考实验指导</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    Byte[] recMsg </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Byte[buffsize]; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">用于容纳发送数据的数组</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    </span>
								<span style="COLOR: #0000ff">string</span>
								<span style="COLOR: #000000"> Msg; </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">普通聊天信息的字符串</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (chkSecret.Checked)<br /><img id="Codehighlighter1_1865_1939_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1865_1939_Open_Text.style.display='none'; Codehighlighter1_1865_1939_Closed_Image.style.display='inline'; Codehighlighter1_1865_1939_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1865_1939_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1865_1939_Closed_Text.style.display='none'; Codehighlighter1_1865_1939_Open_Image.style.display='inline'; Codehighlighter1_1865_1939_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_1865_1939_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.teachblog.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1865_1939_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        Msg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> _____________________________________________________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        Msg </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> _____________________________________________________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    recMsg </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> System.Text.Encoding.BigEndianUnicode.GetBytes(Msg.ToCharArray());<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    ________________________________________;</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">发送数据</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">主界面初始化</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> ClientForm_Load(</span>
						<span style="COLOR: #0000ff">object</span>
						<span style="COLOR: #000000"> sender, System.EventArgs e)<br /><img id="Codehighlighter1_2222_2399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2222_2399_Open_Text.style.display='none'; Codehighlighter1_2222_2399_Closed_Image.style.display='inline'; Codehighlighter1_2222_2399_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2222_2399_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2222_2399_Closed_Text.style.display='none'; Codehighlighter1_2222_2399_Open_Image.style.display='inline'; Codehighlighter1_2222_2399_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_2222_2399_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.teachblog.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2222_2399_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">主界面初始化，需要将聊天信息框、<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">用户列表框和聊天对象下拉框的信息清空。<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">并将“所有人”这个聊天对象加入到聊天对象下拉框中<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">并将其选中。<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">这里开始填写初始化代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">请填写相关代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">定义接收线程</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    recThread </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Thread(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> ThreadStart(rec));<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">连接服务器</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> btnConnect_Click(</span>
						<span style="COLOR: #0000ff">object</span>
						<span style="COLOR: #000000"> sender, System.EventArgs e)<br /><img id="Codehighlighter1_2475_3057_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2475_3057_Open_Text.style.display='none'; Codehighlighter1_2475_3057_Closed_Image.style.display='inline'; Codehighlighter1_2475_3057_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2475_3057_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2475_3057_Closed_Text.style.display='none'; Codehighlighter1_2475_3057_Open_Image.style.display='inline'; Codehighlighter1_2475_3057_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_2475_3057_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.teachblog.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2475_3057_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">连接服务器<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">请进行必要的判断，比如昵称是否为空等<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">这里开始填写连接服务器的代码：<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">请填写相关代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (sock.Connected)<br /><img id="Codehighlighter1_2569_3055_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2569_3055_Open_Text.style.display='none'; Codehighlighter1_2569_3055_Closed_Image.style.display='inline'; Codehighlighter1_2569_3055_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2569_3055_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2569_3055_Closed_Text.style.display='none'; Codehighlighter1_2569_3055_Open_Image.style.display='inline'; Codehighlighter1_2569_3055_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2569_3055_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.teachblog.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_2569_3055_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">登录以后把自己的昵称发送给服务器<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">发送昵称的信令为：@NN Nickname</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        Byte[] recMsg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> Byte[buffsize]; </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">容纳信令的字节数组</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        </span>
										<span style="COLOR: #0000ff">string</span>
										<span style="COLOR: #000000"> cmd; </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">信令字符串</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        cmd </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> ________________________________________________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        recMsg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> System.Text.Encoding.BigEndianUnicode.GetBytes(cmd.ToCharArray());<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        ________________________________________________;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">发送信令</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        ________________________;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">将昵称输入框的Enable属性改为False，禁止用户修改昵称<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">初始化接收线程，并发起该线程</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        Thread recThread </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> Thread(</span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> ThreadStart(rec));<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        recThread.Start();            <br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">断开连接代码</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.teachblog.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> tbnDisconnect_Click(</span>
						<span style="COLOR: #0000ff">object</span>
						<span style="COLOR: #000000"> sender, System.EventArgs e)<br /><img id="Codehighlighter1_3137_3599_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3137_3599_Open_Text.style.display='none'; Codehighlighter1_3137_3599_Closed_Image.style.display='inline'; Codehighlighter1_3137_3599_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_3137_3599_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3137_3599_Closed_Text.style.display='none'; Codehighlighter1_3137_3599_Open_Image.style.display='inline'; Codehighlighter1_3137_3599_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_3137_3599_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.teachblog.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_3137_3599_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">断开连接代码</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (sock.Connected)<br /><img id="Codehighlighter1_3171_3595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3171_3595_Open_Text.style.display='none'; Codehighlighter1_3171_3595_Closed_Image.style.display='inline'; Codehighlighter1_3171_3595_Closed_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_3171_3595_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3171_3595_Closed_Text.style.display='none'; Codehighlighter1_3171_3595_Open_Image.style.display='inline'; Codehighlighter1_3171_3595_Open_Text.style.display='inline';" src="http://www.teachblog.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_3171_3595_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.teachblog.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_3171_3595_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        Byte[] recMsg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> Byte[buffsize]; </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">容纳信令的字节数组</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">string</span>
										<span style="COLOR: #000000"> cmd;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">信令字符串</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        cmd </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> ________________________________________________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        recMsg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> System.Text.Encoding.BigEndianUnicode.GetBytes(cmd.ToCharArray());<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        ________________________________________________;</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">发送信令<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">开始关闭套接字<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">请填写相关代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">清空各个用户列表和聊天对象列表<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">请填写相关代码<br /><img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">将昵称输入框的Enable属性改为True，以便下一次连接</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.teachblog.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        _____________________________;<br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">        <br /><img src="http://www.teachblog.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
				</div>
				<p>
						<br />
				</p>
		</div>
<img src ="http://www.teachblog.net/tangzz/aggbug/3281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-06 16:47 <a href="http://www.teachblog.net/tangzz/archive/2006/11/06/3281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[课件]第二章：Visual C#套接字编程</title><link>http://www.teachblog.net/tangzz/archive/2006/11/06/3280.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Mon, 06 Nov 2006 08:46:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/06/3280.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3280.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/06/3280.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3280.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3280.html</trackback:ping><description><![CDATA[
		<h1>Visual C#套接字编程</h1>
		<ol>
				<li>与套接字相关的类的简介 
<ol type="i"><li><a href="/tangzz/admin/EditArticles.aspx#11">什么是套接字</a></li><li><a href="/tangzz/admin/EditArticles.aspx#12">Socket类以及其常用属性</a></li><li><a href="/tangzz/admin/EditArticles.aspx#13">Socket类常用方法</a></li></ol></li>
				<li>套接字编程示例 </li>
		</ol>
		<h2 class="title1">与套接字相关的类的简介</h2>
		<p class="title2">
				<a name="11">
				</a>什么是套接字</p>
		<p>应用层通过传输层进行数据通信时，会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接，许多计算机操作系统为应用程序与TCP／IP协议交互提供了称为套接字(Socket)的接口。 </p>
		<p>区分不同应用程序进程间的网络通信和连接，主要有3个参数：通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来，与一个“插座”Socket绑定，应用层就可以和传输层通过套接字接口，区分来自不同应用程序进程或网络连接的通信，实现数据传输的并发服务。</p>
		<p>套接字的使用分为两种模式：阻塞模式和非阻塞模式。阻塞模式也称为同步模式，在这种模式下，Socket操作直到全部操作完成后才返回。比如要接收数据包时，必须等到对方将数据包发送过来为止，调用Socket函数的线程在这期间是被挂起的，所以程序看起来好像是停止响应了。显然，要以这种方式执行Socket函数的话，几乎每个函数的使用都会引起程序“停止响应”的假象，所以必须考虑在不同的线程中执行每个Socket函数，这显然是比较麻烦的。</p>
		<p>在BSD UNIX中，套接字是以阻塞模式执行的，这对以命令行方式执行的UNIX程序来说并不是问题，但阻塞模式不是很适合于Windows下的消息驱动体系，所以WinSock为所有的函数提供了非阻塞模式的版本，非阻塞模式又称异步模式，在这种模式下，一个函数执行后会立即返回，即使是操作还没有全部完成，但是当函数最终完成操作的时候，Socket接口会通过某种形式（如窗口消息）通知应用程序，显然这种方式非常适合于Windows下的消息驱动体系。一般来说，Socket接口强烈推荐程序员使用非阻塞模式进行通信编程，仅在绝对有必要的情况下才采用阻塞方式进行通信编程，因为非阻塞模式的操作能够更好地在Windows环境下进行。<br /></p>
		<p>
				<img height="336" alt="2.1.1.gif" src="http://www.teachblog.net/images/teachblog_net/tangzz/2.1.1.gif" width="500" border="0" />
		</p>
		<p class="title2">
				<a id="12" name="12">
				</a>Socket类以及其常用属性</p>
		<p>Socket类为网络通信提供了一套丰富的方法和属性。所要求的命名空间为System.Net.Sockets。其常用属性如下表：</p>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="40%">
												<img height="16" alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" width="16" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassaddressfamilytopic.htm">AddressFamily</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取 <b>Socket</b> 的地址族。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassavailabletopic.htm">Available</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取已经从网络接收且可供读取的数据量。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassblockingtopic.htm">Blocking</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取或设置一个值，该值指示 <b>Socket</b> 是否处于阻塞模式。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassconnectedtopic.htm">Connected</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取一个值，该值指示 <b>Socket</b> 是否已连接到远程主机。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasshandletopic.htm">Handle</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取 <b>Socket</b> 的操作系统句柄。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasslocalendpointtopic.htm">LocalEndPoint</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取本地终结点。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassprotocoltypetopic.htm">ProtocolType</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取 <b>Socket</b> 的协议类型。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassremoteendpointtopic.htm">RemoteEndPoint</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取远程终结点。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssockettypetopic.htm">SocketType</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取 <b>Socket</b> 的类型。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<img height="16" alt="static (Shared in Visual Basic)" src="http://www.teachblog.net/images/teachblog_net/tangzz/static.JPG" width="16" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssupportsipv4topic.htm">SupportsIPv4</a>
										</td>
										<td width="60%">获取一个值，该值指示当前主机上是否拥有并已启用 IPv4 支持功能。如果当前主机支持 IPv4 协议，则为 true；如果不支持，则为 false。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共属性" src="http://www.teachblog.net/images/teachblog_net/tangzz/pa.JPG" border="0" />
												<img height="16" alt="static (Shared in Visual Basic)" src="http://www.teachblog.net/images/teachblog_net/tangzz/static.JPG" width="16" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssupportsipv6topic.htm">SupportsIPv6</a>
										</td>
										<td width="60%">获取一个值，该值指示当前主机上是否拥有并已启用 IPv6 支持功能。如果当前主机支持 IPv6 协议，则为 true；如果不支持，则为 false。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p class="title2">
				<a name="13">
				</a>Socket类常用方法</p>
		<h4 class="dtH4">公共构造函数</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" width="100%" border="1">
						<tbody>
								<tr valign="top">
										<td width="40%">
												<img height="16" alt="公共构造函数" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassctortopic.htm">Socket 构造函数</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">初始化 <b>Socket</b> 类的新实例。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p>
				<i>
						<br />
				</i>
				<span class="emphtitle">注意：</span>
				<i>addressFamily</i> 参数指定 <a href="/tangzz/admin/frlrfsystemnetsocketssocketclasstopic.htm">Socket</a> 使用的地址家族，<i>socketType</i> 参数指定 <b>Socket</b> 的类型，<i>protocolType</i> 参数指定 <b>Socket</b> 使用的协议。<span class="emph">这三个参数不是独立的。</span><span class="emph">有些地址族会限制哪些协议可与其一起使用，同时 <b>Socket</b> 类型在协议中通常是隐式的。如果地址族、<b>Socket</b> 类型和协议类型的组合导致无效的 <b>Socket</b>，则此构造函数将引发 SocketException。</span> 对于我们来讲，最常用的组合有：</p>
		<ul>
				<li>Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );<br /><span class="comment">//定义了一个以TCP协议为通信协议的套接字</span></li>
				<li>Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );<br /><span class="comment">//定义了一个以UDP协议为通信协议的套接字</span><br /></li>
		</ul>
		<h4 class="dtH4">公共方法</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="40%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassaccepttopic.htm">
														<img height="16" alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" width="16" border="0" />Accept</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">为新建连接创建新的 <b>Socket</b>。<b>Accept</b> 以<span class="emph">同步方式</span>从侦听套接字的连接请求队列中提取第一个挂起的连接请求，然后创建并返回新的Socket。在阻塞模式中，<b>Accept</b> 将会持续处于阻塞状态，直到传入的连接尝试进入队列。<br /><span class="emphtitle"><b class="le">注意</b>：</span><span class="emph">在调用 <b>Accept</b> 方法之前，必须首先调用 Listen 方法来侦听传入的连接请求，并将侦听到的请求放入队列中。</span></td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginaccepttopic.htm">BeginAccept</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">
												<p>开始一个异步操作来接受一个传入的连接尝试。<span class="emph">面向连接的协议</span>可以使用 BeginAccept 方法来异步处理传入的连接尝试。</p>
												<p>必须创建实现 AsyncCallback 委托的回调方法，并将其名称传递给 BeginAccept 方法。要实现这一点，<span class="emph">至少必须通过 state 参数把侦听 Socket 传递给 BeginAccept。</span></p>
										</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginconnecttopic.htm">BeginConnect</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">开始一个对远程主机连接的异步请求。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginreceivetopic.htm">BeginReceive</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">开始从连接的 <b>Socket</b> 中异步接收数据。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginreceivefromtopic.htm">BeginReceiveFrom</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">开始从指定网络设备中异步接收数据。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginsendtopic.htm">BeginSend</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">将数据异步发送到连接的 <b>Socket</b>。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbeginsendtotopic.htm">BeginSendTo</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">向特定远程主机异步发送数据。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbindtopic.htm">Bind</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">使 <b>Socket</b> 与一个本地终结点相关联。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassclosetopic.htm">Close</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">关闭 <b>Socket</b> 连接并释放所有关联的资源。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassconnecttopic.htm">Connect</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">建立与远程主机的连接。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendaccepttopic.htm">EndAccept</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">异步接受传入的连接尝试，并创建新的 <b>Socket</b> 来处理远程主机通信。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendconnecttopic.htm">EndConnect</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">结束挂起的异步连接请求。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendreceivetopic.htm">EndReceive</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">结束挂起的异步读取。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendreceivefromtopic.htm">EndReceiveFrom</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">结束挂起的、从特定终结点进行异步读取。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendsendtopic.htm">EndSend</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">结束挂起的异步发送。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassendsendtotopic.htm">EndSendTo</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">结束挂起的、向指定位置进行的异步发送。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclassequalstopic.htm">Equals</a>（从 <b>Object</b> 继承） <br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。确定两个 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclasstopic.htm">Object</a> 实例是否相等。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassgethashcodetopic.htm">GetHashCode</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重写。参见 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclassgethashcodetopic.htm">Object.GetHashCode</a>。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassgetsocketoptiontopic.htm">GetSocketOption</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。返回 <b>Socket</b> 选项的值。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclassgettypetopic.htm">GetType</a>（从 <b>Object</b> 继承） <br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">获取当前实例的 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemtypeclasstopic.htm">Type</a>。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassiocontroltopic.htm">IOControl</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">为 <b>Socket</b> 设置低级别操作模式。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasslistentopic.htm">Listen</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">将 <b>Socket</b> 置于侦听状态。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasspolltopic.htm">Poll</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">确定 <b>Socket</b> 的状态。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassreceivetopic.htm">Receive</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。接收来自绑定的 <b>Socket</b> 的数据。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassreceivefromtopic.htm">ReceiveFrom</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。接收数据文报并存储源终结点。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<img height="16" alt="static (Shared in Visual Basic)" src="http://www.teachblog.net/images/teachblog_net/tangzz/static.JPG" width="16" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassselecttopic.htm">Select</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">确定一个或多个套接字的状态。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssendtopic.htm">Send</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。将数据发送到连接的 <b>Socket</b>。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssendtotopic.htm">SendTo</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。将数据发送到特定终结点。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasssetsocketoptiontopic.htm">SetSocketOption</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">已重载。设置 <b>Socket</b> 选项。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassshutdowntopic.htm">Shutdown</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">禁用某 <b>Socket</b> 上的发送和接收。</td>
								</tr>
								<tr valign="top">
										<td width="40%">
												<img alt="公共方法" src="http://www.teachblog.net/images/teachblog_net/tangzz/pm.JPG" border="0" />
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclasstostringtopic.htm">ToString</a>（从 <b>Object</b> 继承） <br />受 .NET Framework 精简版的支持。</td>
										<td width="60%">返回表示当前 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclasstopic.htm">Object</a> 的 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemstringclasstopic.htm">String</a>。</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.teachblog.net/tangzz/aggbug/3280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-06 16:46 <a href="http://www.teachblog.net/tangzz/archive/2006/11/06/3280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[课件]第一章：Visual C# DNS开发</title><link>http://www.teachblog.net/tangzz/archive/2006/11/06/3278.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Mon, 06 Nov 2006 08:45:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/06/3278.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3278.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/06/3278.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3278.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3278.html</trackback:ping><description><![CDATA[
		<h1>Visual C# DNS开发</h1>
		<ol>
				<li>IP协议和DNS简介 
<ol type="i"><li><a href="/tangzz/admin/DNS.htm#11">IP协议简介</a></li><li><a href="/tangzz/admin/DNS.htm#12">域名简介</a></li></ol></li>
				<li>与DNS相关类的简介 
<ol type="i"><li><a href="/tangzz/admin/DNS.htm#21">Dns类</a></li><li><a href="/tangzz/admin/DNS.htm#22">IPHostEntry类</a></li><li><a href="/tangzz/admin/DNS.htm#23">IPAddress类</a></li><li><a href="/tangzz/admin/DNS.htm#24">DnsPermission类</a></li></ol></li>
				<li>DNS程序示例 
<ol type="i"><li>获取本地主机名称 
</li><li>解析主机 
</li><li>通过主机名获取主机信息 
</li><li>通过UP地址获取主机信息 
</li><li>将整数转换为IP地址格式</li></ol></li>
				<li>DNS集成服务系统 
</li>
				<li>本章小结 </li>
		</ol>
		<h2 class="title1">IP协议和DNS简介</h2>
		<p class="title2">
				<a name="11">
				</a>IP协议简介 </p>
		<table width="700" border="0">
				<tbody>
						<tr valign="top" align="left">
								<td width="370">
										<p class="title3">IP基本概念：</p>
										<p>网际层是整个TCP/IP协议簇的重点，定义了IP，ICMP，ARP，RARP等协议。其中，IP是建立TCP/IP网络的基本协议，向其他运行在网际层中或网际层之上的协议提供了数据传送服务。IP所能提供的服务是无连接和不可靠的（尽力而为的服务）:</p>
										<ul>
												<li>封装数据到IP数据报。 
</li>
												<li>将IP数据报传送到目的地 
</li>
												<li>对数据进行分段 
</li>
												<li>路由选择 </li>
										</ul>
								</td>
								<td width="330">
										<img height="259" alt="1.1.1.JPG" src="http://www.teachblog.net/images/teachblog_net/tangzz/1.1.1.JPG" width="328" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<p class="title3">IP基本操作：</p>
		<p>IP协议的工作原理是：IP数据包到达网关后，本地网络接口去掉网络头（如果存在网络头），将结果传送给IP模块。由这个IP模块决定本地网络地址，然后传送数据报到本地网络接口。该本地网络接口创建一个本地网络头加在数据报上，将数据报传送到目的主机。在目的主机上，其网络接口去掉数据报上的网络头，将结果交给IP模块。IP模块决定把数据报向哪一个应用程序传送，然后系统发出系统调用，IP模块返回源地址和其他参数。</p>
		<p class="title3">IP地址</p>
		<p>在IPv4的IP地址包括4个字节，它定义了两个部分：NETID和HOSTID。其中NETID标识一个网络，而HOSTID标识在该网络上的一个主机。因此因特网地址是一种层次型地址，携带有对象位置的信息。<br />IP地址的一般格式为：类别 + Netid + Hostid，其中：</p>
		<ol>
				<li>类别：用来区分IP地址的类型： 
</li>
				<li>网络标识（Netid）：表示入网主机所在的网络 
</li>
				<li>主机标识（Hostid）：表示入网主机在本网段中的标识。 </li>
		</ol>
		<table height="30" cellspacing="0" cellpadding="0" width="400" border="1">
				<tbody>
						<tr valign="center" align="middle">
								<td bgcolor="#ffccff">类别</td>
								<td bgcolor="#ccff99">NetID</td>
								<td bgcolor="#66ffff">HostID</td>
						</tr>
				</tbody>
		</table>
		<p>通常将因特网IP地址分成5种类型：（A类、B类、C类、D类、E类） </p>
		<p>
				<img height="344" alt="1.1.2.JPG" src="http://www.teachblog.net/images/teachblog_net/tangzz/1.1.2.JPG" width="463" border="0" />
		</p>
		<p>
				<span class="title4">A类地址：</span>
				<br />网络标识占1个字节，第1位为“0”，允许有27-2=126个A类网络，每个网络大约允许有1670万台主机。通常分配给拥有大量主机的网络，如一些大公司（如IBM公司等）和因特网主干网络。net-id范围是1～126。</p>
		<p>
				<span class="title4">B类地址：</span>
				<br />网络标识占2个字节，第1，2位为“10”，允许有214=16383个网络，每个网络大约允许有65533台主机。通常分配给结点比较多的网络，如区域网。net-id范围是128～191。</p>
		<p>
				<span class="title4">C类地址:</span>
				<br />网络标识占3个字节，第123位为110，允许有221=2,097,151个网络，每个网络大约允许有254台主机。通常分配给结点比较少的网络，如校园网。一些大的校园网可以拥有多个C类地址。net-id范围是192～223。</p>
		<p>
				<span class="title4">D类地址：</span>
				<br />前4位为“1110”，用于多址投递系统（组播）。目前使用的视频会议等应用系统都采用了组播技术进行传输。net-id范围是224～239。</p>
		<p>
				<span class="title4">E类地址：</span>
				<br />前4位为“11110”，保留未用。net-id范围是240～255。</p>
		<p class="title4">特殊地址：<br /><img height="313" alt="1.1.3.JPG" src="http://www.teachblog.net/images/teachblog_net/tangzz/1.1.3.JPG" width="591" border="0" /></p>
		<p class="title2">
				<a name="12">
				</a>域名简介</p>
		<ol>
				<li>因特网采用了层次树状结构的命名方法。 
</li>
				<li>任何一个连接在因特网上的主机或路由器，都有一个惟一的层次结构的名字，即域名。 
</li>
				<li>域名的结构由若干个分量组成，各分量之间用点隔开： … .三级域名.二级域名.顶级域名 
</li>
				<li>各分量分别代表不同级别的域名。 </li>
		</ol>
		<p>DNS用于域名和IP地址的解析，其工作原理如下：</p>
		<ol>
				<li>DNS客户向本地的DNS服务器发出解析请求 
</li>
				<li>如果该DNS服务器本身含有客户所需要的数据，则直接返回给客户，如果没有，则服务器与其他DNS服务器联系，从其他DNS服务器上获取数据，然后返回给用户 
</li>
				<li>如果解析不成功，则返回解析失败的异常信息 </li>
		</ol>
		<p class="title1">与DNS相关类的简介</p>
		<p class="title1">
				<span class="title2">
						<a name="21">
						</a>DNS类</span>
		</p>
		<p>
				<b>Dns</b> 类是一个静态类，它从 Internet 域名系统 (DNS) 检索关于特定主机的信息。参看MSDN：<br /><a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetDnsMembersTopic.htm">ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetDnsMembersTopic.htm</a></p>
		<h4>公共方法：</h4>
		<table class="dtTABLE" cellspacing="0" border="1">
				<tbody>
						<tr valign="top">
								<td width="50%" height="36">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassbegingethostbynametopic.htm">BeginGetHostByName</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">开始异步请求关于指定 DNS 主机名的 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclasstopic.htm">IPHostEntry</a> 信息。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassbeginresolvetopic.htm">BeginResolve</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">开始异步请求将 DNS 主机名或 IP 地址解析为 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclasstopic.htm">IPAddress</a> 实例。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassendgethostbynametopic.htm">EndGetHostByName</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">结束对 DNS 信息的异步请求。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassendresolvetopic.htm">EndResolve</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">结束对 DNS 信息的异步请求。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassgethostbyaddresstopic.htm">GetHostByAddress</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">已重载。获取 IP 地址的 DNS 主机信息。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassgethostbynametopic.htm">GetHostByName</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">获取指定 DNS 主机名的 DNS 信息。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassgethostnametopic.htm">GetHostName</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">获取本地计算机的主机名。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnsclassresolvetopic.htm">Resolve</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">将 DNS 主机名或 IP 地址解析为 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclasstopic.htm">IPHostEntry</a> 实例。</td>
						</tr>
				</tbody>
		</table>
		<p class="title2">
				<a name="22">
				</a>IPHostEntry类</p>
		<p>
				<b>IPHostEntry</b> 类将一个域名系统 (DNS) 主机名与一组别名和一组匹配的 IP 地址关联。参看MSDN：<br /><a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetIPHostEntryMembersTopic.htm">ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetIPHostEntryMembersTopic.htm</a></p>
		<h4 class="dtH4">公共构造函数</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" width="600" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclassctortopic.htm">IPHostEntry 构造函数</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="50%">初始化 <b>IPHostEntry</b> 类的新实例。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h4>公共属性：</h4>
		<table class="dtTABLE" cellspacing="0" width="600" border="1">
				<tbody>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclassaddresslisttopic.htm">AddressList</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">获取或设置与主机关联的 IP 地址列表。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclassaliasestopic.htm">Aliases</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">获取或设置与主机关联的别名列表。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetiphostentryclasshostnametopic.htm">HostName</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">获取或设置主机的 DNS 名称。</td>
						</tr>
				</tbody>
		</table>
		<p>
				<span class="title2">
						<a name="23">
						</a>IPAddress类</span>
		</p>
		<p>参看MSDN：<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetIPAddressMembersTopic.htm">ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetIPAddressMembersTopic.htm</a></p>
		<h4 class="dtH4">公共构造函数</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%" height="65">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassctortopic.htm">IPAddress 构造函数<br /></a>受 .NET Framework 精简版的支持。</td>
										<td width="50%">已重载。初始化 <b>IPAddress</b> 类的新实例。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h4 class="dtH4">公共字段</h4>
		<table class="dtTABLE" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassanytopic.htm">Any</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">提供一个IP 地址，指示服务器应侦听所有网络接口上的客户端活动。此字段为只读。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassbroadcasttopic.htm">Broadcast</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">提供 IP 广播地址。此字段为只读。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassipv6anytopic.htm">IPv6Any</a>
								</td>
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclassbindtopic.htm">Socket.Bind</a> 方法使用 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassipv6anytopic.htm">IPv6Any</a> 字段指示 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssocketclasstopic.htm">Socket</a> 侦听所有网络接口上的客户端活动。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassipv6loopbacktopic.htm">IPv6Loopback</a>
								</td>
								<td width="50%">提供 IP 环回地址。此属性为只读。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassipv6nonetopic.htm">IPv6None</a>
								</td>
								<td width="50%">提供指示不应使用任何网络接口的 IP 地址。此属性为只读。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassloopbacktopic.htm">Loopback</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">提供 IP 环回地址。此字段为只读。</td>
						</tr>
						<tr valign="top">
								<td width="50%">
										<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassnonetopic.htm">None</a>
										<br />受 .NET Framework 精简版的支持。</td>
								<td width="50%">提供指示不应使用任何网络接口的 IP 地址。此字段为只读。</td>
						</tr>
				</tbody>
		</table>
		<div class="tablediv">
		</div>
		<h4 class="dtH4">公共属性</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" cellpadding="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassaddresstopic.htm">Address<br /></a>受 .NET Framework 精简版的支持。</td>
										<td width="50%">
												<font color="red">
														<b>已过时.</b>
												</font>网际协议 (IP) 地址。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassaddressfamilytopic.htm">AddressFamily</a>
										</td>
										<td width="50%">获取 IP 地址的地址族。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassscopeidtopic.htm">ScopeId</a>
										</td>
										<td width="50%">获取或设置 IPv6 地址范围标识符。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h4 class="dtH4">公共方法</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassequalstopic.htm">Equals</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="50%">已重写。比较两个 IP 地址。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclasshosttonetworkordertopic.htm">HostToNetworkOrder</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="50%">已重载。将值由主机字节顺序转换为网络字节顺序。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassisloopbacktopic.htm">IsLoopback</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="50%">指示指定的 IP 地址是否是环回地址。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassnetworktohostordertopic.htm">NetworkToHostOrder</a>
												<br />受 .NET Framework 精简版的支持。</td>
										<td width="50%">已重载。将数字由网络字节顺序转换为主机字节顺序。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<p>
														<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclassparsetopic.htm">Parse</a>
														<br />受 .NET Framework 精简版的支持。</p>
										</td>
										<td width="50%">将 IP 地址字符串转换为 <b>IPAddress</b> 实例。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetipaddressclasstostringtopic.htm">ToString<br /></a>受 .NET Framework 精简版的支持。</td>
										<td width="50%">已重写。将 Internet 地址转换为标准表示法。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p>DnsPermission类</p>
		<p>用于控制对网络上域名系统 (DNS) 服务器的访问权限。默认权限允许所有的本地和 Intranet 区域的应用程序访问 DNS 服务，并且 Internet 区域的应用程序没有 DNS 权限。MSDN参看：<br /><a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetDnsPermissionMembersTopic.htm">ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetDnsPermissionMembersTopic.htm</a></p>
		<h4 class="dtH4">公共构造函数</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnspermissionclassctortopic.htm">DnsPermission 构造函数</a>
										</td>
										<td width="50%">创建 <b>DnsPermission</b> 类的新实例，该类或者允许无限制的 DNS 访问，或者不允许 DNS 访问。</td>
								</tr>
						</tbody>
				</table>
		</div>
		<h4 class="dtH4">公共方法</h4>
		<div class="tablediv">
				<table class="dtTABLE" cellspacing="0" border="1">
						<tbody>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemsecuritycodeaccesspermissionclassdenytopic.htm">Deny</a>（从 <b>CodeAccessPermission</b> 继承）</td>
										<td width="50%">防止调用堆栈中处于较高位置的调用方通过调用此方法的代码来访问由当前实例指定的资源。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclassequalstopic.htm">Equals</a>（从 <b>Object</b> 继承）</td>
										<td width="50%">已重载。确定两个 <a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemobjectclasstopic.htm">Object</a> 实例是否相等。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemsecuritycodeaccesspermissionclasspermitonlytopic.htm">PermitOnly</a>（从 <b>CodeAccessPermission</b> 继承）</td>
										<td width="50%">防止调用堆栈中处于较高位置的调用方通过调用此方法的代码来访问除当前实例指定的资源外的所有资源。</td>
								</tr>
								<tr valign="top">
										<td width="50%">
												<a href="ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetdnspermissionclassuniontopic.htm">Union</a>
										</td>
										<td width="50%">已重写。创建一个是当前权限实例与指定权限实例的并集的权限实例。</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.teachblog.net/tangzz/aggbug/3278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-06 16:45 <a href="http://www.teachblog.net/tangzz/archive/2006/11/06/3278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[实验指导]C#网络编程实验一：DNS协议开发</title><link>http://www.teachblog.net/tangzz/archive/2006/11/06/3279.html</link><dc:creator>阿土仔的世界</dc:creator><author>阿土仔的世界</author><pubDate>Mon, 06 Nov 2006 08:45:00 GMT</pubDate><guid>http://www.teachblog.net/tangzz/archive/2006/11/06/3279.html</guid><wfw:comment>http://www.teachblog.net/tangzz/comments/3279.html</wfw:comment><comments>http://www.teachblog.net/tangzz/archive/2006/11/06/3279.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.teachblog.net/tangzz/comments/commentRss/3279.html</wfw:commentRss><trackback:ping>http://www.teachblog.net/tangzz/services/trackbacks/3279.html</trackback:ping><description><![CDATA[
		<h1>实验一：DNS协议开发</h1>
		<p>
				<strong>实验目的：</strong>
		</p>
		<ul>
				<li>学习利用Visual C#.Net有关DNS以及IP的类 
</li>
				<li>学习基本UI控件的使用 
</li>
				<li>熟悉Visual Studio.Net的开发环境 
</li>
				<li>熟悉Visual Studio.Net环境下程序的跟踪和调试 </li>
		</ul>
		<p>
				<strong>实验内容：</strong>开发一个DNS集成服务系统。该系统应该具有如下功能：</p>
		<ul>
				<li>获取本地主机信息，包括本地主机名和本地IP地址； 
</li>
				<li>通过设定IP地址范围来扫描主机名称； 
</li>
				<li>通过主机名称查询IP地址； 
</li>
				<li>能够保存、查看和删除查询记录 </li>
		</ul>
		<p>具体实验指导，请点击：<a href="http://tzzblog.51086.com/Uploaded/doc/网络编程实验指导.doc" target="_blank">网络编程实验指导.doc</a><br />点击下载实验报告模板：<a href="http://tzzblog.51086.com/Uploaded/doc/网络编程实验一.doc" target="_blank">网络编程实验一.doc</a></p>
<img src ="http://www.teachblog.net/tangzz/aggbug/3279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.teachblog.net/tangzz/" target="_blank">阿土仔的世界</a> 2006-11-06 16:45 <a href="http://www.teachblog.net/tangzz/archive/2006/11/06/3279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>