C#TCP协议的程序设计_第1页
C#TCP协议的程序设计_第2页
C#TCP协议的程序设计_第3页
C#TCP协议的程序设计_第4页
C#TCP协议的程序设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#网络通信程序设计网络通信程序设计第第3章章 基于基于TCP协议的程序设计协议的程序设计本章的主要内容本章的主要内容学习内容:学习内容:(1)了解)了解TCP协议的特点与数据包格式;协议的特点与数据包格式;(2)理解阻塞模式和非阻塞模式的特点及其应用;)理解阻塞模式和非阻塞模式的特点及其应用;(3)掌握同步套接字编程和异步套接字编程方法;)掌握同步套接字编程和异步套接字编程方法;(4)掌握)掌握TcpListener和和TcpClient的综合应用方法。的综合应用方法。学习目标:学习目标:(1)掌握基于)掌握基于TCP协议的同步协议的同步/异步套接字编程方法;异步套接字编程方法;(2)学会基

2、于)学会基于C/S结构的网络聊天程序设计与实现能力结构的网络聊天程序设计与实现能力4/11/202224.1 TCP协议介绍协议介绍(1) TCP协议提供服务的特点协议提供服务的特点: 面向连接的传输;面向连接的传输; 端到端的通信;端到端的通信; 高可靠性,确保传输数据的正确性,不出现丢失或乱序;高可靠性,确保传输数据的正确性,不出现丢失或乱序; 全双工方式传输;全双工方式传输; 采用字节流方式,即以字节为单位传输字节序列;采用字节流方式,即以字节为单位传输字节序列; 紧急数据传送功能。紧急数据传送功能。 4/11/20223(2) TCP数据包格式数据包格式l注意标志位的作用注意标志位的作

3、用l注意选项的作用注意选项的作用, 如何使用选项部分如何使用选项部分?4/11/20224(3) TCP协议的通信特点协议的通信特点l3次握手次握手;l4次挥手次挥手;l回顾拥塞控制回顾拥塞控制4/11/20225(4) TCP的常见端口的常见端口端口号端口号服务进程服务进程描描 述述20FTP文件传输协议(数据连接)文件传输协议(数据连接)21FTP文件传输协议(控制连接)文件传输协议(控制连接)23Telnet虚拟终端网络虚拟终端网络25SMPT简单邮件传输协议简单邮件传输协议53DNS域名服务器域名服务器80HTTP超文本传输协议超文本传输协议111RPC远程过程调用远程过程调用4/11

4、/202264.2 阻塞模式阻塞模式/非阻塞模式非阻塞模式l同步同步l异步异步l阻塞模式阻塞模式: 读、写、连接、接收读、写、连接、接收l非阻塞模式非阻塞模式4/11/202274.2.1 阻塞模式的效率提升方法阻塞模式的效率提升方法(1) 超时控制方法超时控制方法l套接字选项设置套接字选项设置:SetSockOption(), GetSockOption()应用示例:应用示例:Socket socketTimeout=new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint my

5、Host=new IPEndPoint(IPAddress.Any,8080);socketTimeout.SetSocket Option(SocketOptionLevel.Socket,SocketOptionName. ReceiveTimeout,3000);l定时器定时器4/11/20228(2) 套接字多路复用方法套接字多路复用方法C#使用使用Socket类提供的类提供的Select方法方法。应用示例:。应用示例:ArrayList socketList=new ArrayList(5);socketList.Add(sock1);socketList.Add(sock2);So

6、cket.Select(socketList,null,null,1000);Byte buffer=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缓冲区中读取的字节数,可能少于远缓冲区中读取的字节数

7、,可能少于远端发来的数据量。端发来的数据量。 4/11/202214服务器服务器“数据发送数据发送”的主要代码的主要代码发送数据也有发送数据也有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类的类的Wr

8、ite方法方法 ,能够保证将用户数据全部发送,能够保证将用户数据全部发送到到TCP缓冲区中,自动完成。不需要用户管理,简化了编程工作。缓冲区中,自动完成。不需要用户管理,简化了编程工作。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

