100165789.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 684 行 · 第 1/3 页

HTM
684
字号
style='font-family:黑体'>类</span></h4>

<p class=MsoNormal><a FTEL=udp><span style='font-family:宋体'>可以看出,与</span><span
lang=EN-US>TcpClient </span></a><span style='font-family:宋体'>相比,</span><span
lang=EN-US>UdpClient</span><span style='font-family:宋体'>类提供了一个较小、较简单的界面。这反映出</span><span
lang=EN-US>UDP</span><span style='font-family:宋体'>协议相对简单的本质。</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>和</span><span lang=EN-US>UDP</span><span
style='font-family:宋体'>类都在后台使用套接字,但</span><span lang=EN-US>UdpClient</span><span
style='font-family:宋体'>类不包含返回网络流以读写数据的方法。相反,成员函数</span><span lang=EN-US>Send()</span><span
style='font-family:宋体'>把一个字节数组作为参数,</span><span lang=EN-US>Receive()</span><span
style='font-family:宋体'>函数则返回一个字节数组。另外,因为</span><span lang=EN-US>UDP</span><span
style='font-family:宋体'>是一个无连接的协议,所以可以指定把通信的端点,作为</span><span lang=EN-US>Send() </span><span
style='font-family:宋体'>和</span><span lang=EN-US> Receive()</span><span
style='font-family:宋体'>方法的一个参数,而不是在前面的构造函数或</span><span lang=EN-US>Connect()</span><span
style='font-family:宋体'>方法中指定。也可以在某个后续的发送或接收过程中修改端点。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>下面的代码段使用</span><span
lang=EN-US>UdpClient</span><span style='font-family:宋体'>类给回应服务</span><span
lang=EN-US>(echo service)</span><span style='font-family:宋体'>发送消息。带有回应服务的服务器在端口</span><span
lang=EN-US>7</span><span style='font-family:宋体'>处接收</span><span lang=EN-US>TCP</span><span
style='font-family:宋体'>或</span><span lang=EN-US>UDP</span><span
style='font-family:宋体'>连接。回应服务值把发送给服务器的数据再发送回客户机。这个服务可用于诊断和测试,但许多系统管理员从安全的角度考虑,不启用回应服务。</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>using System;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Text;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Net;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Net.Sockets;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>namespace
Wrox.ProCSharp.InternetAccess.UdpExample</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
class Class1</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[STAThread]</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
static void Main(string[] args)</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
UdpClient udpClient = new UdpClient();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
string sendMsg = &quot;Hello Echo Server&quot;;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
byte [] sendBytes = Encoding.ASCII.GetBytes(sendMsg);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
udpClient.Send(sendBytes, sendBytes.Length, &quot;SomeEchoServer.net&quot;, 7);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
IPEndPoint endPoint = new IPEndPoint(0,0);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
byte [] rcvBytes = udpClient.Receive(ref endPoint);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
string rcvMessage = Encoding.ASCII.GetString(rcvBytes, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
0,</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
rcvBytes.Length);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// should print out &quot;Hello Echo Server&quot;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(rcvMessage);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
}</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>}</span></p>

<p class=MsoNormal><span lang=EN-US>Encoding.ASCII</span><span
style='font-family:宋体'>类常常用于把字符串转换为字节数组,或把字节数组转换为字符串。还要注意</span><span
lang=EN-US>IPEndPoint</span><span style='font-family:宋体'>应按引用传送给</span><span
lang=EN-US>Receive()</span><span style='font-family:宋体'>方法。</span><span
lang=EN-US>UDP</span><span style='font-family:宋体'>不是一个面向连接的协议,所以对</span><span
lang=EN-US>Receive()</span><span style='font-family:宋体'>的每次调用都会从不同的端点读取数据,</span><span
lang=EN-US>Receive()</span><span style='font-family:宋体'>会用发送主机的</span><span
lang=EN-US>IP</span><span style='font-family:宋体'>地址和端口填充该参数。</span></p>

