第八章 网络程序设计.ppt

上传人:s****8 文档编号:82696926 上传时间:2023-03-26 格式:PPT 页数:45 大小:330.50KB
返回 下载 相关 举报
第八章 网络程序设计.ppt_第1页
第1页 / 共45页
第八章 网络程序设计.ppt_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《第八章 网络程序设计.ppt》由会员分享,可在线阅读,更多相关《第八章 网络程序设计.ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C#程序设计与案例教程清华大学出版社第八章第八章 网络程序设计网络程序设计在分布式应用程序中,基于客户端和服务器的各种网络编程序技术应用非常广泛。C#对网络程序设计提供了强大的支持,在System.Net命名空间中包含了许多用于网络程序设计的类。1 1版权所有版权所有C#程序设计与案例教程清华大学出版社目录l l网络程序设计基础网络程序设计基础l l面向连接的套接字面向连接的套接字l l面向无连接的套接字面向无连接的套接字 2 2版权所有版权所有C#程序设计与案例教程清华大学出版社8.1网络程序设计基础n nSystem.NetSystem.Net命名空间为当前网络上使用的多种命名空间为当前网

2、络上使用的多种协议提供了简单的编程接口。协议提供了简单的编程接口。8.1.1 网络协议n n网络协议是网络上计算机为交换数据所必须遵网络协议是网络上计算机为交换数据所必须遵守的通信规范和消息格式的集合。目前常用的守的通信规范和消息格式的集合。目前常用的网络协议有网络协议有TCPTCP协议和协议和UDPUDP协议。协议。3 3版权所有版权所有C#程序设计与案例教程清华大学出版社1.TCP协议协议n nTCPTCP是是TranferTranferControlProtocolControlProtocol的简称,是一种的简称,是一种面向连接的保证可靠传输的协议。通过面向连接的保证可靠传输的协议。通

3、过TCPTCP协议协议传输,得到的是一个顺序的无差错的数据流。发传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个送方和接收方的成对的两个SocketSocket之间必须建立之间必须建立连接,以便在连接,以便在TCPTCP协议的基础上进行通信,当一协议的基础上进行通信,当一个个SocketSocket(通常都是(通常都是ServerSocketServerSocket)等待建立)等待建立连接时,另一个连接时,另一个SocketSocket可以请求连接,一旦这两可以请求连接,一旦这两个个SocketSocket连接起来,它们就可以进行双向数据传连接起来,它们就可以进行双向数据传输

4、,双方都可以进行发送或接收操作。输,双方都可以进行发送或接收操作。4 4版权所有版权所有C#程序设计与案例教程清华大学出版社2.UDP协议协议n nUDPUDP是是UserDatagramProtocolUserDatagramProtocol的简称,是一种的简称,是一种无连接的协议,每个数据报都是一个独立的信息,无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被到达目的地的时间以及内容的

5、正确性都是不能被保证的。保证的。使用使用UDPUDP时,每个数据报中都给出了完整的时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连地址信息,因此无需要建立发送方和接收方的连接。使用接。使用TCPTCP协议,由于它是一个面向连接的协协议,由于它是一个面向连接的协议,在议,在SocketSocket之间进行数据传输之前必然要建立之间进行数据传输之前必然要建立连接,所以在连接,所以在TCPTCP中多了一个连接建立的时间。中多了一个连接建立的时间。5 5版权所有版权所有C#程序设计与案例教程清华大学出版社8.1.2 有关的概念1 1IPIP地址地址地址地址标识计算机等网络设备的

6、网络地址,由四个标识计算机等网络设备的网络地址,由四个8 8位的二进制数组成,中间以小数点分隔。例如:位的二进制数组成,中间以小数点分隔。例如:166.111.136.3,166.111.52.80166.111.136.3,166.111.52.802 2主机名主机名主机名主机名(hostname)(hostname)网络地址的助记名,按照域名进行分级管理。网络地址的助记名,按照域名进行分级管理。如:如: 6 6版权所有版权所有C#程序设计与案例教程清华大学出版社3 3端口号端口号端口号端口号(port number)(port number)网络通信时同一机器上的不同进程的标识。如网络通信

