C#网络程序开发(计算机科学与技术第2版21世纪高等学校规划教材)

C#网络程序开发(计算机科学与技术第2版21世纪高等学校规划教材)
作者: 编者:何波//傅由甲
出版社: 清华大学
原售价: 39.00
折扣价: 29.30
折扣购买: C#网络程序开发(计算机科学与技术第2版21世纪高等学校规划教材)
ISBN: 9787302506768

作者简介

内容简介

第3章TCP网络程序开发 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接(连接导向)的、可靠的、基于字节流的、全双工的传输层(transport layer)通信协议。在简化的计算机OS模型中,TCP位于IP层之上,用于完成传输层的指定功能。TCP的工作过程与人们日常生活中的打电话相似,要经过建立连接、传输数据和连接终止3个步骤。 3.1TCP程序开发主要技术 TCP程序开发的主要技术有使用套接字进行TCP传输、使用TCP类进行网络传输和TCP同步异步等。 3.1.1使用套接字进行TCP传输 套接字分为两种: 一种是面向连接的(connectionoriented)套接字,另一种是无连接的(connectionless)套接字。使用TCP协议编程的套接字是面向连接的,通过它建立两个IP地址端点之间的会话,一旦建立了这种连接就可以在设备之间进行可靠传输。 根据连接的启动方式和本地套接字要连接的目标,套接字的连接过程可分为以下3个阶段: (1) 服务器监听: 是指服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 图31面向连接的套接字编程 (2) 客户端请求: 是指由客户端的套接字提出连接请求,要连接的目标是服务器的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器套接字提出连接请求。 (3) 连接确认: 是指当服务器套接字监听到客户端套接字的连接请求时,它就响应客户端套接字的请求,把服务器套接字的信息发给客户端,一旦客户端确认了此信息,连接即可建立。而服务器套接字继续监听其他客户端套接字的连接请求。面向连接的套接字编程框架如图31所示。 1. 建立连接 服务器和客户端通信的前提是服务器首先在指定的端口监听是否有客户端的连接请求,当客户端向服务器发起连接请求并被服务器接收后,双方即可建立连接。 (1) 服务器编程。在服务器程序中,首先创建一个本地套接字对象。例如: Socket localSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 然后将套接字绑定到用于TCP通信的本地IP地址和窗口上。Bind方法用于完成绑定工作。例如: IPHostEntry local=Dns.GetHostByName(Dns.GetHostName()); IPEndPoint iep=new IPEndPoint(local.AddressList[0], 1180); localSocket.Bind(iep); 将套接字与端口绑定后,就用Listen方法等待客户端发出连接尝试。例如: locatSocket.Listen(10); Listen方法自动将客户端连接请求放到请求队列中,参数指出系统等待用户服务程序排队的连接数,超过连接数的任何客户端都不能与服务器进行通信。 在Listen方法执行之后,服务器已经做好了接收任何连接的准备。这时,可用Accept方法从请求队列中获取连接。例如: localSocket.Accept(); 程序执行到Accept方法时被阻塞,直到接收到客户端的连接请求后才继续执行下一条语句。服务器一旦接收了客户端的连接请求,Accept方法立即返回一个与客户端通信的新的套接字。该套接字中既包含了本机的IP地址和端口号,也包含了客户端的IP地址和端口号。然后就可以利用此套接字与该客户端进行通信了。 (2) 客户端编程。客户端利用Socket的Connect方法向远程主机的端点发起连接请求,并将自身绑定到系统自动分配的端点上。例如: IPAddress remoteHost=IPAddress.Parse("192.168.0.1"); IPEndPoint iep=new IPEndPoint(remoteHost, 1180); Socket localSocket=new Socket( AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); localSocket.Connect(iep); 程序运行后,客户端与服务器端建立连接之前,系统不会执行Connect语句下面的语句,而是处于阻塞状态,直到连接成功或出现异常为止。 2. 发送和接收消息 一旦客户端与服务器建立连接,客户机和服务器都可以使用Socket对象的Send和Receive方法进行通信。 (1) 服务器编程。当服务器接收客户端的连接请求成功时,Accept方法返回包含该客户端IP地址及端口号信息的套接字。服务器可以用该套接字与客户端通信。 … Socket clientSocket=localSocket.Accept(); //建立连接后,利用Send方法向客户端发送信息 clientSocket.Send(Encoding.ASCII.GetBytes("server send Hello")); //接收客户端信息 byte[] myresult=new Byte[1024]; int receiveNum=clientSocket.Receive(myresult); Console.WriteLine("接收客户端信息:{0}",Encoding.ASCII.GetString(myresult)); … (2) 客户端编程。客户端可直接使用本地套接字的Send方法向服务器发送信息,利用Receive方法接收服务器信息。 … localSocket.Connect(iep); //建立连接成功后,向服务器发送信息 string sendMessage="client send Message Hello"+DateTime.Now; localSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); Console.WriteLine("向服务器发送信息:{0}", sendMessage); //接收服务器信息 byte[] result=new Byte[1024]; localSocket.Receive(result); Console.WriteLine("接收服务器信息:{0}", Encoding.ASCII.GetString(result)); … 3. 关闭连接 通信完成后,首先用Shutdown方法停止会话,然后关闭Socket实例。表31说明了Socket.Shutdown方法可以使用的值。 表31Socket.ShutDown值 名称说明 SocketShutdown.Receive防止套接字上接收数据,如果收到额外的数据,将发送一个RST信号 SocketShutdown.Send防止套接字上发送数据,在所有存留的缓冲器中的数据发送出去之后,发送一个FIN信号 SocketShutdown.Both在套接字上既停止发送也停止接收 关闭连接的一般用法: localSocket.Shutdown(SocketShutdown.Both); localSocket.Close(); 该方法允许Socket对象一直等待,直到将内部缓冲区的数据发送完为止。 3.1.2使用TCP类进行网络传输 为了简化网络编程的复杂度,.NET对套接字进行了封装,封装后的类就是TcpListener类和TcpClienr类,它们都在System.Net.Sockets命名空间下。值得注意的是,TcpListener类和TcpClienr类只支持标准协议编程。如果要编写非标准协议的程序,只能使用套接字来实现。 TcpListener类用于监听客户端的连接请求; TcpClienr类用于提供本地主机和远程主机的连接信息。 1. TcpListener类 TcpListener类用于监听和接收传入的连接请求。该类的构造函数有两种常用的重载形式。 1) TcpListener(IPEndPoint iep) 其中,iep是IPEndPoint类型的对象,iep包含了服务器端的IP地址和端口号。该构造函数通过IPEndPoint类型的对象在指定的IP地址与端口监听客户端连接请求。 2) TcpListener(IPAddress localAddr, int port) 该构造函数建立一个TcpListener对象,在参数中直接指定本机IP地址和端口,并通过指定的本机IP地址和端口监听传入的连接请求。 构造了TcpListener对象后,就可以监听客户端的连接请求了。与TcpClient相似,TcpListener也分别提供了同步方法和异步方法。在同步工作方式下,对应以下几种方法。 (1) AcceptSocket方法。该方法用于在同步阻塞方式下获取并返回一个用来接收和发送数据的套接字对象,同时从传入的连接队列中移除该客户端的连接请求。该套接字包含了本地和远程主机的IP地址和端口号,然后通过调用Socket对象的Send方法和Receive方法和远程主机进行通信。 (2) AcceptTcpClient方法。该方法用于在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了Socket的TcpClient对象。 (3) Start方法。该方法用于启动监听,构造函数为: "《C#网络程序开发(第二版)》涵盖C#网络程序开发的理论、实验和课程设计。课程设计部分包括课程设计目的求和题目等。实验部分以理论课例程为基础进行扩展和提高,有利于激发学习兴趣。 "