《C#TCP协议的程序设计.ppt》由会员分享,可在线阅读,更多相关《C#TCP协议的程序设计.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C#网络通信程序设计网络通信程序设计第第3章章 基于基于TCP协议的程序设计协议的程序设计本章的主要内容本章的主要内容学习内容:学习内容:(1)了解)了解TCP协议的特点与数据包格式;协议的特点与数据包格式;(2)理解阻塞模式和非阻塞模式的特点及其应用;)理解阻塞模式和非阻塞模式的特点及其应用;(3)掌握同步套接字编程和异步套接字编程方法;)掌握同步套接字编程和异步套接字编程方法;(4)掌握)掌握TcpListener和和TcpClient的综合应用方法。的综合应用方法。学习目标:学习目标:(1)掌握基于)掌握基于TCP协议的同步协议的同步/异步套接字编程方法;异步套接字编程方法;(2)学会基
2、于)学会基于C/S结构的网络聊天程序设计与实现能力结构的网络聊天程序设计与实现能力1/26/202324.1 TCP协议介绍协议介绍(1)TCP协议提供服务的特点协议提供服务的特点:面向连接的传输;面向连接的传输;端到端的通信;端到端的通信;高可靠性,确保传输数据的正确性,不出现丢失或乱序;高可靠性,确保传输数据的正确性,不出现丢失或乱序;全双工方式传输;全双工方式传输;采用字节流方式,即以字节为单位传输字节序列;采用字节流方式,即以字节为单位传输字节序列;紧急数据传送功能。紧急数据传送功能。1/26/20233(2)TCP数据包格式数据包格式l注意标志位的作用注意标志位的作用l注意选项的作用
3、注意选项的作用,如何使用选项部分如何使用选项部分?1/26/20234(3)TCP协议的通信特点协议的通信特点l3次握手次握手;l4次挥手次挥手;l回顾拥塞控制回顾拥塞控制1/26/20235(4)TCP的常见端口的常见端口端口号端口号服服务进程程描描 述述20FTP文件文件传输协议(数据(数据连接)接)21FTP文件文件传输协议(控制(控制连接)接)23Telnet虚虚拟终端网端网络25SMPT简单邮件件传输协议53DNS域名服域名服务器器80HTTP超文本超文本传输协议111RPC远程程过程程调用用1/26/202364.2 阻塞模式阻塞模式/非阻塞模式非阻塞模式l同步同步l异步异步l阻塞
4、模式阻塞模式:读、写、连接、接收读、写、连接、接收l非阻塞模式非阻塞模式1/26/202374.2.1 阻塞模式的效率提升方法阻塞模式的效率提升方法(1)超时控制方法超时控制方法l套接字选项设置套接字选项设置:SetSockOption(),GetSockOption()应用示例:应用示例:Socket socketTimeout=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPoint myHost=new IPEndPoint(IPAddress.Any,8080);socketT
5、imeout.SetSocket Option(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);l定时器定时器1/26/20238(2)套接字多路复用方法套接字多路复用方法C#使用使用Socket类提供的类提供的Select方法方法。应用示例:。应用示例:ArrayList socketList=new ArrayList(5);socketList.Add(sock1);socketList.Add(sock2);Socket.Select(socketList,null,null,1000);Byte buffe
6、r=new type1024;for(int i=0;i0)int recv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;接收数据的方法有接收数据的方法有2种:种:l使用使用Socket类的类的Receive方法方法l使用使用NetworkStream类的类的Read方法方法。Read方法的返回值是一方法的返回值是一个整数,表明实际从个整数,表明实际从TCP缓冲区中读取的字节数,可能少于远缓冲区中读取的字节数,可能少于远端发来的数据量。端发来的数据量。1/26/202314服务器服务器“数据发送数据发送”的
7、主要代码的主要代码发送数据也有发送数据也有2种方法:种方法:l使用使用Socket类的类的Send方法方法,应用示例:,应用示例:byte bytes=new byte2048;string message=测试数据发送测试数据发送;bytes=System.Text.Encoding.Unicode.GetBytes(message);newSocket.Send(bytes,bytes.Length,SocketFlags.None);l使用使用NetworkStream类的类的Write方法方法,能够保证将用户数据全部发送,能够保证将用户数据全部发送到到TCP缓冲区中,自动完成。不需要用
8、户管理,简化了编程工作。缓冲区中,自动完成。不需要用户管理,简化了编程工作。string str=this.rtbSend.Rtf;int i=str.Length;byte datasize=new byte4;datasize=System.BitConverter.GetBytes(i);/将位整数值转换为字节数组将位整数值转换为字节数组byte sendbytes=System.Text.Encoding.Unicode.GetBytes(str);NetworkStream netStream=new NetworkStream(newSocket);netStream.Write(
9、datasize,0,4);netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();this.rtbSend.Rtf=;1/26/202315客户机客户机“连接请求连接请求”的主要代码的主要代码IPAddress ip=IPAddress.Parse(this.tbIP.Text);IPEndPoint server=new IPEndPoint(ip,Int32.Parse(this.tbPort.Text);socket=new Socket(AddressFamily.InterNetwork,SocketType.
10、Stream,ProtocolType.Tcp);trysocket.Connect(server);catchMessageBox.Show(与服务器连接失败!与服务器连接失败!);return;this.btnRequest.Enabled=false;this.lbState.Items.Add(与服务器连接成功与服务器连接成功);Thread thread=new Thread(new ThreadStart(AcceptMessage);thread.Start();1/26/2023164.4 异步套接字编程技术异步套接字编程技术配配 套套 的的 方方 法法功功 能能BeginAc
11、cept(),EndAccept()服服务器接收一个器接收一个连接接请求求BeginConnect(),EndConnect()客客户端端连接到服接到服务器器BeginReceive(),EndReceive()接收数据接收数据BeginReceiveFrom(),EndReceiveFrom()从指定的主机上接收数据从指定的主机上接收数据BeginSend(),EndSend()发送数据送数据BeginSendTo(),EndSendTo()将数据将数据发送到指定的主机送到指定的主机1/26/202317(1)客户机发出连接请求客户机发出连接请求客户端使用客户端使用BeginConnect方
12、法发出连接请求给服务器:方法发出连接请求给服务器:Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPoint iep=new IPEndPoint(IPAddress.Parse(127.0.0.1),8000);socket.BeginConnect(iep,new AsyncCallback(ConnectServer),socket);private void ConnectServer(IAsyncResult ar)clientSocket=(So
13、cket)ar.AsyncState;clientSocket.EndConnect(ar);clientSocket.BeginReceive(data,0,dataSize,SocketFlags.None,new AsyncCallback(ReceiveData),clientSocket);1/26/202318(2)服务器接收连接请求服务器接收连接请求private Socket serverSocket,newSocket;IPHostEntry myHost=new IPHostEntry();myHost=Dns.GetHostByName(NetHost);/主机名称主机名
14、称NetHostIPAddress myIP=IPAddress.Parse(myHost.AddressList0.ToString();/选取第选取第1个地址个地址IPEndPoint iep=new IPEndPoint(myIP,8000);serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,Protocol Type.Tcp);serverSocket.Bind(iep);serverSocket.Listen(5);/监听队列为监听队列为5/开始异步接收连接请求开始异步接收连接请求serverSo
15、cket.BeginAccept(new AsyncCallback(AcceptConnection),serverSocket);1/26/202319(3)服务器发送和接收数据服务器发送和接收数据l一旦服务器接收到一个客户机连接请求,一旦服务器接收到一个客户机连接请求,AsyncCallback委托将自动委托将自动调用调用AcceptConnection方法方法。private void AcceptConnection(IAsyncResult ar)Socket myServer=(Socket)ar.AsyncState;/异步接收传入的连接,并创建新的异步接收传入的连接,并创建新
16、的Socket来处理远程主机通信来处理远程主机通信newSocket=myServer.EndAccept(ar);byte message=System.Text.Encoding.Unicode.GetBytes(客户你好!客户你好!);newSocket.BeginSend(message,0,message.Length,SocketFlags.None,new AsyncCallback(SendData),newSocket);1/26/202320SendData方法方法 当套接字准备好发送的数据时,会自动调用当套接字准备好发送的数据时,会自动调用SendData方法。方法。En
17、dSend方法方法用于完成数据发送,并返回成功发送的字节数。该段程序示例如下:用于完成数据发送,并返回成功发送的字节数。该段程序示例如下:private void SendData(IAsyncResult ar)Socket client=(Socket)ar.AsyncState;trynewSocket.EndSend(ar);client.BeginReceive(data,0,dataSize,SocketFlags.None,new AsyncCallback(ReceiveData),client);异步接收数据异步接收数据catchclient.Close();serverSo
18、cket.BeginAccept(new AsyncCallback(AcceptConnection),server Socket);/开始异步接收新的连接请求开始异步接收新的连接请求1/26/202321课堂思考课堂思考l如何图形化描述以上异步套接字各种状态之间的状态变化如何图形化描述以上异步套接字各种状态之间的状态变化?如?如状态转换图状态转换图?1/26/2023224.5 基于基于TcpClient类和类和TcpListener类的编程类的编程lTcpClient类和类和TcpListener类是构建于类是构建于Socket之上,提之上,提供了更高抽象级别的供了更高抽象级别的TCP服
19、务,便于程序员快速编写网络服务,便于程序员快速编写网络程序。程序。lTcpClient类用于客户机,类用于客户机,TcpListener类用于服务器。类用于服务器。1/26/202323(1)TcpClient类的使用方法类的使用方法第第12 阶段阶段:方法方法1:先创建先创建,后连接后连接:/创建创建TcpClient实例实例TcpClient client=new TcpClient();/向服务器发出连接请求向服务器发出连接请求client.Connect(www.software.org,8000);方法方法2:直接指定和连接服务器直接指定和连接服务器:TcpClient client
20、=new TcpClient(www.software.org,8000);方法方法3:指定指定IPEndPoint的方式:的方式:IPEndPoint localEndPoint=new IPEndPoint(IPAddress.Parse(192.168.0.88),8010);TcpClient client=new TcpClient(localEndPoint);client.Connect(www.software.org,8000);4个阶段个阶段:创建实例、连接服务器、收发数据和关闭连接。创建实例、连接服务器、收发数据和关闭连接。1/26/202324(1)TcpClient类
21、的使用方法类的使用方法/第三阶段第三阶段:数据接收数据接收netStream=client.GetStream();sr=new StreamReader(netStream,System.Text.Encoding.Unicode);str=sr.ReadLine();Console.WriteLine(str);/第三阶段第三阶段:数据发送数据发送ws=client.GetStream();ws.Write(data,0,data.Length);/或者或者sw=new StreamWriter(ws,System.Text.Encoding.Unicode);sw.WriteLine(s
22、tr);sw.Flush();./第第4阶段:连接关闭阶段:连接关闭client.Close();4个阶段个阶段:创建实例、连接服务器、收发数据和关闭。创建实例、连接服务器、收发数据和关闭。1/26/202325(2)TcpListener类的使用方法类的使用方法TcpListener类用于监听和接收传入的连接请求,包括创建类用于监听和接收传入的连接请求,包括创建实例、监听连接、接收连接请求、收发数据和停止服务共实例、监听连接、接收连接请求、收发数据和停止服务共5个阶段。个阶段。典型用法如下:典型用法如下:IPAddress localAddress=Dns.Resolve(Dns.GetHo
23、stName().AddressList0;IPEndPoint localEndPoint=new IPEndPoint(localAddress,8010);TcpListener tcpListener=new TcpListener(localEndPoint);/接着接着,开始侦听客户端的连接请求开始侦听客户端的连接请求tcpListener.Start();/开始接收连接请求开始接收连接请求TcpClient newClient=tcpListener.AcceptTcpClient();程序执行到程序执行到AcceptTcpClient()时,会处于阻塞状态,直到有客户端的连接请
24、求到达。接时,会处于阻塞状态,直到有客户端的连接请求到达。接收请求后会返回一个收请求后会返回一个TcpClient对象,该对象将与此建立连接的客户端进行通信。对象,该对象将与此建立连接的客户端进行通信。1/26/2023264.6 网络游戏程序设计网络游戏程序设计服务器界面服务器界面 客户机界面客户机界面1/26/202327本章小结思考本章小结思考l同步套接字同步套接字:采用多路复用、多线程方法、异步选择采用多路复用、多线程方法、异步选择函数函数;l异步套接字:能够很好地客户机异步套接字:能够很好地客户机/服务器的场合;服务器的场合;lTcpClient和和TcpListener类的使用;类
25、的使用;l1/26/202328实验项目实验项目1完成一个并发服务的完成一个并发服务的TCP程序设计程序设计,要求如下:,要求如下:(1)界面上能够设定连接数量,比如连接数为)界面上能够设定连接数量,比如连接数为100;(2)当一个连接释放后,程序能够自动分配给新的客户请求;)当一个连接释放后,程序能够自动分配给新的客户请求;(3)从多台客户机上分别连接服务器,测试并发服务效果;)从多台客户机上分别连接服务器,测试并发服务效果;(4)连接完成后,使客户之间可以直接通信,不需要再经过服务器,)连接完成后,使客户之间可以直接通信,不需要再经过服务器,服务器仅作管理用。服务器仅作管理用。2修改网络游戏程序修改网络游戏程序,达到以下功能:,达到以下功能:(1)能够设置每局的周期,比如)能够设置每局的周期,比如1分钟;分钟;(2)能够更改比赛规则,比如)能够更改比赛规则,比如3个相连时未输;个相连时未输;(3)能够记录得分。)能够记录得分。3网络游戏设计思考网络游戏设计思考:请参考有关资料,尝试设计一个:请参考有关资料,尝试设计一个网络五子棋网络五子棋游戏。还可以考虑游戏。还可以考虑网上中国象棋、网络麻将网上中国象棋、网络麻将等,并扩展到等,并扩展到Web应应用环境中。用环境中。1/26/202329