7、时同一机器上的不同进程的标识。如:8080,2121,2323,2525,其中,其中1102411024为系统保留的端为系统保留的端口号口号4 4服务类型服务类型服务类型服务类型(service)(service)网络的各种服务。如:网络的各种服务。如:http,telnet,ftp,http,telnet,ftp,smtpsmtp5 5协议名(协议名(协议名(协议名(protocolprotocol)指明获取资源所使用的传输协议,如:指明获取资源所使用的传输协议,如:httphttp、ftpftp、gophergopher、filefile7 7版权所有版权所有C#程序设计与案例教程清华大学

8、出版社6资源名(资源名(resourceName)n n是资源的完整地址,包括主机名、端口号、文件是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。例如:名或文件内部的一个引用。例如:http:/http:/ n在在InternetInternet上,上,IPIP地址和主机名是一一对应的,地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的通过域名解析可以由主机名得到机器的IPIP,由于,由于机器名更接近自然语言,容易记忆,所以使用比机器名更接近自然语言,容易记忆,所以使用比IPIP地址广泛,但是对机器而言只有地址广泛,但是对机器而言只有IPIP地址才是有地址才是有效的

9、标识符。效的标识符。8 8版权所有版权所有C#程序设计与案例教程清华大学出版社8.1.3 8.1.3 IPAddressIPAddress和和IPEndPointIPEndPoint类类在在System.NetSystem.Net命名空间中,有两个专门用于处理各种类型的命名空间中,有两个专门用于处理各种类型的IPIP地址信息的类型:地址信息的类型:IPAddressIPAddress类和类和IPEndPointIPEndPoint类。类。1.IPAddress1.IPAddress类类类类IPAddressIPAddress类用于表示一个类用于表示一个IPIP地址,一般使用地址,一般使用Par

10、seParse方法创建方法创建IPAddressIPAddress的实例。的实例。IPAddressIPAddress ipip=IPAddress.Parse(192.168.1.1);=IPAddress.Parse(192.168.1.1);IPAddressIPAddress类还提供了类还提供了4 4个只读属性,分别代表程序中使用的特个只读属性,分别代表程序中使用的特殊殊IPIP地址:地址:(1 1)AnyAny:代表本地系统可用的任何:代表本地系统可用的任何IPIP地址。地址。(2 2)BroadcastBroadcast:代表本地网络的:代表本地网络的IPIP广播地址。广播地址。(

11、3 3)LoopbackLoopback:代表系统的回送地址。:代表系统的回送地址。(4 4)NoneNone:代表系统上没有网络接口。:代表系统上没有网络接口。在在System.NetSystem.Net命名空间下,包含有一个命名空间下,包含有一个DnsDns类,可以利用该类类,可以利用该类的的GetHostNameGetHostName()()方法找到本地系统的主机名,然后再用方法找到本地系统的主机名,然后再用GetHostByNameGetHostByName()()找到主机的找到主机的IPIP地址。地址。9 9版权所有版权所有C#程序设计与案例教程清华大学出版社2.IPEndPoint

12、2.IPEndPoint类类类类IPEndPointIPEndPoint对象用于表示指定的对象用于表示指定的IPIP地址地址/端口的组合。端口的组合。其构造函数为:其构造函数为:IPEndPoint(IPAddressIPEndPoint(IPAddressaddress,address,intintport);port);该类有几个常用的属性:该类有几个常用的属性:(1 1)AddressAddress:得到或者设置:得到或者设置IPIP地址。地址。(2 2)AddressFamilyAddressFamily:获取网际协议获取网际协议(IP)(IP)地址族。地址族。(3 3)Port:Po

13、rt:获取或设置终结点的获取或设置终结点的 TCPTCP端口号端口号.1010版权所有版权所有C#程序设计与案例教程清华大学出版社8.1.4 8.1.4 套接字套接字(SocketSocket)System.Net.SocketsSystem.Net.Sockets命名空间包含了一个命名空间包含了一个SocketSocket类,它类,它是最基础的网络编程序接口。是最基础的网络编程序接口。SocketSocket类的构造函数为:类的构造函数为:publicSocket(publicSocket(AddressFamilyAddressFamily addressFamilyaddressFami

14、ly,SocketTypeSocketType socketTypesocketType,ProtocolTypeProtocolType protocolTypeprotocolType););addressFamilyaddressFamily 参数指定参数指定SocketSocket使用的寻址方案,使用的寻址方案,socketTypesocketType 参数指定参数指定SocketSocket的类型,的类型,protocolTypeprotocolType 参参数指定数指定 SocketSocket使用的协议。对于网络上的使用的协议。对于网络上的IPIP通信来说,通信来说,addres

15、sFamilyaddressFamily总是使用总是使用AddressFamily.InterNetworkAddressFamily.InterNetwork枚举值。枚举值。1111版权所有版权所有C#程序设计与案例教程清华大学出版社1212版权所有版权所有C#程序设计与案例教程清华大学出版社与与SocketSocket相关的操作:相关的操作:(1 1)接受请求)接受请求SocketAccept();/SocketAccept();/创建一个套接字来处理到来的连接请求。创建一个套接字来处理到来的连接请求。(2 2)绑定地址)绑定地址voidvoidBind(IPEndPointBind(IP

16、EndPoint localEPlocalEP);/);/使使 SocketSocket与一个本地终结与一个本地终结点相关联。点相关联。如果需要使用特定的本地终结点,请使用如果需要使用特定的本地终结点,请使用Bind()Bind()方法。必须方法。必须先调用先调用Bind()Bind(),然后才能调用,然后才能调用Listen()Listen()方法。如果不介意分方法。如果不介意分配哪个本地地址,则可以用配哪个本地地址,则可以用 IPAddress.AnyIPAddress.Any作为地址参数作为地址参数创建一个创建一个 IPEndPointIPEndPoint,这样,基础服务提供程序将会分配

