收藏 分享(赏)

第八章 网络程序设计.ppt

上传人:myw993772 文档编号:8842460 上传时间:2019-07-14 格式:PPT 页数:45 大小:330.50KB
下载 相关 举报
第八章 网络程序设计.ppt_第1页
第1页 / 共45页
第八章 网络程序设计.ppt_第2页
第2页 / 共45页
第八章 网络程序设计.ppt_第3页
第3页 / 共45页
第八章 网络程序设计.ppt_第4页
第4页 / 共45页
第八章 网络程序设计.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、版权所有,1,第八章 网络程序设计,在分布式应用程序中,基于客户端和服务器的各种网络编程序技术应用非常广泛。C#对网络程序设计提供了强大的支持,在System.Net命名空间中包含了许多用于网络程序设计的类。,2,版权所有,目录,网络程序设计基础 面向连接的套接字 面向无连接的套接字,3,版权所有,8.1 网络程序设计基础,System.Net命名空间为当前网络上使用的多种协议提供了简单的编程接口。8.1.1 网络协议 网络协议是网络上计算机为交换数据所必须遵守的通信规范和消息格式的集合。目前常用的网络协议有TCP协议和UDP协议。,4,版权所有,1.TCP协议 TCP是Tranfer Con

2、trol Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个Socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常都是Server Socket)等待建立连接时,另一个Socket可以请求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。,5,版权所有,2.UDP协议 UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的

3、路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。使用TCP协议,由于它是一个面向连接的协议,在Socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。,6,版权所有,8.1.2 有关的概念 1IP地址标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。例如: 166.111.136.3 , 166.111.52.802主机名(hostname)网络地址的助记名,按照域名进行分级管理。如: ,7,版权所有,3端口号(

4、port number) 网络通信时同一机器上的不同进程的标识。如:80,21,23,25,其中11024为系统保留的端口号4服务类型(service) 网络的各种服务。如: http, telnet, ftp, smtp5协议名(protocol) 指明获取资源所使用的传输协议,如: http、ftp、gopher、file,8,版权所有,6资源名(resourceName) 是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。例如: http:/ (协议名:/主机名) http:/ (协议名:/机器名文件名) 在Internet上,IP地址和主机名是一一对应的,通过域名解析可

5、以由主机名得到机器的IP,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有IP地址才是有效的标识符。,9,版权所有,8.1.3 IPAddress和IPEndPoint类 在System.Net命名空间中,有两个专门用于处理各种类型的IP地址信息的类型:IPAddress类和IPEndPoint类。 1.IPAddress类 IPAddress类用于表示一个IP地址,一般使用Parse方法创建IPAddress的实例。 IPAddress ip=IPAddress.Parse(“192.168.1.1“); IPAddress类还提供了4个只读属性,分别代表程序中

6、使用的特殊IP地址: (1)Any:代表本地系统可用的任何IP地址。 (2)Broadcast:代表本地网络的IP 广播地址。 (3)Loopback:代表系统的回送地址。 (4)None:代表系统上没有网络接口。 在System.Net命名空间下,包含有一个Dns类,可以利用该类的GetHostName()方法找到本地系统的主机名,然后再用GetHostByName()找到主机的IP地址。,10,版权所有,2.IPEndPoint类 IPEndPoint对象用于表示指定的IP地址/端口的组合。其构造函数为: IPEndPoint(IPAddress address, int port); 该

7、类有几个常用的属性: (1)Address:得到或者设置IP地址。 (2)AddressFamily: 获取网际协议 (IP) 地址族。 (3)Port: 获取或设置终结点的 TCP 端口号.,11,版权所有,8.1.4 套接字(Socket) System.Net.Sockets命名空间包含了一个Socket类,它是最基础的网络编程序接口。Socket类的构造函数为: public Socket( AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType); addressFamily 参数指定

8、Socket 使用的寻址方案,socketType 参数指定Socket 的类型,protocolType 参数指定 Socket 使用的协议。对于网络上的IP通信来说,addressFamily总是使用AddressFamily.InterNetwork枚举值。,12,版权所有,13,版权所有,与Socket相关的操作: (1)接受请求 Socket Accept(); /创建一个套接字来处理到来的连接请求。(2)绑定地址 void Bind(IPEndPoint localEP); /使 Socket与一个本地终结点相关联。 如果需要使用特定的本地终结点,请使用Bind()方法。必须先调用

