第4章TCP编程.ppt

上传人:本田雅阁 文档编号:2498511 上传时间:2019-04-04 格式:PPT 页数:43 大小:1.07MB
返回 下载 相关 举报
第4章TCP编程.ppt_第1页
第1页 / 共43页
第4章TCP编程.ppt_第2页
第2页 / 共43页
第4章TCP编程.ppt_第3页
第3页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第4章TCP编程.ppt》由会员分享,可在线阅读,更多相关《第4章TCP编程.ppt(43页珍藏版)》请在三一文库上搜索。

1、4.1 TCP编程基础 4.2 TCP同步编程 4.3 TCP异步编程,第四章 TCP编程,4.1.1 Socket编程的复杂,4.1 TCP编程基础,用Socket 编程实现数据收发?需要注意: 大数据量时的收发控制; 网络的传输质量; ;,4.1 TCP编程基础,4.1.1 Socket编程的复杂性-发送、接收数据,图1 Send()和Recv()都是对本地套接字的操作,4.1 TCP编程基础,4.1.1 Socket编程的复杂性-传送数据,图2 同步套接字的Send()函数的执行流程,4.1.2 TCP的特点,TCP(Transmission Control Protocol)提供一种面

2、向连接的、可靠的数据传输服务,是TCP/IP协议族中最重要的协议之一,其主要特点: 向应用进程提供面向连接的服务; 提供全双工数据传输服务; 提供面向字节流的服务;,4.1 TCP编程基础,4.1 TCP编程基础,4.1.3 TCP编程相关类,.NET提供面向TCP编程的相关类,比位于底层的Socket类提供了更高层次的抽象,它们封装TCP套接字的创建,不需要处理连接的细节。 (1) TcpClient类; (2) TcpListener类;,4.1.4 TcpClient类-1,4.1 TCP编程基础,主要功能:为TCP网络服务提供客户端连接,它构建于Socket类之上,提供更高级别的TCP

3、服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。 另外,通过与NetworkStream对象的关联,使用户可以通过流操作模式进行数据的发送和接收。,命名空间:System.Net.Sockets.TcpClient,4.1.4 TcpClient类-2,主要属性列表,4.1 TCP编程基础,4.1.4 TcpClient类-3,常用方法列表,4.1 TCP编程基础,4.1.4 TcpClient类-4,1) TcpClient() /使用默认IP地址,自动选择端口号 2) TcpClient(AddressFamily) /指定地址族

4、 3) TcpClient(IPEndPoint) /指定本地IPEndPoint 4) TcpClient(String,Int32) /指定远程主机名,端口号,创建实例-构造函数的4种形式:,说明:如果没有指定远程主机名和端口号,它只是用来实例化TcpClient,同时实现与本地IP地址和Port端口的绑定。,4.1 TCP编程基础,4.1.4 TcpClient类-5,1) Connect(IPEndPoint) /指定远程网络终结点 2) Connect(IPAddress) /指定IP地址 3) Connect(IPAddress,Int32) /指定远程IP地址,端口号 4) Co

5、nnect(String,Int32) /指定远程主机名,端口号,建立连接-Connect方法的4种形式:,4.1 TCP编程基础,4.1.4 TcpClient类-6,4.1 TCP编程基础,(1)TcpClient tcpClient=new TcpClient(); (2)TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork); (3)IPAddress address = Dns.GetHostAddresses(Dns.GetHostName(); IPEndPoint iep = new IPEndPoint(

6、address0, 51888); TcpClient tcpClient = new TcpClient(iep); tcpClient.Connect(“”, 51888); /1,2,3共用 (4)TcpClient tcpClient=new TcpClient(“”, 51888);,代码演示-创建与连接,4.1.4 TcpClient类-7,利用NetworkStream发送和接收数据,StreamReader rs=new StreamReader(tcpclient.GetStream(); NetworkStream ws=tcpclient.GetStream(); ret

7、urnData=rs.ReadLine(); ws.Write(data,0,data.Length),关闭TCP套接字,client.Close();,4.1 TCP编程基础,4.1.5 TcpListener类-1,4.1 TCP编程基础,主要功能:为服务器端提供TCP网络服务,它构建于Socket类之上,用于编写服务器端应用程序。,命名空间:System.Net.Sockets.TcpListener,主要属性列表,4.1.5 TcpListener类-2,4.1 TCP编程基础,常用方法列表,4.1.5 TcpListener类-3,4.1 TCP编程基础,4.1.5 TcpListe

8、ner类-4,4.1 TCP编程基础,1) TcpListener(Port) /指定端口 2) TcpListener(IPEndPoint) /指定本机终结点 3) TcpListener(IPAddress,Port) /指定IP地址、端口,创建实例-构造函数的3种形式:,4.1.5 TcpListener类-5,4.1 TCP编程基础,TcpListener listener=new TcpListener(); listener.Start(); TcpClient tcpClient=listener.AcceptTcpClient(); 。 listener.Stop();,4.