17、,这样,基础服务提供程序将会分配最适合的网络地址。最适合的网络地址。1313版权所有版权所有C#程序设计与案例教程清华大学出版社(3 3)建立连接)建立连接voidvoidConnect(IPEndPointConnect(IPEndPoint ipip););用来与远程服务器建立连接。连接之后,可以用用来与远程服务器建立连接。连接之后,可以用SendSend()()发送数据或用发送数据或用Receive()Receive()函数接收数据。函数接收数据。(4 4)监听请求)监听请求voidvoidListen(intListen(intbacklog);/backlogbacklog);/ba

18、cklog指定队列中最指定队列中最多可容纳的等待接受的传入连接数。多可容纳的等待接受的传入连接数。设置套接字处于监听状态。当数据到达某个端口设置套接字处于监听状态。当数据到达某个端口时,它会向主机发送通知消息。时,它会向主机发送通知消息。1414版权所有版权所有C#程序设计与案例教程清华大学出版社(5 5)发送数据)发送数据使用使用Send()Send()或或SendToSendTo()()方法方法。intint Send(byteSend(bytebuffer);buffer);intint SendTo(byteSendTo(bytebuffer,IPEndPointbuffer,IPEn

19、dPoint remoteIPremoteIP);/);/向指定的地向指定的地址发送数据址发送数据发送数据还可以使用发送数据还可以使用NetWorkStreamNetWorkStream对象。创建对象。创建NetWorkStreamNetWorkStream对象的方法是:对象的方法是:NetWorkStreamNetWorkStream netstreamnetstream=new=newNetWrokStream(clientSocketNetWrokStream(clientSocket););Stringmessage=“Stringmessage=“发送的信息发送的信息”;byteb=