9、Bind(),然后才能调用Listen()方法。如果不介意分配哪个本地地址,则可以用 IPAddress.Any作为地址参数创建一个 IPEndPoint,这样,基础服务提供程序将会分配最适合的网络地址。,14,版权所有,(3)建立连接 void Connect(IPEndPoint ip); 用来与远程服务器建立连接。连接之后,可以用Send()发送数据或用Receive()函数接收数据。(4)监听请求 void Listen(int backlog); /backlog指定队列中最多可容纳的等待接受的传入连接数。 设置套接字处于监听状态。当数据到达某个端口时,它会向主机发送通知消息。,15

10、,版权所有,(5)发送数据 使用Send()或SendTo()方法。 int Send(byte buffer); int SendTo(byte buffer,IPEndPoint remoteIP);/向指定的地址发送数据发送数据还可以使用NetWorkStream对象。创建NetWorkStream对象的方法是: NetWorkStream netstream = new NetWrokStream(clientSocket); String message=“发送的信息”; byte b=System.Text.Encoding.Unicode.GetBytes(message); n

11、etstream.Write(b, 0, b.Length);,16,版权所有,(6)接受数据 使用Receive()或ReceiveFrom()接收数据。 int Receive(byte buffer); int ReceiveFrom(byte buffer, ref IPEndPoint ip)(7)关闭使用Shutdown()关闭套接字。 public void Shutdown( SocketShutdown how); how指定不再允许执行的操作, 其取值见下表:,17,版权所有,18,版权所有,8.1.5 网络流(NetworkStream) NetworkStream类提供

12、用于网络访问的基础数据流。它提供了在阻塞模式下通过 Stream套接字发送和接收数据的方法。要创建NetworkStream,必须提供连接的Socket。也可指定 NetworkStream 对所提供的Socket具有哪些FileAccess权限。默认情况下,关闭 NetworkStream 并不会关闭所提供的Socket。如果要使 NetworkStream 拥有关闭所提供的 Socket 的权限,则必须将ownsSocket构造函数参数的值指定为 true。 该类的Write()和Read()方法用于简单的单线程同步阻塞 I/O。若要使用不同的线程来处理I/O,则请考虑使用BeginWri

13、te()/ EndWrite()和BeginRead()/ EndRead()方法进行通信。,19,版权所有,1NetworkStream的构造函数 (1)public NetworkStream(Socket):为指定的Socket创建 NetworkStream类的新实例。 (2)public NetworkStream(Socket, bool):用指定的Socket所属权为指定的Socket初始化 NetworkStream 类的新实例。 (3)public NetworkStream(Socket, FileAccess):用指定的访问权限为指定的Socket创建 NetworkSt

14、ream类的新实例。 (4)public NetworkStream(Socket, FileAccess, bool):用指定的访问权限和指定的Socket所属权为指定的Socket创建 NetworkStream类的新实例。 2NetworkStream类的主要成员 CanRead, CanWrite, DataAvailable, BeginRead(), BeginWrite(), Close(), EndRead(), EndWrite(), (详见P272 表8-3),20,版权所有,8.2 面向连接的套接字,IP连接领域有两种通信类型:面向连接的和无连接的。在面向连接的套接字中,

15、使用TCP协议来建立两个IP地址端点之间的会话。一旦建立了这种连接,就可以在设备之间可靠地传输数据。在使用套接字通信过程中主动发起通信的一方被称为客户端,接受请求进行通信的一方称为服务器。为了建立面向连接的套接字,服务器和客户端必须分别进行编程。,21,版权所有,8.2.1 面向连接的套接字程序基本结构,服务器端,客户端,22,版权所有,1服务器端程序的基本结构 (1)建立套接字。 (2)将套接字绑定到用于TCP通信的本地IP地址和端口上。 (3)设置套接字处于监听状态。 (4)等待用户请求。 (5)有用户请求,可以发送数据或接受数据。 (6)关闭套接字。,23,版权所有,2. 客户端程序的基

16、本结构 (1)建立套接字。 (2)与服务器进行连接。 (3)发送或接受数据。 (4)关闭套接字。,24,版权所有,【案例8-1】一个简单TCP/IP客户/服务器程序。 本案例建立一个控制台程序,服务器程序启动后,等待客户连接,客户程序启动后主动与服务器连接,连接成功服务器向客户端发送信息“连接成功!”,客户端接到信息后向服务器发送信息“服务器你好”,服务器再向客户端发送信息“客户你好“。运行界面如图8-2所示,(a)为服务器,(b)为客户端。(程序代码见Exam8_1),(a) 服务器端,(b) 客户端,25,版权所有,8.2.2 使用同步套接字 在通过Socket进行连接、接收、发送操作时,

