已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章TCP协议开发,10.1相关概念10.2定义与获取主机信息10.3同步套接字编程10.4同步套接字开发举例简单聊天程序10.5使用TcpClient和TcpListener简化TCP编程10.6异步套接字编程10.7异步套接字开发举例,10.1基本概念,基本概念(相关概念)同步发送方将数据包发送到网络上以后,不等接收方响应,就接着发送下一个数据包。异步发送方将数据包发送到网络上以后,等接收方做出响应后,才接着发送下一个数据包。,-同步套接字在通过Socket进行连接、接收、发送操作时,客户机或服务器会暂停当前工作,处于等待状态,即一直等到有数据时才继续执行下面的语句。一般在阻塞方式下使用这种方式。可见,同步套接字适用于网络传输量不太大的情况。当网络传输量很大时,长时间的等待可能会让用户无法忍受。-异步套接字在通过Socket进行连接、接收、发送操作时,客户机或服务器不会暂停当前工作,而是利用callback机制进行连接、接收和发送处理。异步套接字适用于需要在网络上进行大量数据传输的应用程序,比如有几万客户同时传输的情况。,10.2定义与获取主机信息,定义主机对象IPEndPoint类IPAddress类获取主机信息Dns类中常用方法Dns.GetHostName()Dns.GetHostByName(stringhostname)Dns.GetHostByAddress(address)Dns.Resolve(),1.定义主机对象IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息。通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。常用的方法原型:publicIPEndPoint(IPAddressaddress,intport);说明:address:IP地址port:端口号功能:初始化IPEndPoint类的实例。用法举例:IPAddressmyServerIP=newIPAddress.Parse(“”);IPEndPointmyServer=newIPEndPoint(myServerIP,13);,2.主机解析程序实例Dns.Resolve()的使用usingSystem;usingSystem.Net;publicclassTestFileStreamstaticvoidMain()Console.Write(输入主机名或者IP地址:);stringstr=Console.ReadLine();IPHostEntryhost=Dns.Resolve(str);for(inti=0;i0)intrecv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;his.richTextBoxAccept.Rtf=System.Text.Encoding.Unicode.GetString(message);catchthis.listBoxState.Items.Add(与客户断开连接);break;,“停止监听”的Click事件代码。privatevoidbuttonStop_Click(objectsender,System.EventArgse)this.buttonStart.Enabled=true;trysocket.Shutdown(SocketShutdown.Both);socket.Close();if(clientSocket.Connected)clientSocket.Close();thread.Abort();catchMessageBox.Show(监听尚未开始,关闭无效!);,添加“发送信息”的Click事件代码。privatevoidbuttonSend_Click(objectsender,System.EventArgse)stringstr=this.richTextBoxSend.Rtf;inti=str.Length;if(i=0)return;else/因为str为Unicode编码,每个字符占2字节,所以实际字节数应*2i*=2;bytedatasize=newbyte4;datasize=System.BitConverter.GetBytes(i);bytesendbytes=System.Text.Encoding.Unicode.GetBytes(str);tryNetworkStreamnetStream=newNetworkStream(clientSocket);netStream.Write(datasize,0,4);netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();this.richTextBoxSend.Rtf=;catchMessageBox.Show(无法发送!);,窗口关闭前触发的事件代码。privatevoidForm1_Closing(objectsender,System.ComponentModel.CancelEventArgse)trysocket.Shutdown(SocketShutdown.Both);socket.Close();if(clientSocket.Connected)clientSocket.Close();thread.Abort();catch,客户端编程创建windows应用程序项目TestSyncClient,设计画面如图所示:控件属性参见表10-2,“请求连接”的Click事件代码。privatevoidbuttonRequest_Click(objectsender,System.EventArgse)IPAddressip=IPAddress.Parse(this.textBoxIP.Text);IPEndPointserver=newIPEndPoint(ip,Int32.Parse(this.textBoxPort.Text);socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);trysocket.Connect(server);catchMessageBox.Show(与服务器连接失败!);return;this.buttonRequest.Enabled=false;this.listBoxState.Items.Add(与服务器连接成功);Threadthread=newThread(newThreadStart(AcceptMessage);thread.Start();,privatevoidAcceptMessage()while(true)tryNetworkStreamnetStream=newNetworkStream(socket);bytedatasize=newbyte4;netStream.Read(datasize,0,4);intsize=System.BitConverter.ToInt32(datasize,0);Bytemessage=newbytesize;intdataleft=size;intstart=0;while(dataleft0)intrecv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv;this.richTextBoxReceive.Rtf=System.Text.Encoding.Unicode.GetString(message);catchthis.listBoxState.Items.Add(“服务器断开连接。”);break;,“关闭连接”的Click事件代码。privatevoidbuttonClose_Click(objectsender,System.EventArgse)trysocket.Shutdown(SocketShutdown.Both);socket.Close();this.listBoxState.Items.Add(与主机断开连接);thread.Abort();catchMessageBox.Show(尚未与主机连接,断开无效!);this.buttonRequest.Enabled=true;,关闭窗口前触发的事件代码。privatevoidForm1_Closing(objectsender,System.ComponentModel.CancelEventArgse)trysocket.Shutdown(SocketShutdown.Both);socket.Close();catch,“发送信息”的Click事件代码。privatevoidbuttonSend_Click(objectsender,System.EventArgse)stringstr=this.richTextBoxSend.Rtf;inti=str.Length;if(i=0)return;elsei*=2;/因为str为Unicode编码,每个字符占2字节,所以实际字节数应*2bytedatasize=newbyte4;datasize=System.BitConverter.GetBytes(i);bytesendbytes=System.Text.Encoding.Unicode.GetBytes(str);tryNetworkStreamnetStream=newNetworkStream(socket);netStream.Write(datasize,0,4);netStream.Write(sendbytes,0,sendbytes.Length);netStream.Flush();this.richTextBoxSend.Text=;catchMessageBox.Show(无法发送!);,10.5使用TcpClient和TcpListener类简化TCP编程,TcpClient类TcpClient()TcpClient(IPEndPointiep)TcpClient(stringhost,intport)常用属性和方法(表103、表104)TcpListener类TcpListener(intport)TcpListener(IPAddressaddress,intport)TcpListener(IPEndPointiep)常用方法(表105),10.6异步套接字编程,异步套接字及其常用方法(表106)BeginAccept()方法和EndAccept()方法异步Socket中使用BeginAccept方法开始接收新的连接请求,其方法原型为:publicIAsyncResultBeginAccept(AsyncCallbackcallback,Objectstate)其中:参数1为AsyncCallback类型的委托,委托提供的方法用于接收连接并且调用EndAccept();参数2为Object类型,用于将状态信息传递给委托提供的方法。Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointiep=newIPEndPoint(IPAddress.Any,6788);socket.Bind(iep);socket.Listen(10);socket.BeginAccept(newAsyncCallback(ClientConnected),socket);,BeginAccept()方法和EndAccept()方法EndAccept()的格式为:SocketEndAccept(IAsyncResultar)IAsyncResult对象将IAsyncResult值从关联的BeginAccept()方法传递到EndAccept()方法。ClientConnected()方法的使用形式为:privatevoidClientConnected(IAsyncResultar)Socketserver=(Socket)ar.AsyncState;Socketclient=server.EndAccept(ar);参数中的IAsyncResult类型表示异步操作的状态,ar是socket.BeginAccept()得到的返回值。,BeginAccept()方法和EndAccept()方法在ClientConnected()方法中,首先根据BeginAccept()方法传递的原始Socket对象得到一个新的Socket对象,然后根据这个对象创建客户端Socket对象,一旦创建了客户端Socket对象,就可以使用同步或者异步的方法与客户端进行通信。使用BeginAccept方法时,类型为Object的状态参数可以用一个类来实现,例如:publicclassStateObjectpublicSocketworkSocket=null;publicconstintbufferSize=1024;publicbytebuffer=newbytebufferSize;publicStringBuildersb=newStringBuilder();然后通过创建该类的实例提供连接请求的状态。,BeginConnect()方法和EndConnect()方法异步套接字编程中,客户端使用BeginConnect()方法连接到远程主机,其格式为:IAsyncResultBeginConnect(EndPointep,AsyncCallBackcallback,Objectstate)其中第一个参数是远程主机的EndPoint对象,第二个参数用于和远程主机连接成功后执行委托调用的方法,最后一个参数是状态对象,用于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灭火演练记录模板
- 专升本职业规划教材
- 预应力混凝土结构张拉应力控制
- (正式版)T∕CAME 80-2025 骨科机器人远程手术环境配置规范
- 2026年西安文理学院招聘专职辅导员(6人)考试模拟试题及答案解析
- 2026云南云勤餐饮管理有限责任公司招聘笔试模拟试题及答案解析
- 危险预知训练KYT记录
- 2026年及未来5年市场数据中国邻硝基苯甲醛行业市场竞争格局及发展趋势预测报告
- 酒店会计统一制度
- 2026江苏苏州大学附属第二医院(核工业总医院)招聘笔试参考题库及答案解析
- aws 安全考试认证
- 斗提机培训课件
- 数字化运营与管理 课件 第4章 数字化运营组织管理
- 2023-2025北京初三二模语文汇编:记叙文阅读
- T/CUPTA 011-2022共享电单车安全技术要求
- 建筑节能检测技术课件
- 2025年中盐安徽红四方肥业股份有限公司招聘笔试参考题库附带答案详解
- GB/T 17642-2025土工合成材料非织造布复合土工膜
- 《住院患者身体约束的护理》团体标准解读课件
- 《肺癌脑转移》课件
- Unit5SectionB1a1d课件人教版(2024)七年级英语下册
评论
0/150
提交评论