9、 netStream=new NetworkStream(newSocket);netStream.Write(datasize,0,4);netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();this.rtbSend.Rtf=;4/11/202215客户机客户机“连接请求连接请求”的主要代码的主要代码IPAddress ip=IPAddress.Parse(this.tbIP.Text);IPEndPoint server=new IPEndPoint(ip, Int32.Parse(this.tbPort.Text)

10、;socket=new Socket(AddressFamily.InterNetwork,SocketType.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();

11、4/11/2022164.4 异步套接字编程技术异步套接字编程技术配配 套套 的的 方方 法法功功 能能BeginAccept(), EndAccept()服务器接收一个连接请求服务器接收一个连接请求BeginConnect(), EndConnect()客户端连接到服务器客户端连接到服务器BeginReceive(), EndReceive()接收数据接收数据BeginReceiveFrom(),EndReceiveFrom()从指定的主机上接收数据从指定的主机上接收数据BeginSend(), EndSend()发送数据发送数据BeginSendTo(), EndSendTo()将数据发送

12、到指定的主机将数据发送到指定的主机4/11/202217(1) 客户机发出连接请求客户机发出连接请求客户端使用客户端使用BeginConnect方法发出连接请求给服务器:方法发出连接请求给服务器: Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep=new IPEndPoint(IPAddress.Parse(),8000);socket.BeginConnect(iep,new AsyncCallback(Connec

13、tServer),socket);private void ConnectServer(IAsyncResult ar)clientSocket=(Socket)ar.AsyncState;clientSocket.EndConnect(ar);clientSocket.BeginReceive(data,0,dataSize,SocketFlags.None, new AsyncCallback(ReceiveData),clientSocket); 4/11/202218(2) 服务器接收连接请求服务器接收连接请求private Socket serverSocket,newSocket;

14、IPHostEntry myHost=new IPHostEntry();myHost=Dns.GetHostByName(NetHost);/主机名称主机名称NetHostIPAddress myIP=IPAddress.Parse(myHost.AddressList0.ToString();/选取第选取第1个地址个地址IPEndPoint iep=new IPEndPoint(myIP,8000);serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,Protocol Type.Tcp);serverSo

15、cket.Bind(iep);serverSocket.Listen(5);/监听队列为监听队列为5/开始异步接收连接请求开始异步接收连接请求serverSocket.BeginAccept(new AsyncCallback(AcceptConnection),serverSocket);4/11/202219(3) 服务器发送和接收数据服务器发送和接收数据l一旦服务器接收到一个客户机连接请求,一旦服务器接收到一个客户机连接请求,AsyncCallback委托将自动委托将自动调用调用AcceptConnection方法方法。private void AcceptConnection(IAsy

16、ncResult ar)Socket myServer=(Socket)ar.AsyncState;/异步接收传入的连接,并创建新的异步接收传入的连接,并创建新的Socket来处理远程主机通信来处理远程主机通信newSocket=myServer.EndAccept(ar);byte message=System.Text.Encoding.Unicode.GetBytes(客户你好!客户你好!);newSocket.BeginSend(message,0,message.Length,SocketFlags.None,new AsyncCallback(SendData),newSocket

17、); 4/11/202220SendData方法方法 当套接字准备好发送的数据时,会自动调用当套接字准备好发送的数据时,会自动调用SendData方法。方法。EndSend方法方法用于完成数据发送,并返回成功发送的字节数。该段程序示例如下:用于完成数据发送,并返回成功发送的字节数。该段程序示例如下:private void SendData(IAsyncResult ar)Socket client=(Socket)ar.AsyncState;trynewSocket.EndSend(ar);client.BeginReceive(data,0,dataSize,SocketFlags.Non

18、e, new AsyncCallback (ReceiveData),client); 异步接收数据异步接收数据catchclient.Close();serverSocket.BeginAccept(new AsyncCallback(AcceptConnection),server Socket); /开始异步接收新的连接请求开始异步接收新的连接请求4/11/202221课堂思考课堂思考l如何图形化描述以上异步套接字各种状态之间的状态变化?如何图形化描述以上异步套接字各种状态之间的状态变化?如如状态转换图状态转换图?4/11/2022224.5 基于基于TcpClient类和类和TcpLi

19、stener类的编程类的编程lTcpClient类和类和TcpListener类是构建于类是构建于Socket之上,提之上,提供了更高抽象级别的供了更高抽象级别的TCP服务,便于程序员快速编写网络服务,便于程序员快速编写网络程序。程序。lTcpClient类用于客户机,类用于客户机,TcpListener类用于服务器。类用于服务器。 4/11/202223(1) TcpClient类的使用方法类的使用方法第第12 阶段阶段: 方法方法1: 先创建先创建,后连接后连接:/创建创建TcpClient实例实例TcpClient client=new TcpClient();/向服务器发出连接请求向服

20、务器发出连接请求client.Connect(,8000);方法方法2 : 直接指定和连接服务器直接指定和连接服务器: TcpClient client=new TcpClient(,8000);方法方法3: 指定指定IPEndPoint的方式:的方式:IPEndPoint localEndPoint=new IPEndPoint(IPAddress.Parse(8),8010);TcpClient client=new TcpClient(localEndPoint);client.Connect(www.

21、,8000);4个阶段个阶段: 创建实例、连接服务器、收发数据和关闭连接。创建实例、连接服务器、收发数据和关闭连接。4/11/202224(1) TcpClient类的使用方法类的使用方法/第三阶段第三阶段: 数据接收数据接收netStream=client.GetStream();sr=new StreamReader(netStream,System.Text.Encoding.Unicode);str=sr.ReadLine();Console.WriteLine(str);/第三阶段第三阶段:数据发送数据发送ws=client.GetStream();ws.Wr

22、ite(data,0,data.Length);/或者或者sw=new StreamWriter(ws,System.Text.Encoding.Unicode);sw.WriteLine(str);sw.Flush();./第第4阶段:连接关闭阶段:连接关闭client.Close(); 4个阶段个阶段: 创建实例、连接服务器、收发数据和关闭。创建实例、连接服务器、收发数据和关闭。4/11/202225(2) TcpListener类的使用方法类的使用方法TcpListener类用于监听和接收传入的连接请求,包括创建类用于监听和接收传入的连接请求,包括创建实例、监听连接、接收连接请求、收发数

23、据和停止服务共实例、监听连接、接收连接请求、收发数据和停止服务共5个阶段。个阶段。典型用法如下:典型用法如下:IPAddress localAddress=Dns.Resolve(Dns.GetHostName().AddressList0;IPEndPoint localEndPoint=new IPEndPoint(localAddress,8010);TcpListener tcpListener=new TcpListener(localEndPoint);/接着接着,开始侦听客户端的连接请求开始侦听客户端的连接请求tcpListener.Start();/开始接收连接请求开始接收连接请求TcpClient newClient=tcpListener.AcceptTcpClient(); 程序执行到程序执行到AcceptTcpClient()时,会处于阻塞状态,直到有客户端的连接请求到达。接时,会处于阻塞状态,直到有客户端的连接请求到达。接收请求后会返回一个收请求后会返回一个TcpClient对象,该对象将与此建立连接的客

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论