17、客户机或服务器会暂停当前工作,处于等待状态,即一直等有数据时才继续执行下面的语句。一般在阻塞方式下使用这种方式。可见,同步套接字适用于网络传输量不大的情况。当网络传输量很大时,长时间的等待可能回让用户无法忍受,这时需要使用异步套接字。,26,版权所有,【案例8-2】使用同步套接字。 本案例创建一个接收来自客户端的连接请求的服务器。该服务器是用同步套接字生成的,因此在等待来自客户端的连接时挂起服务器应用程序的执行。该应用程序接收来自客户端的字符串,在控制台显示该字符串,然后将该字符串回显到客户端。来自客户端的字符串必须包含字符串“”,以发出表示消息结尾的信号。客户端是用同步套接字生成的,因此挂起

18、客户端应用程序的执行,直到服务器返回响应为止。该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串。运行界面如图8-3所示,(a)为服务器,(b)为客户端。,(a) 服务器端,(b) 客户端,27,版权所有,8.2.3 使用TcpListener和TcpClient 在System.Net.Sockets.命名空间下,有两个专门用于TCP协议编程的类:TCPClient和TCPListener类。这两个类提供了直观的容易使用的属性和方法,从而降低了TCP协议编程的难度。,28,版权所有,1. TcpListener类 TcpListener 类提供一些简单方法,用于在阻塞同步模

19、式下侦听和接受传入连接请求。客户端使用TcpClient或Socket来连接TcpListener。可使用IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果选择这样做,可使用 LocalEndPoint来标识已指定的信息。,29,版权所有,Start()方法用来开始侦听传入的连接请求。Start() 将对传入连接进行排队,直至您调用 Stop()方法或它已经完成MaxConnections排队为止。可使用AcceptSocket() 或 Ac

20、ceptTcpClient()从传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻塞,可首先使用 Pending()方法来确定队列中是否有可用的连接请求。调用Stop()方法来关闭 TcpListener。,30,版权所有,2. TcpClient类TcpClient类为 TCP 网络服务提供客户端连接。TcpClient 类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。为使TcpClient连接并交换数据,使用 TCP 创建的 TcpListener或 Socket必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器: (1)创建一个Tcp

21、Client,并调用三个可用的Connect方法之一。 public void Connect(IPEndPoint):使用指定的远程网络终结点将客户端连接到远程 TCP 主机。public void Connect(IPAddress, int):使用指定的 IP 地址和端口号将客户端连接到 TCP 主机。public void Connect(string, int):将客户端连接到指定主机上的指定端口。,31,版权所有,(2)使用远程主机的主机名和端口号创建TcpClient。此构造函数将自动尝试一个连接。 要发送和接收数据,请使用 GetStream()方法来获取一个NetworkSt

22、ream。调用 NetworkStream的Write()和Read()方法与远程主机之间发送和接收数据。使用 Close()方法释放与TcpClient 关联的所有资源。,32,版权所有,【案例8-3】简单的聊天程序。 本案例设计一个Windows应用程序,能够实现客户与服务器的一对一聊天。客户端和服务端的界面设计基本相似。窗体上有2个文本框和2个按钮。用于显示信息的文本框的Multiline属性设为True。 (程序代码详见Exam8_3),33,版权所有,*8.2.4 使用异步套接字 同步套接字在监听时处于暂停状态,而异步套接字可以在监听的同时进行其他操作。.NET提供了一种称为Asyn

23、cCallback的委托,该委托允许启动异步的功能,并在异步功能结束后执行委托提供的方法。,34,版权所有,1异步套接字服务器程序 异步套接字服务器需要一个开始接受网络连接请求的方法,一个处理连接请求并开始接收网络数据的回调方法以及一个结束接收数据的回调方法。程序结构如下: (1)建立Socket。 (2)将套接字绑定到用于TCP通信的本地IP地址和端口上。 (3)设置套接字处于监听状态。,35,版权所有,(4)使用BeginAccept 方法开始接受新连接。它负责获取将处理连接的 Socket 实例,并将 Socket 提交给将处理请求的线程。public IasyncResult Begi

