第10章TCP协议开发.ppt
《第10章TCP协议开发.ppt》由会员分享,可在线阅读,更多相关《第10章TCP协议开发.ppt(87页珍藏版)》请在沃文网上搜索。
1、1第第10章章 TCP协议开发协议开发10.0 引言引言10.1 相关相关概念概念 10.2 定义与获取主机信息定义与获取主机信息 10.3 同步套接字编程同步套接字编程 10.4 同步套接字开发举例同步套接字开发举例简单聊天程序简单聊天程序10.5 使用使用TcpClient和和TcpListener简化简化TCP编程编程 10.6 异步套接字编程异步套接字编程 10.7 异步套接字开发举例异步套接字开发举例 10.8 小结小结 210.0 引言引言 1.面向连接的套接字面向连接的套接字 使用使用TCP协议来建立协议来建立IP地址端点之间的会话。地址端点之间的会话。如图:如图:服务器服务器
2、客户端客户端Socket()Bind()Listen()Accept()Receive()Send()Close()Socket()Connect()Send()Receive()Close()310.0 引言引言 410.0 引言引言 510.0 引言引言2.服务器端编程服务器端编程1 指定指定IP地址和端口号地址和端口号(IPAddress、IPEndPoint)IPAddress ip=IPAddress.Parse(127.0.0.1);IPEndPoint iep=new IPEndPoint(ip,6788);2 创建套接字创建套接字Socket socket=new Socket
3、(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);610.0 引言引言3 套接字与套接字与IP端口绑定端口绑定:Bind4 侦听客户端的请求侦听客户端的请求:Listen5 接收客户端的请求接收客户端的请求:Accept6 接收客户端发送的信息接收客户端发送的信息:Receive (?)7 向客户端发送信息向客户端发送信息:Send8 关闭套接字关闭套接字 :Close (代码见代码见 TcpChatOne)710.0 引言引言3.服务器端编程需做的特殊处理服务器端编程需做的特殊处理 发送信息使用用户自身触发的事件发
4、送信息使用用户自身触发的事件,但接收但接收对方发来的信息是对方来触发的事件对方发来的信息是对方来触发的事件;是不是意是不是意味着随时都处于接收状态味着随时都处于接收状态,类似类似QQ的聊天的聊天,对方对方何时发来信息是不确定的何时发来信息是不确定的.如何解决如何解决?810.0 引言引言4.客户端编程客户端编程1 向服务器端发出请求向服务器端发出请求 Connect来处理来处理2 其他处理的方式类似服务器端其他处理的方式类似服务器端910.1 基本概念基本概念基本概念基本概念-同步套接字同步套接字 在在通通过过Socket进进行行连连接接、接接收收、发发送送操操作作时时,客客户户机机或或服服务
5、务器器会会暂暂停停当当前前工工作作,处处于于等等待待状状态态,即一直等到有数据时才继续执行下面的语句。即一直等到有数据时才继续执行下面的语句。同同步步套套接接字字适适用用于于网网络络传传输输量量不不太太大大的的情情况。况。10-异步套接字异步套接字 在通过在通过Socket进行连接、接收、发送操作时,进行连接、接收、发送操作时,客户机或服务器不会暂停当前工作,而是利用客户机或服务器不会暂停当前工作,而是利用callback机制进行连接、接收和发送处理。机制进行连接、接收和发送处理。异步套接字适用于需要在网络上进行大量数异步套接字适用于需要在网络上进行大量数据传输的应用程序。据传输的应用程序。1
6、110.2 定义与获取主机信息定义与获取主机信息定义主机对象定义主机对象IPEndPoint类类IPAddress类类获取主机信息获取主机信息Dns类中常用方法类中常用方法 Dns.GetHostName()Dns.GetHostByName(string hostname)Dns.GetHostByAddress(address)Dns.Resolve()121.定义主机对象定义主机对象 IPEndPointIPEndPoint 类类包包含含应应用用程程序序连连接接到到主主机机上上的的服服务务所所需需的的主主机机和和端端口口信信息息。通通过过组组合合服服务务的的主主机机 IP IP 地地址址
7、和和端端口口号,号,IPEndPointIPEndPoint 类形成到服务的连接点。类形成到服务的连接点。常用的方法原型:常用的方法原型:public public IPEndPoint(IPAddressIPEndPoint(IPAddress address,address,intint port);port);说明:说明:addressaddress:IPIP地址地址 portport:端口号端口号功能:初始化功能:初始化IPEndPointIPEndPoint类的实例。类的实例。用法举例:用法举例:IPAddressmyServerIPIPAddressmyServerIP=new I
8、PAddress.Parse(“127.0.0.1”);=new IPAddress.Parse(“127.0.0.1”);IPEndPoint myServer=new IPEndPoint(myServerIP,13);132.2.主机解析主机解析程序实例程序实例Dns.Resolve()的使用的使用using System;using System.Net;public class TestFileStream static void Main()Console.Write(输入主机名或者输入主机名或者IP地址:地址:);string str=Console.ReadLine();IPH
9、ostEntry host=Dns.Resolve(str);for(int i=0;i0)int sen=clientSocket.Send(bytes,start,dataleft,SocketFlags.None);start+=sen;dataleft-=sen;21(2)使用使用NetworkStream类的类的Write()方法方法 如果创建了如果创建了NetworkStream对象,就可以直接使用对象,就可以直接使用该对象发送数据,例如该对象发送数据,例如:NetworkStream netstream=new NetworkStream(clientSocket);string
10、 message=发送的数据发送的数据;byte bytes=System.Text.Encoding.Unicode.GetBytes(message);netstream.Write(bytes,0,bytes.Length);与套接字的与套接字的Send()方法不同,方法不同,NetworkStream 对象对象的的Write()方法返回值为方法返回值为void。224.接收数据接收数据 与发送数据相似,接收数据的方法也有与发送数据相似,接收数据的方法也有两种:两种:(1)使用使用Socket类的类的Receive方法方法 (2)使用使用NetworkStream类的类的Read方法,方
11、法,其用法与发送数据类似。其用法与发送数据类似。23例如:例如:byte message=new byte1024;NetworkStream netstream=new NetworkStream(clientSocket);int len=netstream.Read(message,0,message.Length);注意注意:Read()方法有一个整型的返回值,表明实际从方法有一个整型的返回值,表明实际从TCP缓冲区中读取了多少字节的数据,这是因为有缓冲区中读取了多少字节的数据,这是因为有可能可能TCP缓冲区还没有接收到远程设备发送过来的缓冲区还没有接收到远程设备发送过来的指定长度的数
12、据。指定长度的数据。245.TCP协议的无消息边界问题协议的无消息边界问题 TCP协议的无消息边界问题协议的无消息边界问题 TCP协议是无消息边界的,即不能保证来自单个协议是无消息边界的,即不能保证来自单个Send方法的数据能被单个方法的数据能被单个Receive方法读取。方法读取。例:例:第一次发送:第一次发送:abcdefgabcdefg第二次发送:第二次发送:12345671234567接收方接收的数据:接收方接收的数据:第一次接收:第一次接收:abcdefg1234567abcdefg1234567极端情况下:极端情况下:第一次接收:第一次接收:abcdabcd第二次接收:第二次接收:
13、efg12efg12第三次接收:第三次接收:345673456725TCP协议的无消息边界问题协议的无消息边界问题 26 解决方法:解决方法:发送固定长度的消息发送固定长度的消息 将消息长度与消息一起发送将消息长度与消息一起发送,比如字符串,比如字符串消息前用消息前用2个字节表明本次消息长度。个字节表明本次消息长度。使用特殊标记分隔消息使用特殊标记分隔消息(要求消息本身不(要求消息本身不 包括特殊标记符)包括特殊标记符)。2710.4 简单聊天程序简单聊天程序10.4.1 服务器端编程服务器端编程281“开始监听开始监听”的的Click事件代码事件代码private void buttonSt
14、art_Click(object sender,System.EventArgs e)this.buttonStart.Enabled=false;IPAddress ip=IPAddress.Parse(this.textBoxIp.Text);IPEndPoint server=new IPEndPoint(ip,Int32.Parse(this.textBoxPort.Text);socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);29socket.Bind(server);so
15、cket.Listen(10);clientSocket=socket.Accept();this.listBoxState.Items.Add(与客户与客户 +clientSocket.RemoteEndPoint.ToString()+建立连接建立连接);thread=new Thread(new ThreadStart(AcceptMessage);thread.Start();302.接收消息方法接收消息方法private void AcceptMessage()while(true)try NetworkStream netStream=new NetworkStream(clien
16、tSocket);byte datasize=new byte4;netStream.Read(datasize,0,4);31int size=System.BitConverter.ToInt32(datasize,0);Byte message=new bytesize;int dataleft=size;int start=0;while(dataleft0)int recv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;32this.richTextBoxAccept.Rtf=System.Text
17、.Encoding.Unicode.GetString(message);Catch this.listBoxState.Items.Add(与客户断开连接与客户断开连接);break;333 添加添加“发送信息发送信息”的的Click事件代码。事件代码。private void buttonSend_Click(object sender,System.EventArgs e)string str=this.richTextBoxSend.Rtf;int i=str.Length;if(i=0)return;else i*=2;/为什么为什么i2 byte datasize=new byte
18、4;datasize=System.BitConverter.GetBytes(i);byte sendbytes=System.Text.Encoding.Unicode.GetBytes(str);34try NetworkStream netStream=new NetworkStream(clientSocket);netStream.Write(datasize,0,4);netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();this.richTextBoxSend.Rtf=;Catch MessageBox.
19、Show(无法发送无法发送!);354“停止监听停止监听”的的Click事件代码。事件代码。private void buttonStop_Click(object sender,System.EventArgs e)this.buttonStart.Enabled=true;try socket.Close();if(clientSocket.Connected)clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();thread.Abort();catch MessageBox.Show(监听尚未开始,关闭无效监听尚未
20、开始,关闭无效!);365 窗口关闭前触发的事件代码。窗口关闭前触发的事件代码。private void Form1_Closing(object sender,System.ComponentModel.CancelEventArgs e)socket.Close();if(clientSocket.Connected)clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();thread.Abort();3710.4.2 客户端编程客户端编程381.“请求连接请求连接”的的Click事件代码。事件代码。private v
21、oid buttonRequest_Click(object sender,System.EventArgs e)IPAddress ip=IPAddress.Parse(this.textBoxIP.Text);IPEndPoint server=new IPEndPoint(ip,Int32.Parse(this.textBoxPort.Text);socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);39trysocket.Connect(server);catch Message
22、Box.Show(与服务器连接失败与服务器连接失败);return;this.buttonRequest.Enabled=false;this.listBoxState.Items.Add(与服务器连接成功与服务器连接成功);Thread thread=new Thread(new ThreadStart (AcceptMessage);thread.Start();402.接收消息函数接收消息函数private void AcceptMessage()while(true)try NetworkStream netStream=new NetworkStream(socket);byte d
23、atasize=new byte4;netStream.Read(datasize,0,4);int size=System.BitConverter.ToInt32 (datasize,0);Byte message=new bytesize;int dataleft=size;int start=0;41while(dataleft0)int recv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;this.richTextBoxReceive.Rtf=System.Text.Encoding.Unico
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第10章 TCP协议开发 10 TCP 协议 开发