20、byteb=System.Text.Encoding.Unicode.GetBytes(messageSystem.Text.Encoding.Unicode.GetBytes(message););netstream.Write(bnetstream.Write(b,0,0,b.Lengthb.Length););1515版权所有版权所有C#程序设计与案例教程清华大学出版社(6 6)接受数据)接受数据使用使用Receive()Receive()或或ReceiveFromReceiveFrom()()接收数据。接收数据。intint Receive(byteReceive(bytebuffer

21、);buffer);intint ReceiveFrom(byteReceiveFrom(bytebuffer,refbuffer,refIPEndPointIPEndPoint ipip)(7 7)关闭)关闭 使用使用Shutdown()Shutdown()关闭套接字关闭套接字。publicpublicvoidvoidShutdown(Shutdown(SocketShutdownSocketShutdown howhow););howhow指定不再允许执行的操作,指定不再允许执行的操作,其取值见下表:其取值见下表:1616版权所有版权所有C#程序设计与案例教程清华大学出版社1717版权所有

22、版权所有C#程序设计与案例教程清华大学出版社8.1.58.1.5 网络流网络流(NetworkStreamNetworkStream)n nNetworkStreamNetworkStream类提供用于网络访问的基础数据流。它类提供用于网络访问的基础数据流。它提供了在阻塞模式下通过提供了在阻塞模式下通过 StreamStream套接字发送和接收数套接字发送和接收数据的方法。要创建据的方法。要创建NetworkStreamNetworkStream,必须提供连接的,必须提供连接的SocketSocket。也可指定。也可指定 NetworkStreamNetworkStream 对所提供的对所提供

23、的SocketSocket具有哪些具有哪些FileAccessFileAccess权限。默认情况下,关闭权限。默认情况下,关闭 NetworkStreamNetworkStream 并不会关闭所提供的并不会关闭所提供的SocketSocket。如果要。如果要使使 NetworkStreamNetworkStream 拥有关闭所提供的拥有关闭所提供的 SocketSocket的权限,的权限,则必须将则必须将ownsSocketownsSocket构造函数参数的值指定为构造函数参数的值指定为 truetrue。n n该类的该类的Write()Write()和和Read()Read()方法用于简单的

24、单线程同步阻方法用于简单的单线程同步阻塞塞 I/OI/O。若要使用不同的线程来处理。若要使用不同的线程来处理I/OI/O,则请考虑使用,则请考虑使用BeginWriteBeginWrite()/()/EndWriteEndWrite()()和和BeginReadBeginRead()/()/EndReadEndRead()()方方法进行通信。法进行通信。1818版权所有版权所有C#程序设计与案例教程清华大学出版社1 1NetworkStreamNetworkStream的构造函数的构造函数的构造函数的构造函数(1 1)publicpublicNetworkStream(SocketNetwor