<p class=MsoNormal><span lang=EN-US>UdpClient </span><span style='font-family:
宋体'>和</span><span lang=EN-US> TcpClient</span><span style='font-family:宋体'>在最低层的类</span><span
lang=EN-US>Socket</span><span style='font-family:宋体'>上提供了一个抽象层。</span></p>

<h4 style='FTEL:21.45pt'><span lang=EN-US>5. Socket</span><span
style='font-family:黑体'>类</span></h4>

<p class=MsoNormal><a FTEL=sock><span lang=EN-US>Socket</span></a><span
style='font-family:宋体'>类提供了网络编程的最高级控制。说明该类的最简单方式是用</span><span lang=EN-US>Socket</span><span
style='font-family:宋体'>类重新编写</span><span lang=EN-US>TcpReceive</span><span
style='font-family:宋体'>应用程序。更新后的</span><span lang=EN-US>Listen()</span><span
style='font-family:宋体'>方法如下所示:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>public void Listen()</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
Socket listener = new Socket(AddressFamily.InterNetwork, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
SocketType.Stream, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ProtocolType.Tcp);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
listener.Bind(new IPEndPoint(IPAddress.Any, 2112));</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
listener.Listen(0);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
Socket socket = listener.Accept();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
Stream netStream = new NetworkStream(socket);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
StreamReader reader = new StreamReader(netStream);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;
</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
string result = reader.ReadToEnd();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
Invoke(new UpdateDisplayDelegate(UpdateDisplay), </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
new object[] {result} );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
socket.Close();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
listener.Close();</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>}</span></p>

<p class=MsoNormal><span lang=EN-US>Socket</span><span style='font-family:宋体'>类需要再编写几行代码来完成相同的任务。对于初学者来说,构造函数的参数需要为使用</span><span
lang=EN-US>TCP</span><span style='font-family:宋体'>协议的流套接字指定</span><span
lang=EN-US>IP</span><span style='font-family:宋体'>寻址模式。这些参数只是可用于</span><span
lang=EN-US>Socket</span><span style='font-family:宋体'>类的许多组合中的一个,</span><span
lang=EN-US>TcpClient</span><span style='font-family:宋体'>类会配置这些设置。接着把监听器的套接字绑定到一个端口上,开始监听传入的连接。当传入一个连接时,就可以使用</span><span
lang=EN-US>Accept()</span><span style='font-family:宋体'>方法创建一个新的套接字,来处理该连接。最后为套接字创建一个</span><span
lang=EN-US>StreamReader</span><span style='font-family:宋体'>实例,来读取传入的数据,其方式与前面的大致相同。</span></p>

<p class=MsoNormal><span lang=EN-US>Socket</span><span style='font-family:宋体'>类也包含许多方法,用于异步接收、连接、发送和接收数据。使用这些方法和回调委托的方式与前面用</span><span
lang=EN-US>WebRequest</span><span style='font-family:宋体'>类请求异步页面的方式相同。如果确实需要了解套接字的内部情况,可以使用</span><span
lang=EN-US>GetSocketOption() </span><span style='font-family:宋体'>和</span><span
lang=EN-US> SetSocketOption()</span><span style='font-family:宋体'>方法,它们允许查看和配置各种选项,包括超时、生存期和其他低级选项。</span></p>







</div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165787.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165790.htm">下一页</a>
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165789.htm'><font color='red'>31.5  较低层的协议</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165785.htm'>31.4  实用工具类</a></div><div style='float:right;width:49%'>·<a href='100165786.htm'>31.4.1  URI</a></div><div style='float:left;width:49%'>·<a href='100165787.htm'>31.4.2  IP地址和DNS名称</a></div><div style='float:right;width:49%'>·<a href='100165790.htm'>31.6  小结</a></div><div style='float:left;width:49%'>·<a href='100165791.htm'>32.1  Windows服务</a></div><div style='float:right;width:49%'>·<a href='100165792.htm'>32.2  Windows服务的体系结构</a></div></div>
                    </div>
                </div>
                </div>
        </div>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?