24、nAccept(AsyncCallback callback,Object state); 第一参数为AsyncCallback类型的委托,利用此参数关联一个回调方法。第二个参数为Object类型,用于将状态信息传递给委托提供的方法。 (5)设计回调方法。执行BeginAccept方法时不会停下来等待客户端连接,而是继续往下执行。同时BeginAccept也继续执行,一旦BeginAccept接收到新的客户端连接,AsyncCallback委托就会自动调用回调方法。在回调方法中,通过IAsyncResult类型的参数获得状态信息,并调用EndAccept方法完成接受请求。,36,版权所有,(6

25、)在回调方法中调用BeginReceive方法接收数据或调用BeginSend()发送数据。这两个方法都有6个参数: 参数1:缓冲区(字节数组)。 参数2:开始发送或接收的位置。 参数3:发送或接收的字节数。 参数4:SocketFlags值的按位组合。 参数5:异步回调函数。 参数6:表示状态的对象。 (7)完成发送后,在回调方法中调用EndSend完成本次发送。,37,版权所有,2异步套接字客户端程序客户端程序与服务器端程序有很多共同点。主要注意:在异步套接字编程中,客户端必须使用BeginConnect方法连接到远程主机,其格式为: IAsyncResult BeginConnect(E

26、ndPoint ep,AsyncCallBack callback,Object state); 其中第一个参数是远程主机的EndPoint对象;第二个参数用于和远程主机连接成功后执行委托的方法;最后一个参数是状态对象,用于传递必要的数据。,38,版权所有,【案例8-4】基于异步套接字的聊天程序。 本案例与案例8-3功能基本类似,单采用了异步套接字技术。 (程序代码详见Exam8_4),39,版权所有,8.3 面向无连接的套接字,UDP协议使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。因此,通信的两端基本上是对等的,很难确定谁是服务器谁是客户机。我们不妨把先发送信息的一端

27、看成客户端,先接受数据的一端看成是服务器。使用UDP协议,可以建立面向无连接的套接字编程。,40,版权所有,8.3.1 面向无连接的套接字程序基本结构,服务器端,客户端,41,版权所有,1服务器端程序的结构 (1)建立套接字。 (2)将套接字绑定到用于UDP通信的本地IP地址和端口上。 (3)用ReceiveFrom()方法接收数据。 (4)用SendTo()方法发送数据。 (5)关闭套接字。,42,版权所有,2客户端程序的结构 (1)建立套接字。 (2)将套接字绑定到用于UDP通信的本地IP地址和端口上。 (3)用SendTo()方法发送数据。 (4)用ReceiveFrom()方法接收数据

28、。 (5)关闭套接字。,43,版权所有,8.3.2与面向连接的套接字的主要区别 (1)建立Socket时指定的协议为SocketType为SocketType.Dgram,ProtocolType为ProtocolType.UDP协议。 IPAddress ipAddress =IPAddress.Parse(“127.0.0.1“); IPEndPoint remoteEP = new IPEndPoint(ipAddress, 5555); Socket mySocket=new Socket(AddressFamily.InterNetwork,SocketType. Dgram,Pro

29、tocolType.Udp); (2)不需要执行Connect()方法建立连接。直接使用SendTo或ReceiveFrom发送或接收数据。,44,版权所有,8.3.3 使用UdpClient 编写无连接基于UDP协议的程序,还可以使用UdpClient类。UdpClient类提供了一些简单的方法,用于在阻塞同步模式下发送和接收无连接 UDP 数据报。因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但您可以选择使用下面两种方法之一来建立默认远程主机: (1)使用远程主机名和端口号作为参数创建UdpClient类的实例。 (2)创建UdpClient类的实例,然后调

30、用Connect()方法。,45,版权所有,public void Connect(IPEndPoint):使用指定的网络终结点建立默认远程主机。 public void Connect(IPAddress, int):使用指定的 IP 地址和端口号建立默认远程主机。 public void Connect(string, int):使用指定的主机名和端口号建立默认远程主机。 使用Send方法将 UDP 数据文报发送到远程主机。使用Receive方法可以从远程主机接收数据。 public int Send(byte, int):将 UDP 数据文报发送到远程主机。 public int Send(byte, int, IPEndPoint):将UDP 数据报发送到位于指定远程终结点的主机。 public int Send(byte, int, string, int):将UDP 数据文报发送到指定的远程主机上的指定端口。 public byte Receive(ref IPEndPoint remoteEP):返回已由远程主机发送的 UDP 数据文报。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报