25、kStream(Socket):为指定的:为指定的SocketSocket创建创建 NetworkStreamNetworkStream类的新实例。类的新实例。(2 2)publicpublicNetworkStream(SocketNetworkStream(Socket,boolbool):用指定的:用指定的SocketSocket所属权为指定的所属权为指定的SocketSocket初始化初始化 NetworkStreamNetworkStream 类类的新实例。的新实例。(3 3)publicpublicNetworkStream(SocketNetworkStream(Socket,F

26、ileAccessFileAccess):用指定:用指定的访问权限为指定的的访问权限为指定的SocketSocket创建创建 NetworkStreamNetworkStream类的新实类的新实例。例。(4 4)publicpublicNetworkStream(SocketNetworkStream(Socket,FileAccessFileAccess,boolbool):用:用指定的访问权限和指定的指定的访问权限和指定的SocketSocket所属权为指定的所属权为指定的SocketSocket创创建建 NetworkStreamNetworkStream类的新实例。类的新实例。2 2N

27、etworkStreamNetworkStream类的主要成员类的主要成员类的主要成员类的主要成员 CanReadCanRead,CanWriteCanWrite,DataAvailableDataAvailable,BeginReadBeginRead(),(),BeginWriteBeginWrite(),Close(),(),Close(),EndReadEndRead(),(),EndWriteEndWrite(),(),(详见详见P272P272表表8-3)8-3)1919版权所有版权所有C#程序设计与案例教程清华大学出版社8.2面向连接的套接字n nIPIP连接领域有两种通信类型:

28、面向连接的和无连接领域有两种通信类型:面向连接的和无连接的。在面向连接的套接字中,使用连接的。在面向连接的套接字中,使用TCPTCP协协议来建立两个议来建立两个IPIP地址端点之间的会话。一旦建地址端点之间的会话。一旦建立了这种连接,就可以在设备之间可靠地传输立了这种连接,就可以在设备之间可靠地传输数据。在使用套接字通信过程中主动发起通信数据。在使用套接字通信过程中主动发起通信的一方被称为的一方被称为客户端客户端客户端客户端,接受请求进行通信的一,接受请求进行通信的一方称为方称为服务器服务器服务器服务器。为了建立面向连接的套接字,。为了建立面向连接的套接字,服务器和客户端必须分别进行编程。服务

29、器和客户端必须分别进行编程。2020版权所有版权所有C#程序设计与案例教程清华大学出版社8.2.1面向连接的套接字程序基本结构面向连接的套接字程序基本结构服务器端客户端2121版权所有版权所有C#程序设计与案例教程清华大学出版社1 1服务器端程序的基本结构服务器端程序的基本结构服务器端程序的基本结构服务器端程序的基本结构(1 1)建立套接字。)建立套接字。(2 2)将套接字绑定到用于)将套接字绑定到用于TCPTCP通信的本地通信的本地IPIP地地址和端口上。址和端口上。(3 3)设置套接字处于监听状态。)设置套接字处于监听状态。(4 4)等待用户请求。)等待用户请求。(5 5)有用户请求,可以

30、发送数据或接受数据。)有用户请求,可以发送数据或接受数据。(6 6)关闭套接字。)关闭套接字。2222版权所有版权所有C#程序设计与案例教程清华大学出版社2.2.客户端程序的基本结构客户端程序的基本结构客户端程序的基本结构客户端程序的基本结构(1 1)建立套接字。)建立套接字。(2 2)与服务器进行连接。)与服务器进行连接。(3 3)发送或接受数据。)发送或接受数据。(4 4)关闭套接字。)关闭套接字。2323版权所有版权所有C#程序设计与案例教程清华大学出版社【案例案例案例案例8-18-1】一个简单一个简单TCP/IPTCP/IP客户客户/服务器程序。服务器程序。n n本案例建立一个控制台程

31、序,本案例建立一个控制台程序,服务器程序启动后,等待客服务器程序启动后,等待客户连接,客户程序启动后主户连接,客户程序启动后主动与服务器连接,连接成功动与服务器连接,连接成功服务器向客户端发送信息服务器向客户端发送信息“连接成功!连接成功!”,客户端接到,客户端接到信息后向服务器发送信息信息后向服务器发送信息“服务器你好服务器你好”,服务器再向,服务器再向客户端发送信息客户端发送信息“客户你好客户你好“。运行界面如图。运行界面如图8-28-2所示,所示,(a a)为服务器,()为服务器,(b b)为客)为客户端。户端。(程序代码见程序代码见Exam8_1)Exam8_1)(a)服务器端(b)客

32、户端2424版权所有版权所有C#程序设计与案例教程清华大学出版社8.2.2 使用同步套接字n n在通过在通过SocketSocket进行连接、接收、发送操作时,进行连接、接收、发送操作时,客户机或服务器会暂停当前工作,处于等待状客户机或服务器会暂停当前工作,处于等待状态,即一直等有数据时才继续执行下面的语句。态,即一直等有数据时才继续执行下面的语句。一般在阻塞方式下使用这种方式。可见,同步一般在阻塞方式下使用这种方式。可见,同步套接字适用于网络传输量不大的情况。当网络套接字适用于网络传输量不大的情况。当网络传输量很大时,长时间的等待可能回让用户无传输量很大时,长时间的等待可能回让用户无法忍受,

