目录 1. TCP简介 1.1. TCP工作过程 1.2. TCP特点 2. TCP相关类 2.1. TcpListnr类 2.2. TcpClint类 2.3. NtworkStram类 3. TCP网络程序开发 3.1. TCP服务器编程实例 3.2. TCP客户端编程实例 Sockt类实现了Brkly套接字接口,为网络通信提供了一套丰富的方法和属性。基于Sockt类进行网络程序的开发,需要对协议细节有较深的了解,编程过程比较繁琐,容易出现误用和错误。在不需要最高性能的情况下,为了提高编程效率,.NtFramwork提供了更简单、更友好的接口来实现Sockt通信,即TcpListnr、TcpClint、UdpClint类,它们大大简化了Sockt通信编程。 1. TCP简介 1.1. TCP工作过程 TCP的工作过程就像日常生活中的打 (1)建立连接; (2)传输数据; (3)终止连接。 1.2. TCP协议特点 (1)面向连接。 (2)端到端通信。每个TCP连接只能有两个端点,只能一对一通信,不能一点对多点直接通信。 (3)高可靠性。 (4)全双工方式传输。 (5)数据以字节流的方式传输。 (6)传输的数据无消息边界。 举例:TCP发方分3次(3个TCP数据包)发送的“ab”、“cd”、“f”,在收方可能接收为1次“abcdf”,也可能接收为2次“abcd”、“f”。数据包“粘连”在一起了。 发送端,为提高通信效率,减少确认消息次数,使用了优化方法(Nagl算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出实际发送了多少次数据。当然,如果接收端负荷很重,也会在接收缓冲里“粘包”。 收方并不根据TCP数据发送的次数分次接收,而是把TCP数据当做“流”(流是粘连在一起,难分彼此,无头无尾),依次填充接收缓冲区,收方不能感受到数据发送的次数,即不能确定应用层消息是否接收完毕或完整。在编程中,一次Snd()方法和一次Rciv()方法并不是严格配对工作的,即使收发缓冲区设置相同,也可能因为网络带宽问题造成接收内容和次数的不同。在实际应用中经常需要确定消息边界,解决办法有: ①发送固定长度的消息。这种方适用于信息长度固定的场合。 ②将消息长度与消息一起发送。这种方法增加了数据传送信息量,也增加了编程工作量。举例:每次发送的字符串信息前面用2个字节表明本次信息的长度,接收方先从这两个字节得到信息长度。然后根据长度值循环接收发送方发送的字符串 ③使用特殊标记分隔消息。 保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息.也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包.而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包. 2. TCP相关类 2.1. TcpListnr类 TcpListnr类:从TCP网络客户端侦听连接。用于在同步阻止模式下侦听和接受传入连接请求。 主要方法: 表1-1TcpListnr类的主要方法 方法名称 返回值类型 说明 TcpListnr( IPEndPoint) TcpListnr 使用指定的本地终结点初始化TcpListnr类的新实例。 AccptTcpClint TcpClint 接受挂起的连接请求 Start() void 开始侦听传入的连接请求 Stop() void 关闭侦听器 详见MSDN文档。 2.2. TcpClint类 TcpClint类:为TCP网络服务提供客户端连接。用于在同步阻止模式下通过网络来连接、发送和接收流数据。 主要方法: 表1-2TcpClint类的主要方法 方法名称 返回值类型 说明 TcpClint( IPEndPoint) TcpClint 初始化TcpClint类的新实例,并将其绑定到指定的本地终结点。 Connct( IPEndPoint) void 使用指定的远程网络终结点,将客户端连接到远程TCP主机。 GtStram() NtworkStram 返回用于发送和接收数据的NtworkStram。 Clos() void 释放此TcpClint实例,并请求关闭基础TCP连接。 详见MSDN文档。 2.3. NtworkStram类 NtworkStram类:提供用于网络访问的基础数据流。NtworkStram类提供在阻止模式下通过流式套接字发送和接收数据的方法。 可以对NtworkStram类的实例同时执行读和写操作而无需同步。只要写操作有一个唯一线程,读操作有一个唯一线程,则读和写线程之间不会存在交叉引用,因而无需同步。 主要方法: 表1-3NtworkStram类的主要方法 方法名称 返回值类型 说明 NtworkStram( Sockt) NtworkStram 为指定的Sockt创建NtworkStram类的新实例。 Rad( byt[]buffr, intoffst, intsiz) int 从NtworkStram读取数据。 Writ( byt[]buffr, intoffst, intsiz) void 将数据写入NtworkStram。 Clos() void 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 详见MSDN文档。 3. TCP网络程序开发 3.1. TCP服务器编程实例 usingSystm; usingSystm.Txt; usingSystm.Nt.Sockts; usingSystm.Nt; namspacMyTcpListnr { classProgram { staticvoidMain(string[]args) { Consol.WritLin("****TcpListnr(TCP类应用示例)****"); //1.创建TCP监听器,设置要监听的IP端点(IP+端口) varlocalAddrss=IPAddrss.Pars(".0.0.1"); intport=; varlistnr=nwTcpListnr(localAddrss,port); //2.启动监听 listnr.Start(); Consol.WritLin("开始监听.."); //3.接受连接,并与客户端进行数据通信 varrcivBuffr=nwbyt[]; varrcivMsg=""; whil(tru) { //(1)等待并接受客户连接 Consol.WritLin(); Consol.WritLin("等待客户连接.."); varclint=listnr.AccptTcpClint(); varclintEndPoint=clint.Clint.RmotEndPoint; Consol.WritLin("接受客户连接-"+clintEndPoint.ToString()); //(2)基于网络流与客户进行数据通信 varstram=clint.GtStram(); //----接收数据 varradLngth=stram.Rad(rcivBuffr,0,rcivBuffr.Lngth); rcivMsg=Encoding.UTF8.GtString(rcivBuffr,0,radLngth); Consol.WritLin("收到数据:"+rcivMsg); //----发送数据 varsndBuffr=Encoding.UTF8.GtByts("Ircivddata:"+rcivMsg); stram.Writ(sndBuffr,0,sndBuffr.Lngth); //(3)关闭连接,释放资源 clint.Clos(); Consol.WritLin("关闭客户连接-"+clintEndPoint.ToString()); } //listnr.Stop(); } } } 3.2. TCP客户端编程实例 usingSystm; usingSystm.Txt; usingSystm.Nt.Sockts; namspacMyTcpClint { classProgram { staticvoidMain(string[]args) { //1.设定要连接的服务器IP和端口号 varsrvrIP=".0.0.1"; intsrvrPort=; //2.创建TcpClint对象 varclint=nwTcpClint(); //3.向服务器端点发起连接请求 try { clint.Connct(srvrIP,srvrPort); varlocalEndPoint=clint.Clint.LocalEndPoint; Consol.WritLin("连接服务器成功!(本机端点:"+localEndPoint.ToString()+")"); } catch { Consol.WritLin("连接服务器失败!"); gotoxit; } //4.基于网络流与与服务器进行数据通信 varstram=clint.GtStram(); //----发送数据 Consol.WritLin("请输入要发送的数据:"); varsndMsg=Consol.RadLin(); varsndBuffr=Encoding.UTF8.GtByts(sndMsg); stram.Writ(sndBuffr,0,sndBuffr.Lngth); //----接收数据 varrcivBuffr=nwbyt[]; varradLngth=stram.Rad(rcivBuffr,0,rcivBuffr.Lngth); varrcivMsg=Encoding.UTF8.GtString(rcivBuffr,0,radLngth); Consol.WritLin("收到数据:"+rcivMsg); xit: //5.关闭连接,释放资源 clint.Clos(); Consol.WritLin("请按下[Entr]键结束程序.."); Consol.RadLin(); } } } 赞赏 长按浜戝崡鐧界櫆椋庢潈濞佸尰闄?鍖椾含閮芥湁鍝簺鐧界櫆椋庡尰闄?
|