《VBNET中的网络编程.ppt》由会员分享,可在线阅读,更多相关《VBNET中的网络编程.ppt(46页珍藏版)》请在三一办公上搜索。
1、一.网络编程基础知识二.Net中的网络编程类三.Net网络程序基本结构四.Net多线程技术 五.在网络编程中结合多线程技术,本章目录,一网络编程基础知识1.1 Socket,Socket通常也称为“套接字”,用于描述IP地址和端口。它实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则没有办法建立联系并相互通信。正如打电话之前,双方必须各自拥有一台电话机。Socket同样可以被视为一个数据通道,这个通道架设在应用程序端(客户端)和服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。,本章目录,socket 是面向客户/服务器模型而设计的,针对客户和
2、服务器程序提供不同的socket功能调用。客户端需要申请一个socket(相当于一个想打电话的人首先获得一部电话机),系统为之分配一个socket号;服务器端则拥有全局公认的 socket,任何客户端都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。,本章目录,Socket 是访问 Internet 使用得最广泛的方法。在Internet上有很多用于提供网络服务的主机,这些主机一般运行了多个服务软件,提供不同的服务(比如电子邮件服务、ftp服务、http网页服务等)。而每种服务实际上都会打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
3、,本章目录,可见,Socket正如其英文原意(“插座”)那样,象一个多孔插座。而一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。,本章目录,1.2 网络协议,网络协议是网络上计算机为交换数据所必须遵守的通信规范和消息格式的集合。目前常用的网络协议有TCP协议和UDP协议。,本章目录,.TCP协议 TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收
4、方的两个Socket之间必须建立连接,以便在TCP协议的基础上进行通信。当一个Socket(通常都是Server Socket)等待建立连接时,另一个Socket可以请求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。,本章目录,.UDP协议 UDP是User Datagram Protocol(数据报协议)的简称,是一种无连接的协议。每个数据报都是一个独立的信息,在其中包括了完整的源地址或目的地址信息,因此无需要建立发送方和接收方的连接。每个数据报在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被
5、保证的。,本章目录,二.Net中的网络编程类,.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务。其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net采用的分层结构允许应用程序在不同的控制级别上访问网络,这些级别几乎囊括了Internet的所有需要 从Socket套接字到普通的请求/响应。,本章目录,抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net网络编程类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebRespon
6、se 代表了请求/响应层,支持Http、TCP和UDP的类组成了应用协议层,而Socket类处于最底层的传输层。,本章目录,System.Net.Sockets 命名空间为需要访问网络底层功能的开发人员提供了Socket接口。System.Net 命名空间中的所有其他网络访问类都是建立在Socket的基础上的。如TCPClient、TCPListener 和 UDPClient 类,以及提供用于网络访问的基础数据流的NetworkStream类等。,本章目录,2.1 IPAddress类和IPEndPoint类 在System.Net命名空间中,有两个专门用于处理各种类型的IP地址信息的类型:
7、IPAddress类和IPEndPoint类。1.IPAddress类 IPAddress类用于表示一个IP地址,可以使用Parse方法直接创建IPAddress的实例:IPAddress ip=IPAddress.Parse(192.168.1.1);IPAddress类还提供了4个只读属性,分别代表程序中使用的特殊IP地址:(1)Any:代表本地系统可用的任何IP地址。(2)Broadcast:代表本地网络的IP 广播地址。(3)Loopback:代表系统的回送地址。(4)None:代表系统上没有网络接口。,本章目录,另外,在System.Net命名空间下,包含有一个Dns类,可以利用该类
8、的GetHostName()方法找到本地系统的主机名,然后再用GetHostByName()找到主机的IP地址。2.IPEndPoint类IPEndPoint对象通过一个IP地址/端口的组合来确定一个连接端点。其构造函数为:IPEndPoint(IpAddress address,int port);该类有几个常用的属性:(1)Address:得到或者设置IP地址。(2)AddressFamily:获取网际协议(IP)地址族。(3)Port:获取或设置终结点的 TCP 端口号.,本章目录,例:Dim localEndPoint As New IPEndPoint(IPAddress.Parse
9、(127.0.0.1),1024)指定IP和Port,本章目录,2.2 Socket类 Socket类的构造函数为:public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);addressFamily 参数指定Socket 使用的寻址方案,对于网络上的IP通信来说,addressFamily总是使用AddressFamily.InterNetwork这个值。socketType 参数指定Socket 的类型。protocolType 参数指定 Socket 使用的协议。,
10、本章目录,本章目录,例:Imports System.Net.sockets Imports S Dim Sserver As Socket=Nothing Sserver=New Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)使用TCP协议,Socket类中常用的成员函数(1)绑定地址(服务器端创建Socket后首先要做的工作)void Bind(IPEndPoint localEP);使 Socket与一个本地端点相关联。只有服务器端的Socket需要进行绑定。而且只有在进行绑定后才能在服务器端调用
11、Socket的其它功能。例:Dim localEndPoint As New IPEndPoint(IPAddress.Parse(“127.0.0.1”),1024)指定IP地址和端口Sserver.Bind(localEndPoint)把socket和该端点绑定,本章目录,(2)监听连接请求(只在服务器端需要这一步骤)void Listen(int backlog);backlog指定最多可以接受的传入连接数。设置套接字处于监听状态。当数据到达某个端口时,它会向主机发送通知消息。例:Sserver.Listen(100)开始监听,最多接受100个连接。,本章目录,(3)接受连接请求(只在服
12、务器端需要这一步骤)Socket Accept();注意返回值是一个新建立的Socket。当服务器端正在监听的Socket调用Accept成员函数,并且接收到了某个客户端发来的连接请求时,就会新建立一个Socket,专门用来和这个客户端进行通信。例:Dim newsocket As Socket=Sserver.Accept()注意:服务器端和客户端真正进行收发数据都是通过在建立连接时新建的socket进行的。在上面的例子里就是通过newsocket,而不是通过Sserver。,本章目录,(4)建立连接(只在客户端需要这一步骤)void Connect(IPEndPoint ip);用来与远程
13、服务器建立连接。连接之后,可以用Send()发送数据或用Receive()函数接收数据。例:Dim Sclient=New Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)Dim localEndPoint As New IPEndPoint(IPAddress.Parse(“127.0.0.1”),1024)指定要连接的服务器端的端点 Sclient.Connect(localEndPoint),本章目录,(5)发送数据 可以使用Socket类的Send()或SendTo()成员函数。int Send(
14、byte buffer);int SendTo(byte buffer,IPEndPoint remoteIP);向指定的地址发送数据。例:SClient.Send(Encoding.Unicode.GetBytes(TextBox1.Text)例子中的Encoding类是在System.Text名字空间中定义的(所以需要在程序中Import System.Text)。另外采用Unicode编码才能正确传送汉字。,本章目录,(6)接收数据 使用Socket类的Receive()或ReceiveFrom()成员函数来接收数据。int Receive(byte buffer);int Receiv
15、eFrom(byte buffer,ref IPEndPoint ip)例:Dim bytes(1024)As Byte 用来存储接收到的字节newsocket.Receive(bytes)newsocket是服务器端接受一个连接请求后新建的一个socket,本章目录,(7)关闭Socket 使用Socket类的Close()成员函数来关闭不再使用的socket。例:asocket.Close()asocket是之前创建的一个socket,本章目录,三.Net网络程序基本结构,基于IP的通信有两种通信类型:面向连接的和无连接的。在面向连接的通信中,Socket使用TCP协议来建立两个IP地址端
16、点之间的会话。一旦建立了这种连接,就可以在设备之间可靠地传输数据。为了建立面向连接的Socket通信,服务器和客户端必须分别进行编程(也就是分别为服务器端和客户端编写一个独立的程序)。,本章目录,面向连接的网络程序基本结构及流程 服务器端 客户端,本章目录,3.1 服务器端程序的基本流程(1)建立Socket。(2)将Socket绑定到用于TCP通信的本地IP地址和端口上。(3)设置Socket处于监听状态。(4)等待客户端连接请求,当收到连接请求时则与客户端建立连接。(5)与客户端发送数据或接受数据。(6)关闭Socket。,本章目录,3.2 客户端程序的基本流程(1)建立Socket。(2
17、)与服务器进行连接。(3)发送或接受数据。(4)关闭Socket。,本章目录,3.3 使用TcpListener和TcpClient类 在System.Net.Sockets.命名空间下,有两个专门用于TCP协议编程的类:TCPClient和TCPListener类。这两个类提供了直观的容易使用的属性和方法,从而降低了TCP协议编程的难度。,本章目录,.TcpListener(服务器端使用)TcpListener 类提供一些简单方法,用于在阻塞同步模式下侦听和接受传入连接请求。客户端使用TcpClient或Socket来连接TcpListener。可以使用IPEndPoint、本地 IP 地址
18、及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序自动分配这些值)。,本章目录,Start()方法用来开始侦听传入的连接请求。Start()将对传入连接进行排队,直到调用 Stop()方法或它已经完成MaxConnections排队为止。可使用AcceptSocket()或 AcceptTcpClient()从传入连接请求队列提取连接。这两种方法将阻塞。如果要避免阻塞,可首先使用 Pending()方法来确定队列中是否有可用的连接请求。调用Stop()方法来关闭TcpListener。,本章目录,.T
19、cpClient(客户端使用)TcpClient类是一个 TCP 客户端,它提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。它可以和TCPListener或者使用TCP创建的服务器端Socket进行连接。可以使用下面两种方法之一连接到服务器端:(1)创建一个TcpClient,并调用三个可用的Connect方法之一:public void Connect(IPEndPoint):使用指定的远程网络终结点将客户端连接到远程 TCP 主机。,本章目录,public void Connect(IPAddress,int):使用指定的 IP 地址和端口号将客户端连接到 TC
20、P 主机。public void Connect(string,int):将客户端连接到指定主机上的指定端口。(2)使用远程主机的主机名和端口号创建TcpClient。此构造函数将自动尝试一个连接。要发送和接收数据,可以使用 GetStream()方法来获取一个NetworkStream。调用 NetworkStream的Write()和Read()方法与远程主机之间发送和接收数据。使用 Close()方法释放与TcpClient 关联的所有资源。,本章目录,3.4 NetworkStream(网络流)类 NetworkStream类提供用于网络访问的基础数据流。它提供了在阻塞模式下通过 St
21、ream套接字发送和接收数据的方法。要创建NetworkStream,必须提供连接的Socket。也可以指定 NetworkStream 对所提供的Socket具有哪些FileAccess权限。该类的Write()和Read()方法用于简单的单线程同步阻塞 I/O。若要使用不同的线程来处理I/O,则可以使用BeginWrite()/EndWrite()和BeginRead()/EndRead()方法进行通信。,本章目录,.NetworkStream的构造函数(1)public NetworkStream(Socket):为指定的Socket创建 NetworkStream类的新实例。(2)pu
22、blic NetworkStream(Socket,bool):用指定的Socket所属权为指定的Socket初始化 NetworkStream 类的新实例。(3)public NetworkStream(Socket,FileAccess):用指定的访问权限为指定的Socket创建 NetworkStream类的新实例。(4)public NetworkStream(Socket,FileAccess,bool):用指定的访问权限和指定的Socket所属权为指定的Socket创建 NetworkStream类的新实例。,本章目录,四.Net多线程技术,进程:应用程序的运行实例,是应用程序的一
23、次动态执行。线程:进程内部的一个执行单元。从根本上说,线程是可由操作系统调度的一个最简单的代码单元,负责执行包含在进程的地址空间中的程序代码。应用程序域:在.NET框架中,提出了应用程序域的概念。所有程序编译后生成的都是中间代码,而这些中间代码的隔离、加载和卸载以及安全边界的提供都是通过应用程序域来实现。一个进程可以包含一个或多个应用程序域,而一个应用程序域又可以包含一个或多个线程。无论在同一个进程之内还是在不同的进程之间,每个应用程序域之间都是相互无关的,这些不同的应用程序域之间只能通过远程通讯来实现消息和对象的传递,本章目录,本章目录,多线程的意义:充分利用了CPU的空闲时间片,可以用尽可
24、能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。,本章目录,VB.Net对多线程的支持 由于Visual Basic.NET是基于.NET框架的,而.NET框架的重要组成部分CLR(Common Language Runtime,通用语言运行时)内置支持多线程应用,可以通过系统的System.Threading.Thread类直接建立多线程应用程序,并且支持线程池等高
25、级功能。因此任何.NET框架结构下的语言,包括Visual Basic.NET在编写多线程应用程序的时候,都可以直接利用系统类所提供的对象和方法,而不再需要使用Win32 API,因此可以大大减轻开发的困难和错误所发生的几率。,本章目录,Thread类(线程类)的使用 在System.Threading名字空间中定义了Thread类,用来创建和维护线程。它能够创建并控制线程,设置其优先级并获取其状态。它拥有Start,Stop,Resume,Abort,Suspend和Join(wait for)等方法操纵线程,还可以通过如Sleep,IsAlive,IsBackground,Priority
26、,ApartmentState和ThreadState等方法查询和设置线程状态。,本章目录,Thread类的使用方法(1)创建线程 可以通过创建Thread类的实例来创建一个新线程,并结合AddressOf()函数来指定让这个线程执行的任务(一般是一个过程或者函数)。例:Import System.Threading Public Sub threadtask()End Sub Dim newthread As Thread=New Thread(AddressOf theadtask)这样就创建了一个专门运行threadtask()过程的线程。,本章目录,(2)让线程开始运行 在创建了一个线
27、程后,线程并没有真正开始运行。需要调用Thread类的Start()成员函数来开始线程的运行。例:newthread.Start()newthread这个线程现在才会开始运行。(3)让线程休眠一段时间 可以调用Thread类的Sleep()成员函数来让线程休眠一段时间。例1:newthread.Sleep(2000)让newthread休眠2秒 例2:Thread.CurrentThread.Sleep(500)让当前线程休眠500毫秒,本章目录,(4)挂起和恢复线程 Thread类的Suspend()成员函数可以挂起一个线程(相当于让它暂停运行)。而Resume()成员函数则可以使一个被挂起
28、的线程重新开始运行。(5)停止一个线程的运行 Thread类的Abort()成员函数可以终止一个线程的运行。在调用Abort之前,需要先调用IsAlive()判断线程处于活动状态。例:Ifnewthread.IsAliveThen newthread.Abort()EndIf,本章目录,(6)获得线程当前的状态 线程从创建到终止,它一定处于某一个状态,可以通过Thread类的ThreadState属性获得这个状态。当一个线程刚被创建时,它处在Unstarted状态,然后Thread类的Start()方法将使线程状态变为Running状态。挂起的线程处于Suspended状态,直到我们调用res
29、ume()方法使其重新执行,这时候线程将重新变为Running状态。一旦线程被销毁或者终止,则线程处于Stopped状态,处于这个状态的线程将不复存在。线程还有一个Background状态,它表明线程运行在前台还是后台。,本章目录,五.在网络编程中结合多线程技术,在网络通信中的服务器端,尤其是在基于像TCP传输这种需要建立连接的情况下,由于往往需要持续地监听来自不同客户端的连接请求,然后和发来连接请求的客户端建立连接并收发数据。由于这一过程是始终不断地进行的,所以在服务器端的程序里,一般会把它放到一个独立的线程中执行,从而不会对服务器端的主程序造成影响。,本章目录,例:Dim Sserver
30、As Socket 服务器端的socket Dim newthread As Thread 专门用来监听、连接及与客户端收发数据的线程 对Sserver进行必要的创建、绑定等工作 Public Sub WaitData()Sserver.Listen(100)监听,最多接受100个连接 While(True)因为是不停地响应连接,所以用无限循环 Dim bytes(1024)As Byte用来存储接收到的字节 Dim newsocket As Socket=Sserver.Accept()若接收 到,则创建一个新的Socket与之连接 newsocket.Receive(bytes)接收数据,若用 newsocket.send(Byte(),则发送数据 处理接收到的数据 End WhileEnd Sub,本章目录,然后在服务器端程序中需要开始进行网络监听的地方,加入下列代码:newthread=New Thread(AddressOf WaitData)建立新的线程,专门执行WaitData过程newthread.Start()启动线程,本章目录,