33、这时需要使用异步套接字。法忍受,这时需要使用异步套接字。2525版权所有版权所有C#程序设计与案例教程清华大学出版社【案例案例案例案例8-28-2】使用同步套接字。使用同步套接字。n n本案例创建一个接收来自客户端本案例创建一个接收来自客户端的连接请求的服务器。该服务器的连接请求的服务器。该服务器是用同步套接字生成的,因此在是用同步套接字生成的,因此在等待来自客户端的连接时挂起服等待来自客户端的连接时挂起服务器应用程序的执行。该应用程务器应用程序的执行。该应用程序接收来自客户端的字符串,在序接收来自客户端的字符串,在控制台显示该字符串,然后将该控制台显示该字符串,然后将该字符串回显到客户端。来

34、自客户字符串回显到客户端。来自客户端的字符串必须包含字符串端的字符串必须包含字符串“”,以发出表示消息结尾,以发出表示消息结尾的信号。客户端是用同步套接字的信号。客户端是用同步套接字生成的,因此挂起客户端应用程生成的,因此挂起客户端应用程序的执行,直到服务器返回响应序的执行,直到服务器返回响应为止。该应用程序将字符串发送为止。该应用程序将字符串发送到服务器,然后在控制台显示该到服务器,然后在控制台显示该服务器返回的字符串。运行界面服务器返回的字符串。运行界面如图如图8-38-3所示,(所示,(a a)为服务器,)为服务器,(b b)为客户端。)为客户端。(a)服务器端(b)客户端2626版权所

35、有版权所有C#程序设计与案例教程清华大学出版社8.2.3 使用TcpListener和TcpClientn n在在System.Net.SocketsSystem.Net.Sockets.命名空间下,有两个专命名空间下,有两个专门用于门用于TCPTCP协议编程的类:协议编程的类:TCPClientTCPClient和和TCPListenerTCPListener类。这两个类提供了直观的容易类。这两个类提供了直观的容易使用的属性和方法,从而降低了使用的属性和方法,从而降低了TCPTCP协议编程协议编程的难度。的难度。2727版权所有版权所有C#程序设计与案例教程清华大学出版社1.TcpListe

36、ner类类n nTcpListenerTcpListener 类提供一些简单方法,用于在阻塞类提供一些简单方法,用于在阻塞同步模式下侦听和接受传入连接请求。客户端同步模式下侦听和接受传入连接请求。客户端使用使用TcpClientTcpClient或或SocketSocket来连接来连接TcpListenerTcpListener。可。可使用使用IPEndPointIPEndPoint、本地、本地 IPIP地址及端口号或者仅地址及端口号或者仅使用端口号,来创建使用端口号,来创建 TcpListenerTcpListener。可以将本地。可以将本地 IPIP地址指定为地址指定为 AnyAny,将本

37、地端口号指定为,将本地端口号指定为 0 0(如果希望基础服务提供程序为您分配这些值)(如果希望基础服务提供程序为您分配这些值)。如果选择这样做,可使用。如果选择这样做,可使用 LocalEndPointLocalEndPoint来来标识已指定的信息。标识已指定的信息。2828版权所有版权所有C#程序设计与案例教程清华大学出版社n nStart()Start()方法用来开始侦听传入的连接请求。方法用来开始侦听传入的连接请求。Start()Start()将对传入连接进行排队,直至您调用将对传入连接进行排队,直至您调用 StopStop()()方法或它已经完成方法或它已经完成MaxConnectio

38、nsMaxConnections排队为止。排队为止。可使用可使用AcceptSocketAcceptSocket()()或或 AcceptTcpClientAcceptTcpClient()()从从传入连接请求队列提取连接。这两种方法将阻传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻塞,可首先使用塞。如果要避免阻塞,可首先使用 Pending()Pending()方法来确定队列中是否有可用的连接请求。调方法来确定队列中是否有可用的连接请求。调用用Stop()Stop()方法来关闭方法来关闭 TcpListenerTcpListener。2929版权所有版权所有C#程序设计与案例教程清