9、2 TCP同步编程,同步:发送、接收、监听均采用阻塞方式工作。,4.2 TCP同步编程,1,TCP消息无边界问题;,2,消息的NetworkStream收发操作;,3,服务器循环监听问题;,需要明确的几个问题:,4,数据收发的几种方法的说明;,4.2 TCP同步编程,原因:TCP是字节流形式的、无消息边界的协议,由于受网络传输中不确定因素的影响,因此不能保证单个Send方法发送的数据被单个Receive方法接收。,4.2.1 TCP的消息边界问题,A Send To B: 消息一:12345;消息二 abcde;,B Rece From A :,第一种可能 : 消息一:12345;消息二:ab

10、cde;,第二种可能 : 消息一:12345abcde;,第三种可能 : 消息一:123;消息二:45abcde;,第N 种可能 : 。,4.2.1 TCP的消息边界问题-解决方法,4.2 TCP同步编程,1,发送固定长度的消息;,2,将消息长度与消息一起发送;,3,使用特殊标记分隔消息;,4.2.2 消息的NetworkStream收发操作,4.2 TCP同步编程,NetworkStream netStream=tcpClient.GetStream() /获取网络流 StreamReader sr=new StreamReader(netStream,Encoding.UTF8); Str

11、eamWriter sw=new StreamWriter(netStream,Encoding.UTF8); /发送数据 string str=“发送的数据”; sw.WriteLine(str); /接收数据 string receString=sr.ReadLine();,4.2 TCP同步编程,4.2.3 服务器循环监听问题(1),/启动服务器监听,启动监听客户线程 myListener=new TcpListener(localAddress,port); myListener.Start(); Thread mainThread=new Thread(new ThreadStart

12、(ListenClient); mainThread.Start(); ,4.2.3 服务器循环监听问题(2),4.2 TCP同步编程,/响应客户线程方法 private void ListenClient() While (true) TcpClient client=null; try client=myListener.AcceptTcpClient(); catch break; /停止监听时产生异常退出 Thread responseClientThread=new Thread (new ThreadStart(ResponseClient); responseClientThre

13、ad.Start(); ,4.2.3 服务器循环监听问题(3),/与客户进行通信的方法 private void ResponseClient() ,/停止监听 关闭客户线程; myListener.Stop();,4.2 TCP同步编程,4.2 TCP同步编程,1,Socket的Send与Receive,成功写入发送缓冲区/读取接收缓冲区,大数据量时要多次进行读写;,4.2.4 几种数据收发方法的说明,2,NetworkStream的Read与Write,能保证数据写入成功;不能直接操作字符串,需进行字节数组转换(定义应用程序发送/读取缓冲区);,3,StreamReader与StreamW

14、riter,能直接操作字符串,支持ReadLine/WriteLine;,4,BinaryReader与BinaryWriter,能直接操作字符串;会自动附加长度前缀,支持按类型读写,如ReadInt/WriteInt;可用于操作图像、文件等二进制流文件。,4.3 TCP异步编程,为什么要引入异步编程?,何谓异步?,4.3 TCP异步编程,案例一:我们(主线程)安排A(子线程)负责处理客人来访时办理登记手续。在同步工作方式下,如果没有人来访,A 只能在房间等待,不能做其它工作。 。 没人也不能脱身,A很郁闷。,案例二:没人来访,A不在房间一直等待。A告诉总控室(Windows操作系统) :一旦

15、有人来了你Call我,我给你留下一个手机号F(函数名称)。有人来了,总控室人员(委托)打电话给A(通过委托自动运行方法F),A接到通知后过来办理(在方法F中完成所需工作)。 。 没人时,A很悠闲潇洒。,4.3 TCP异步编程,支持基于事件的C#异步编程模式的类会有若干个 MethodNameAsync 方法表示开始异步操作,并有对应的 MethodNameCompleted 事件。类里面还可能会有 CancelAsync 或 MethodNameAsyncCancel 方法用于取消异步操作,并可以有 ProgressChanged 或 MethodNameProgressChanged 事件来

16、跟踪执行进度。 如:BackGroundWorker、PictureBox控件 RunWorkerAsync 方法 -引发 DoWork 事件 -ReportProgress方法 -引发 ProgressChanged事件,4.3.1 基于事件的异步设计模式,4.3 TCP异步编程,4.3.2 基于IAsync的异步设计模式(1),IAsyncResult 通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用。 Begin 方法包含同步方法签名中的任何参数,此外包含另两个参数:AsyncCallback 委托和用户定义的状态

17、对象。委托用来调用回调方法,状态对象是用来向回调方法传递状态信息。该方法返回一个实现 IAsyncResult 接口的对象。 End 方法结束异步操作并返回结果,因此包含同步方法签名中的 ref 和 out 参数,返回值类型也与同步方法相同。该方法还包括一个 IAsyncResult 参数,用于获取异步操作是否完成的信息,当然在使用时就必须传入对应的 Begin 方法返回的对象实例。,4.3.2 基于IAsync的异步设计模式(2),4.3 TCP异步编程,IAsyncResult 接口 public interface IAsyncResult object AsyncState get;

18、WaitHandle AsyncWaitHandle get; bool CompletedSynchronously get; bool IsCompleted get; ,开始异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。也可使用 IAsyncResult 的 AsyncWaitHandle 属性,调用其中的WaitOne等方法来阻塞线程。这两种方法的区别不大,只是前者必须一直等待而后者可以设置等待超时。 如果不阻止应用程序,可以通过轮循 IAsyncResult 的 IsCompleted 状态来判断操作是否完成,或使用 Asyn

19、cCallback 委托来结束异步操作。AsyncCallback 委托包含一个 IAsyncResult 的签名,回调方法内部再调用 End 方法来获取操作执行结果。,4.3.2 基于IAsync的异步设计模式(3),4.3 TCP异步编程,4.3 TCP异步编程,AsyncCallback委托 用于引用异步操作完成时调用的回调方法。在异步操作方式下,由于程序可以在启动异步操作后继续执行其他代码,因此必须有一种机制,以保证该异步操作完成时能及时通知调用者。这种机制可以通过AsyncCallback 委托实现。,4.3.2 基于IAsync的异步设计模式(4),回调方法是在程序中事先定义的,在

20、回调方法中,通过End方法获取Begin方法的返回值和所有输入/输出参数,从而达到异步操作方式下完成参数传递的目的。,异步操作中,程序调用Begin方法时,系统会自动在线程池中创建对应的线程进行异步操作,从而保证调用方和被调用方同时执行,当线程池中的Begin方法执行完毕时,会自动通过AsyncCallback委托调用在Begin方法的参数中指定的回调方法。,4.3 TCP异步编程,4.3.2 基于IAsync的异步设计模式(5),4.3 TCP异步编程,BeginAcceptTcpClient与EndAcceptTcpClient方法,System.Net.Sockets.TcpListen

21、er类。,AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback); tcpListener.BeginAcceptTcpClient(callback, tcpListener); ,void AcceptTcpClientCallback( IAsyncResult ar) TcpListener myListener = (TcpListener)ar.AsyncState; TcpClient client = myListener.EndAcceptTcpClient(ar); ,4.3 TCP异步编程,B

22、eginConnect 与EndConnect 方法,System.Net.Sockets.TcpClient类。,AsyncCallback requestCallback = new AsyncCallback(RequestCallback); tcpClient.BeginConnect(IP,port,requestCallback,tcpClient); ,void RequestCallback( IAsyncResult ar) tcpClient = (TcpClient)ar.AsyncState; tcpClient.EndConnect(ar); ,4.3 TCP异步编

23、程,发送数据BeginWrite方法与EndWrite方法,System.Net.Sockets.NetworkStream类。,NetworkStream stream=tcpClient.GetStream(); byte bData=System.Text.Encoding.Utf8 .GetBytes(str+”rn”); stream.BeginWrite(bData,0,bData.Length,new AsyncCallBack(SendCallback),stream); stream.Flush(); private void SendCallback(IAsyncResul

24、t ar) stream.EndWrite(); ,4.3 TCP异步编程,接收数据BeginRead方法与EndRead方法,System.Net.Sockets.NetworkStream类。,NetworkStream stream=tcpClient.GetStream(); ReadObject rObject=new ReadObject(stream,client.ReceiveBufferSize); stream.BeginRead(rObject.bytes,0,rObject.bytes.Length,ReadCallback,rObject); private void

25、 ReadCallback(IAsyncResult ar) ReadObject rObject=(ReadObject)ar.AsyncState; int count=rOStream.EndRead(ar); ,4.3 TCP异步编程,4.3 TCP异步编程,C#异步调用的四种常用方法 调用了BeginInvoke 开始异步操作后,可以: 进行某些操作,然后调用 EndInvoke一直阻塞到调用完成。 使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke。 轮询由BeginInvoke返回的IAsyncResult,确定C#异步调用何时完成,然后调用 EndInvoke。 将用于回调方法的委托传递给 BeginInvoke。该方法在C#异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。,4.3 TCP异步编程,异步编程示例,4 TCP编程,本章结束,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1