39、华大学出版社2.2.TcpClientTcpClient类类类类TcpClientTcpClient类为类为 TCPTCP网络服务提供客户端连接。网络服务提供客户端连接。TcpClientTcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。络来连接、发送和接收流数据。为使为使TcpClientTcpClient连接并交换数据,使用连接并交换数据,使用 TCPTCP创建的创建的 TcpListenerTcpListener或或 SocketSocket必须侦听是否有传入的连接请求。必须侦听是否有传入的

40、连接请求。可以使用下面两种方法之一连接到该侦听器:可以使用下面两种方法之一连接到该侦听器:(1 1)创建一个)创建一个TcpClientTcpClient,并调用三个可用的,并调用三个可用的ConnectConnect方法之方法之一。一。publicvoidpublicvoidConnect(IPEndPointConnect(IPEndPoint):使用指定的远程网络终:使用指定的远程网络终结点将客户端连接到远程结点将客户端连接到远程 TCPTCP主机。主机。publicvoidpublicvoidConnect(IPAddressConnect(IPAddress,intint):使用指定

41、的:使用指定的 IPIP地址地址和端口号将客户端连接到和端口号将客户端连接到 TCPTCP主机。主机。publicvoidpublicvoidConnect(stringConnect(string,intint):将客户端连接到指定主机:将客户端连接到指定主机上的指定端口。上的指定端口。3030版权所有版权所有C#程序设计与案例教程清华大学出版社(2 2)使用远程主机的主机名和端口号创建)使用远程主机的主机名和端口号创建TcpClientTcpClient。此构造函数将自动尝试一个连接。此构造函数将自动尝试一个连接。要发送和接收数据,请使用要发送和接收数据,请使用 GetStreamGetS

42、tream()()方法方法来获取一个来获取一个NetworkStreamNetworkStream。调用。调用 NetworkStreamNetworkStream的的Write()Write()和和Read()Read()方法与远程方法与远程主机之间发送和接收数据。使用主机之间发送和接收数据。使用 Close()Close()方法释方法释放与放与TcpClientTcpClient 关联的所有资源。关联的所有资源。3131版权所有版权所有C#程序设计与案例教程清华大学出版社【案例案例案例案例8-38-3】简单的聊天简单的聊天程序。程序。n n本案例设计一个本案例设计一个WindowsWind

43、ows应用程序,能应用程序,能够实现客户与服务器的够实现客户与服务器的一对一聊天。客户端和一对一聊天。客户端和服务端的界面设计基本服务端的界面设计基本相似。窗体上有相似。窗体上有2 2个文个文本框和本框和2 2个按钮。用于个按钮。用于显示信息的文本框的显示信息的文本框的MultilineMultiline属性设为属性设为TrueTrue。(程序代码详见程序代码详见Exam8_3)Exam8_3)3232版权所有版权所有C#程序设计与案例教程清华大学出版社*8.2.4 使用异步套接字n n同步套接字在监听时处于暂停状态,而异步套同步套接字在监听时处于暂停状态,而异步套接字可以在监听的同时进行其他

44、操作。接字可以在监听的同时进行其他操作。.NET.NET提提供了一种称为供了一种称为AsyncCallbackAsyncCallback的委托,该委托的委托,该委托允许启动异步的功能,并在异步功能结束后执允许启动异步的功能,并在异步功能结束后执行委托提供的方法。行委托提供的方法。3333版权所有版权所有C#程序设计与案例教程清华大学出版社1 1异步套接字服务器程序异步套接字服务器程序异步套接字服务器程序异步套接字服务器程序异步套接字服务器需要一个开始接受网络连接请异步套接字服务器需要一个开始接受网络连接请求的方法,一个处理连接请求并开始接收网络求的方法,一个处理连接请求并开始接收网络数据的回调

45、方法以及一个结束接收数据的回调数据的回调方法以及一个结束接收数据的回调方法。程序结构如下:方法。程序结构如下:(1 1)建立)建立SocketSocket。(2 2)将套接字绑定到用于)将套接字绑定到用于TCPTCP通信的本地通信的本地IPIP地地址和端口上。址和端口上。(3 3)设置套接字处于监听状态。)设置套接字处于监听状态。3434版权所有版权所有C#程序设计与案例教程清华大学出版社(4 4)使用)使用BeginAcceptBeginAccept 方法开始接受新连接。它负责获方法开始接受新连接。它负责获取将处理连接的取将处理连接的 SocketSocket实例,并将实例,并将 Socke

46、tSocket提交给将提交给将处理请求的线程。处理请求的线程。publicpublicIasyncResultIasyncResult BeginAccept(AsyncCallbackBeginAccept(AsyncCallback callback,Objectcallback,Objectstate);state);第一参数为第一参数为AsyncCallbackAsyncCallback类型的委托,利用此参数关联类型的委托,利用此参数关联一个回调方法。第二个参数为一个回调方法。第二个参数为ObjectObject类型,用于将状态类型,用于将状态信息传递给委托提供的方法。信息传递给委托提

47、供的方法。(5 5)设计回调方法。)设计回调方法。执行执行BeginAcceptBeginAccept方法时不会停下来等待客户端连接,方法时不会停下来等待客户端连接,而是继续往下执行。同时而是继续往下执行。同时BeginAcceptBeginAccept也继续执行,一也继续执行,一旦旦BeginAcceptBeginAccept接收到新的客户端连接,接收到新的客户端连接,AsyncCallbackAsyncCallback委托就会自动调用回调方法。在回调方委托就会自动调用回调方法。在回调方法中,通过法中,通过IAsyncResultIAsyncResult类型的参数获得状态信息,并类型的参数获

48、得状态信息,并调用调用EndAcceptEndAccept方法完成接受请求。方法完成接受请求。3535版权所有版权所有C#程序设计与案例教程清华大学出版社(6 6)在回调方法中调用)在回调方法中调用BeginReceiveBeginReceive方法接收数据或调方法接收数据或调用用BeginSendBeginSend()()发送数据。这两个方法都有发送数据。这两个方法都有6 6个参数:个参数:n n参数参数1 1:缓冲区(字节数组)。:缓冲区(字节数组)。n n参数参数2 2:开始发送或接收的位置。:开始发送或接收的位置。n n参数参数3 3:发送或接收的字节数。:发送或接收的字节数。n n参

49、数参数4 4:SocketFlagsSocketFlags值的按位组合。值的按位组合。n n参数参数5 5:异步回调函数。:异步回调函数。n n参数参数6 6:表示状态的对象。:表示状态的对象。(7 7)完成发送后,在回调方法中调用)完成发送后,在回调方法中调用EndSendEndSend完成本次完成本次发送。发送。3636版权所有版权所有C#程序设计与案例教程清华大学出版社2 2异步套接字客户端程序异步套接字客户端程序异步套接字客户端程序异步套接字客户端程序客户端程序与服务器端程序有很多共同点。主要注意:客户端程序与服务器端程序有很多共同点。主要注意:在异步套接字编程中,客户端必须使用在异步

50、套接字编程中,客户端必须使用BeginConnectBeginConnect方法连接到远程主机,其格式为:方法连接到远程主机,其格式为:IAsyncResultIAsyncResult BeginConnect(EndPointBeginConnect(EndPoint ep,AsyncCallBackep,AsyncCallBack callback,Objectcallback,Objectstate);state);其中第一个参数是远程主机的其中第一个参数是远程主机的EndPointEndPoint对象;第二个参对象;第二个参数用于和远程主机连接成功后执行委托的方法;最后数用于和远程主机

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