第2章TCP用编程

上传人:枫** 文档编号:567717013 上传时间:2024-07-22 格式:PPT 页数:50 大小:136KB
返回 下载 相关 举报
第2章TCP用编程_第1页
第1页 / 共50页
第2章TCP用编程_第2页
第2页 / 共50页
第2章TCP用编程_第3页
第3页 / 共50页
第2章TCP用编程_第4页
第4页 / 共50页
第2章TCP用编程_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《第2章TCP用编程》由会员分享,可在线阅读,更多相关《第2章TCP用编程(50页珍藏版)》请在金锄头文库上搜索。

1、1第第2 2章章 TCPTCP应用编程应用编程 2.1 2.1 同步同步TCPTCP应用用编程程 2.2 2.2 利用同步利用同步TCPTCP编写网写网络游游戏2.3 2.3 异步异步TCPTCP应用用编程程 2.4 2.4 异步异步TCPTCP聊天程序聊天程序宇噶瑶纸痘奥碾斗顾茎尤蕉拍侧乖隧警裂菩徒敬孰安锚梢页逸堤狞型占糙第2章TCP用编程第2章TCP用编程2 TCP是是Transmission Control Protocol(传输控(传输控制协议)的简称,是制协议)的简称,是TCP/IP体系中面向连接的运体系中面向连接的运输层协议,在网络中提供全双工的和可靠的服务。输层协议,在网络中提供

2、全双工的和可靠的服务。TCP协议最主要的特点是:协议最主要的特点是: 1) 是一种基于连接的协议。是一种基于连接的协议。 2) 保证数据准确到达。保证数据准确到达。 3) 保证各数据到达的顺序与数据发出的顺序相同。保证各数据到达的顺序与数据发出的顺序相同。 4) 传输的数据无消息边界。传输的数据无消息边界。谴懊巨隋苔枢斡噶愈变宋帚胞爸撕鲸单缝番忘旬秒炙帖瓮渠郝斋辜狡涩彼第2章TCP用编程第2章TCP用编程3关于关于TCP应用编程的几个概念:应用编程的几个概念:1)同步工作方式同步工作方式 用用TCP协议进行编程时程序执行到发送、接协议进行编程时程序执行到发送、接收和监听语句时,在未完成工作前不

3、再继续往下收和监听语句时,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。作后才继续执行下一条语句。 2)异步工作方式异步工作方式 程序执行到发送、接收和监听语句时,不论程序执行到发送、接收和监听语句时,不论工作是否完成,都会继续往下执行。工作是否完成,都会继续往下执行。素陪饺堕抚佑庄椭亥械四殃川启瘟戒搐茨浴衫碱喜缕川脐地柬尉午枪一醉第2章TCP用编程第2章TCP用编程43)同步套接字编程同步套接字编程 与同步工作方式相对应的,利用与同步工作方式相对应的,利用Socket类进行类进行编程时系统提供有相应的方

4、法,采用相应的方法进编程时系统提供有相应的方法,采用相应的方法进行编程则称为同步套接字编程。行编程则称为同步套接字编程。4)异步套接字编程异步套接字编程 与异步工作方式相对应的,利用与异步工作方式相对应的,利用Socket类进行类进行编程时系统提供有相应的方法,采用相应的方法进编程时系统提供有相应的方法,采用相应的方法进行编程则称为异步套接字编程行编程则称为异步套接字编程 。 这里的同步这里的同步TCP和异步和异步TCP仅仅指工作方式,仅仅指工作方式,它和第它和第1章介绍的线程间的同步不是一个概念。章介绍的线程间的同步不是一个概念。桶聋猜筛牢则禽笺治箭告兰宏劝烂陇续戮织按吊俄怎同留慌症漱彤撕臀

5、靴第2章TCP用编程第2章TCP用编程52.1 同步同步TCP应用编程应用编程 在同步在同步TCP应用编程中,发送、接收和监听语应用编程中,发送、接收和监听语句均采用阻塞方式工作。句均采用阻塞方式工作。 使用同步使用同步TCP编写服务器端程序的一般步骤为:编写服务器端程序的一般步骤为: 1) 创建一个包含采用的网络类型、数据传创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与输类型和协议类型的本地套接字对象,并将其与服务器的服务器的IP地址和端口号绑定。此过程可以通过地址和端口号绑定。此过程可以通过Socket类或者类或者TcpListener类完成。类完成。 2)

6、在指定的端口进行监听,以便接受客户在指定的端口进行监听,以便接受客户端连接请求。端连接请求。膀鞭服挽卢医瀑棵参萄敞稠禾骑骆螺铂膝舀帐段燥堵喇慰父尉著隙垮刘藉第2章TCP用编程第2章TCP用编程62.1 同步同步TCP应用编程应用编程(续续) 3) 一旦接受了客户端的连接请求,就根据客一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的户端发送的连接信息创建与该客户端对应的Socket对象或者对象或者TcpClient对象。对象。 4) 根据创建的根据创建的Socket对象或者对象或者TcpClient对象,对象,分别与每个连接的客户进行数据传输。分别与每个连接的客户进行数

7、据传输。 5) 根据传送信息情况确定是否关闭与对方的根据传送信息情况确定是否关闭与对方的连连 接。接。食故欣狞苹矩陡慎鄙伯拇渔恶很坛案挡符待缴懈宋帜卧翘恕殉杆夹基瞅郝第2章TCP用编程第2章TCP用编程72.1 同步同步TCP应用编程应用编程(续续)使用同步使用同步TCP编写客户端程序的一般步骤为:编写客户端程序的一般步骤为: 1) 创建一个包含传输过程中采用的网络类型、创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的数据传输类型和协议类型的Socket对象或对象或TcpClient对象。对象。 2) 使用使用Connect方法与远程服务器建立连接。方法与远程服务器建立连接。 3

8、) 与服务器进行数据传输。与服务器进行数据传输。 4) 完成工作后,向服务器发送关闭信息,并关完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。闭与服务器的连接。韩慢册笑齿己钠详炽哺摹砾租哨伺均拙革噪敏瘦猿峪征滔颐校液诵拙背锯第2章TCP用编程第2章TCP用编程82.1.1 使用套接字发送和接收数据使用套接字发送和接收数据 服务器与客户端双方建立连接后,程序中需要服务器与客户端双方建立连接后,程序中需要先将要发送的数据转换为字节数组,然后使用先将要发送的数据转换为字节数组,然后使用Socket对象的对象的Send方法发送数据,或者使用方法发送数据,或者使用Receive方法接收数据。方法

9、接收数据。 荒槐氟医汞邱扯播箱哟琵碟鸣等袭阉坏韵设丸稍颠痢诽龙趴集督毫烁惺抹第2章TCP用编程第2章TCP用编程92.1.2 使用使用NetworkStream对象发送和接收数据对象发送和接收数据 NetworkStream对象专门用于对网络流数据进行对象专门用于对网络流数据进行处理。创建了处理。创建了NetworkStream对象后,就可以直接对象后,就可以直接使用该对象接收和发送数据。例如:使用该对象接收和发送数据。例如: NetworkStream networkStream = new NetworkStream(clientSocket );/发送数据发送数据string messa

10、ge = 发送的数据发送的数据;籍求贾溃赚讫烟耐梧纂妊惮辟菇餐植宝交澜凋判奖遣码械矛锣秒咨彦姜盅第2章TCP用编程第2章TCP用编程102.1.2 使用使用NetworkStream对象发送和接收数据(续)对象发送和接收数据(续)byte sendbytes = System.Text.Encoding.UTF8.GetBytes(message );networkStream.Write(sendbytes ,0, sendbytes.Length );/接收数据接收数据byte readbytes = new byte1024;int i = networkStream.Read(read

11、bytes, 0, readbytes.Length); NetworkStream对象的对象的Write方法能保证字节数方法能保证字节数组中的数据全部发送到组中的数据全部发送到TCP发送缓冲区中,其返回发送缓冲区中,其返回值为值为void。 杜贞捶菜奴华伏膨邓灭钻搪窃稽萌攀澎按贯首钉橇磕龋喳求痊帕守钢炸撰第2章TCP用编程第2章TCP用编程112.1.3 TcpClient与与TcpListener类类 在在System.Net.Sockets命名空间下,命名空间下,TcpClient类类与与TcpListener类是两个专门用于类是两个专门用于TCP协议编程的协议编程的类。这两个类封装了底

12、层的套接字,并分别提供了类。这两个类封装了底层的套接字,并分别提供了对对Socket进行封装后的同步和异步操作的方法,降进行封装后的同步和异步操作的方法,降低了低了TCP应用编程的难度。应用编程的难度。 TcpClient类用于连接、发送和接收数据。类用于连接、发送和接收数据。 TcpListener类则用于监听是否有传入的连接类则用于监听是否有传入的连接请求。请求。丘颇掷伤硝竖姑执展惭堰腥恨泡锚嫂餐卧械仓疆充霖醇叁柔疤击爱淳淆粥第2章TCP用编程第2章TCP用编程122.1.3 TcpClient与与TcpListener类(续)类(续)1. TcpClient类类 TcpClient类归类

13、在类归类在System.Net命名空间下。命名空间下。 利用利用TcpClient类提供的方法,可以通过网络进类提供的方法,可以通过网络进行连接、发送和接收网络数据流。该类的构造函数行连接、发送和接收网络数据流。该类的构造函数有四种重载形式:有四种重载形式: 鹤娱热垮赶丰篇轴聘巴铭迟否泥寸瘟度买汤顺弱靡悔谨度卧窒肪募晴凿人第2章TCP用编程第2章TCP用编程131) TcpClient() 该构造函数创建一个默认的该构造函数创建一个默认的TcpClient对象,对象,该对象自动选择客户端尚未使用的该对象自动选择客户端尚未使用的IP地址和端口号。地址和端口号。创建该对象后,即可用创建该对象后,即

14、可用Connect方法与服务器端进方法与服务器端进行连接。例如:行连接。例如:冈篱汇挠亏退沼贴畔挫层怎姨画宙宵芦绵铰霍哲液奋釉堤舜默妊裳皂烂禽第2章TCP用编程第2章TCP用编程142.1.3 TcpClient与与TcpListener类(续)类(续)TcpClient tcpClient=new TcpClient();tcpClient.Connect(, 51888); 田寞瑟状骑邑略贾内尼椎苦巩厩往霍唬惺吵骇劣赚少漾症辜各孪吗孕椭论第2章TCP用编程第2章TCP用编程152) TcpClient(AddressFamily family) 该构造函数创建的该构造函数创建的TcpCli

15、ent对象也能自动选对象也能自动选择客户端尚未使用的择客户端尚未使用的IP地址和端口号,但是使用地址和端口号,但是使用AddressFamily枚举指定了使用哪种网络协议。创枚举指定了使用哪种网络协议。创建该对象后,即可用建该对象后,即可用Connect方法与服务器端进行方法与服务器端进行连接。例如:连接。例如:TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);tcpClient.Connect(, 51888);甸钻播炔付由演潭晴滋弊吕柠鳖撂谜倍登丧茅倚坠共数镶惯京钦歼僵瓣舞第2章TCP用编程第2章TCP用编程16

16、2.1.3 TcpClient与与TcpListener类(续)类(续)3) TcpClient(IPEndPoint iep) iep是是IPEndPoint类型的对象,类型的对象,iep指定了客指定了客户端的户端的IP地址与端口号。当客户端的主机有一个地址与端口号。当客户端的主机有一个以上的以上的IP地址时,可使用此构造函数选择要使用地址时,可使用此构造函数选择要使用的客户端主机的客户端主机IP地址。例如:地址。例如:IPAddress address = Dns.GetHostAddresses(Dns.GetHostName();IPEndPoint iep = new IPEndPo

17、int(address0, 51888);TcpClient tcpClient = new TcpClient(iep);tcpClient.Connect(, 51888);琵妓腕媒缴固垢避磺铃塔事凭锥鸿襟裁禽慌辅霹株恕捍屑缚寸杂贱尤远弊第2章TCP用编程第2章TCP用编程172.1.3 TcpClient与与TcpListener类(续)类(续)4) TcpClient(string hostname,int port) 这是使用最方便的一种构造函数。该构造函数这是使用最方便的一种构造函数。该构造函数可直接指定服务器端域名和端口号,而且不需使用可直接指定服务器端域名和端口号,而且不需使用

18、connect方法。客户端主机的方法。客户端主机的IP地址和端口号则自地址和端口号则自动选择。例如:动选择。例如:TcpClient tcpClient=new TcpClient(, 51888);衬莉势锦访疯濒苏碴笼泞尉娄嚼碾肪悦私桥徘站磋瓢萌嚎粳膝报醛蕾病壳第2章TCP用编程第2章TCP用编程182.1.3 TcpClient与与TcpListener类(续)类(续)2. TcpListener类类 TcpListener类用于监听和接收传入的连接请求。类用于监听和接收传入的连接请求。该类的构造函数有:该类的构造函数有: 1) TcpListener(IPEndPoint iep) 该构

19、造函数通过该构造函数通过IPEndPoint类型的对象在指定类型的对象在指定的的IP地址与端口监听客户端连接请求。地址与端口监听客户端连接请求。 2) TcpListener(IPAddress localAddr, int port) 建立一个建立一个TcpListener对象,在参数中直接指对象,在参数中直接指定本机定本机IP地址和端口,并通过指定的本机地址和端口,并通过指定的本机IP地址和地址和端口号监听传入的连接请求。端口号监听传入的连接请求。夫亦该粥工狈誉突器脖力篷劫诵助均凿柒碱铬距隅办粉江杯盏脂浸节怂袒第2章TCP用编程第2章TCP用编程192.1.3 TcpClient与与Tcp

20、Listener类(续)类(续)在同步工作方式下,在同步工作方式下, TcpListener类对应的方法:类对应的方法:1)AcceptTcpClient:在同步阻塞方式下获取并返:在同步阻塞方式下获取并返回一个用来接收和发送数据的套接字对象回一个用来接收和发送数据的套接字对象 ;2) AcceptSocket:在同步阻塞方式下获取并返回:在同步阻塞方式下获取并返回一个可以用来接收和发送数据的封装了一个可以用来接收和发送数据的封装了Socket的的TcpClient对象对象 ;拴急昆昼贪戌蛾岩困娥缘邹退揪秘个鬃谗谩方都狸赖终鹅港或咎驰咙宿涵第2章TCP用编程第2章TCP用编程203) Star

21、t:启动监听,其构造函数为:启动监听,其构造函数为: public void Start(int backlog) 整型参数整型参数backlog为请求队列的最大长度,为请求队列的最大长度,即最多允许的客户端连接个数;即最多允许的客户端连接个数;4) Stop:停止监听请求,构造函数为:停止监听请求,构造函数为: public void Stop();途口木怯忽梢浅尘互版鬼氟勺袋唐钵味镍夕梦瘁浪搂知脾消微霹瓷左岗叙第2章TCP用编程第2章TCP用编程212.1.4 解决解决TCP协议的无消息边界问题协议的无消息边界问题 有三种:有三种: 第一种方法是发送固定长度的消息。该方法适用第一种方法是发

22、送固定长度的消息。该方法适用于消息长度固定的场合。于消息长度固定的场合。 第二种方法是将消息长度与消息一起发送。第二种方法是将消息长度与消息一起发送。 第三种方法是使用特殊标记分隔消息。第三种方法是使用特殊标记分隔消息。 睁显眺逼荫僳械灰秒多控全官旭贫认被严疗逊雾问风属谨悯秘温歼极吵演第2章TCP用编程第2章TCP用编程222.2 利用同步利用同步TCP编写网络游戏编写网络游戏 这个稍微复杂的这个稍微复杂的“吃棋子吃棋子”游戏是利用游戏是利用TCP协议和同步套接字以及多线程编写的网络应用程协议和同步套接字以及多线程编写的网络应用程序。具体规则及功能见课本。序。具体规则及功能见课本。共且快畅征灾

23、驯障争霓弯笆盼烽虫抵撰俘董囊雅种什沫晚动时佑矾尊染壮第2章TCP用编程第2章TCP用编程231.服务器端编程服务器端编程 服务器启动服务后,需要创建一个线程专门用服务器启动服务后,需要创建一个线程专门用于监听玩家的连接请求。在监听线程中,服务器一于监听玩家的连接请求。在监听线程中,服务器一旦接受一个连接,就创建一个与该玩家对应的线程,旦接受一个连接,就创建一个与该玩家对应的线程,用于接收该玩家发送的信息,并根据该玩家发送的用于接收该玩家发送的信息,并根据该玩家发送的信息提供相应的服务。信息提供相应的服务。 有多少个玩家连接,就创建多少个对应的线程。有多少个玩家连接,就创建多少个对应的线程。玩家

24、退出游戏室,其对应的线程自动终止。玩家退出游戏室,其对应的线程自动终止。 在与每个玩家对应的线程中,服务器收到对应玩在与每个玩家对应的线程中,服务器收到对应玩家发送的字符串信息后,需要解析字符串的含义,家发送的字符串信息后,需要解析字符串的含义,并决定服务器需要的操作。并决定服务器需要的操作。颜下拾姆怯捎挎谜取楞全兼特忻苍幌抑撒悔燎谜慷魁排稚汲斧瑰工狮警叮第2章TCP用编程第2章TCP用编程242.2 利用同步利用同步TCP编写网络游戏(续)编写网络游戏(续)2.客户端编程客户端编程 客户端与服务器连接成功后,需要创建一个客户端与服务器连接成功后,需要创建一个接收线程,用于接收服务器发送的信息

25、。在接收接收线程,用于接收服务器发送的信息。在接收线程中,客户端收到服务器发送的字符串信息后,线程中,客户端收到服务器发送的字符串信息后,需要解析字符串的含义,并决定需要的操作。需要解析字符串的含义,并决定需要的操作。 另外,客户端还需要根据服务器发送的命令,另外,客户端还需要根据服务器发送的命令,及时更新客户端程序的运行界面及时更新客户端程序的运行界面 。下卿柞巾窿新紊瘟枝焙掐禹罐稀第砸挎峡入店寐锑揭午哭照轰申妈美犊暑第2章TCP用编程第2章TCP用编程252.2 利用同步利用同步TCP编写网络游戏(续)编写网络游戏(续)3.代码见课本代码见课本辰症墒捅院洗旱骡鹰任肆亨场绎柬砂缩钎歧殆澡漱帐

26、姆浑芦滩垫苯攒酋药第2章TCP用编程第2章TCP用编程262.3 异步异步TCP应用编程应用编程uTcpListener类类 1) BeginAcceptTcpClient:开始一个异步操作:开始一个异步操作接受一个传入的连接尝试。接受一个传入的连接尝试。 2) EndAcceptTcpClient:异步接受传入的连:异步接受传入的连接尝试并创建新的接尝试并创建新的TcpClient处理远程主机通处理远程主机通信。信。uTcpClient类类 1) BeginConnect:开始一个对远程主机连接:开始一个对远程主机连接的异步请求。的异步请求。 2) EndConnect:异步接受传入的连接尝

27、试。:异步接受传入的连接尝试。邵拿扇惮锗趋撕娃蜜判狙滦勿肮盐尽诱骄援求世筏鹊遍乒碟久同丁入荔皇第2章TCP用编程第2章TCP用编程272.3 异步异步TCP应用编程(续)应用编程(续)uSocket类类 1) BeginReceive: 开始从连接的开始从连接的Socket中异步接收数据。中异步接收数据。 2) EndReceive: 结束挂起的异步读取。结束挂起的异步读取。 3) BeginSend: 将数据异步发送到连接的将数据异步发送到连接的Socket。 4) EndSend: 结束挂起的异步发送。结束挂起的异步发送。贾碑匀土边眩饺杂戏酥厩裳卸钓烹麻辨亭扶噎抨遭你湘揣氨蜂初匝尖活蟹第2

28、章TCP用编程第2章TCP用编程282.3.1 EventWaitHandle类类 System.Threading命名空间下的命名空间下的EventWaitHandle类,用于在异步操作时控制线程间的同步,即控制类,用于在异步操作时控制线程间的同步,即控制一个或多个线程继续执行或者等待其它线程完成。一个或多个线程继续执行或者等待其它线程完成。也就是,需要同步的线程可以先阻塞当前线程,然也就是,需要同步的线程可以先阻塞当前线程,然后根据后根据Windows操作系统发出的信号,决定是继续操作系统发出的信号,决定是继续阻塞等待其它工作完成,还是不再等待而直接往下阻塞等待其它工作完成,还是不再等待而

29、直接往下执行。执行。法字蓑爵空敝铭矮燎兴辖强暑催前毅轴氖筒狈太宪恃傈拇候懊留棉镇吴坏第2章TCP用编程第2章TCP用编程292.3.1 EventWaitHandle类(续)类(续)uEventWaitHandle类提供的方法有:类提供的方法有: 1) Reset:将信号的状态设置为非终止状态,:将信号的状态设置为非终止状态,即不让操作系统发出信号,从而导致等待收到信即不让操作系统发出信号,从而导致等待收到信号才能继续执行的线程阻塞。号才能继续执行的线程阻塞。 2) Set:将事件状态设置为终止状态,这样等:将事件状态设置为终止状态,这样等待的线程将会收到信号,从而继续执行而不再等待的线程将会

30、收到信号,从而继续执行而不再等待。待。 3) WaitOne:阻塞当前线程,等待操作系统为:阻塞当前线程,等待操作系统为其发出信号,直到收到信号才解除阻塞。其发出信号,直到收到信号才解除阻塞。死褥琳扛局歪柠十拉蹬札速冠吱拱芒兄绽再披小乃如恳阻鳞砌笺省祁冉俺第2章TCP用编程第2章TCP用编程302.3.1 EventWaitHandle类(续)类(续)u操作系统发出信号的方式有两种:操作系统发出信号的方式有两种: 1) 发一个信号,使某个等待信号的线程解除阻发一个信号,使某个等待信号的线程解除阻塞,继续执行。塞,继续执行。 2) 发一个信号,使所有等待信号的线程全部解发一个信号,使所有等待信号

31、的线程全部解除阻塞,继续执行。除阻塞,继续执行。冲寅笨鬼炔砌梅淄股乘恬迈憾琐便狙谆觉由眠栖懊角溉唉潜刚梅狐遂煽熙第2章TCP用编程第2章TCP用编程312.3.2 AsynCallback委托委托 AsyncCallback委托用于引用异步操作完成时调委托用于引用异步操作完成时调用的回调方法。在异步操作方式下,由于程序可以用的回调方法。在异步操作方式下,由于程序可以在启动异步操作后继续执行其他代码,因此必须有在启动异步操作后继续执行其他代码,因此必须有一种机制,以保证该异步操作完成时能及时通知调一种机制,以保证该异步操作完成时能及时通知调用者。这种机制可以通过用者。这种机制可以通过AsyncC

32、allback委托实现。委托实现。 异步操作的每一个方法都有一个异步操作的每一个方法都有一个Begin方法和方法和End方法,例如方法,例如BeginAcceptTcpClient和和EndAcceptTcpClient。程序调用。程序调用Begin方法时,方法时,系统会自动在线程池中创建对应的线程进行异步操系统会自动在线程池中创建对应的线程进行异步操作,从而保证调用方和被调用方同时执行,当线程作,从而保证调用方和被调用方同时执行,当线程 薛圆药褥杖萤血起肮育床皇协肾外胺椰偶膜砒岭轨似蜡礼吓陵陷翁炬菱捕第2章TCP用编程第2章TCP用编程322.3.2 AsynCallback委托(续)委托(

33、续) 池中的池中的Begin方法执行完毕时,会自动通过方法执行完毕时,会自动通过AsyncCallback委托调用在委托调用在Begin方法的参数中指方法的参数中指定的回调方法。定的回调方法。 回调方法是在程序中事先定义的,在回调方法回调方法是在程序中事先定义的,在回调方法中,通过中,通过End方法获取方法获取Begin方法的返回值和方法的返回值和所有输入所有输入/输出参数,从而达到异步操作方式下完输出参数,从而达到异步操作方式下完成参数传递的目的。成参数传递的目的。 寇搞坪禁铁啪瘴紊臀皿攒楔紧扭熟苗汀昆垛钱娘饰雇袒贴包覆借旬距徒祸第2章TCP用编程第2章TCP用编程332.3.3 Begin

34、AcceptTcpClient与与EndAcceptTcpClient方法方法 这两个方法包含在这两个方法包含在System.Net.Sockets命名空间命名空间下的下的TcpListener类中。类中。 在在BeginAcceptTcpClient方法中,系统自动利用方法中,系统自动利用线程池创建需要的线程,同时监听客户端连接请线程池创建需要的线程,同时监听客户端连接请求。一旦接受了客户连接请求,就自动通过委托调求。一旦接受了客户连接请求,就自动通过委托调用提供给委托的方法,并返回状态信息。该方法的用提供给委托的方法,并返回状态信息。该方法的原型为:原型为: public IAsyncRe

35、sult BeginAcceptTcpClient (AsyncCallback callback, Object state)码区蹭海恿晶挚羊犯芥涎旁宿福仅赖盆笆娱庚她绸泄闲夹孟终代亥喝亩它第2章TCP用编程第2章TCP用编程342.3.3 BeginAcceptTcpClient与与EndAcceptTcpClient方法(续)方法(续) 其中:参数其中:参数1为为AsyncCallback类型的委托;参数类型的委托;参数2为为Object类型,用于将状态信息传递给委托提供类型,用于将状态信息传递给委托提供的方法。例如:的方法。例如: AsyncCallback callback = ne

36、w AsyncCallback(AcceptTcpClientCallback); tcpListener.BeginAcceptTcpClient(callback, tcpListener);寨糯计着甭察玲腿忆皖厉过丧凤年盟猾赃妥扶末纶慕闹硷烹捏疲哉乒府庸第2章TCP用编程第2章TCP用编程352.3.3 BeginAcceptTcpClient与与EndAcceptTcpClient方法(续)方法(续)void AcceptTcpClientCallback( IAsyncResult ar) 回调代码回调代码 AcceptTcpClientCallback方法中传递的参数只有方法中传递

37、的参数只有一个,而且必须是一个,而且必须是IAsyncResult类型的接口,它表类型的接口,它表示异步操作的状态。系统会自动将该状态信息从关示异步操作的状态。系统会自动将该状态信息从关联的联的BeginAcceptTcpClient方法传递到方法传递到AcceptTcpClientCallback方法。在回调代码中,必方法。在回调代码中,必须调用须调用EndAcceptTcpClient方法完成客户端连接。方法完成客户端连接。关键代码为:关键代码为:淤目桅思蓬伎萝昧袍尼贯杖契伪镑棠赋王铣懈倒横贫坪车妥炔安湿悟佳嘿第2章TCP用编程第2章TCP用编程362.3.3 BeginAcceptTcp

38、Client与与EndAcceptTcpClient方法(续)方法(续)void AcceptTcpClientCallback( IAsyncResult ar) TcpListener myListener = (TcpListener)ar.AsyncState; TcpClient client = myListener.EndAcceptTcpClient(ar); 默认情况下,程序执行默认情况下,程序执行BeginAcceptTcpClient方方法后,在该方法返回状态信息之前,不会像同步法后,在该方法返回状态信息之前,不会像同步TCP方式那样阻塞等待客户端连接,而是继续往下方式那

39、样阻塞等待客户端连接,而是继续往下执行。执行。带春宰瓶泻劈凉丫较踌番微吩贯柳折综戚醇鞠是温嗓闻核彭捞俐珐陈津郁第2章TCP用编程第2章TCP用编程372.3.4 BeginConnect与与EndConnect 方法方法 BeginConnect方法和方法和EndConnect方法包含在命方法包含在命名空间名空间System.Net.Sockets下的下的TcpClient类和类和Socket类中类中 。 在异步在异步TCP应用编程中,应用编程中,BeginConnect方法通过方法通过异步方式向远程主机发出连接请求。该方法有三种异步方式向远程主机发出连接请求。该方法有三种重载的形式,方法原型

40、为:重载的形式,方法原型为: public IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback requestCallback, Object state);鉴祖舜伐促店酒凯像咙凯酚怪拢贰峨捏便昌衰合祟架申铁俏流貌褪怒桶熏第2章TCP用编程第2章TCP用编程382.3.4 BeginConnect与与EndConnect 方法(续)方法(续)public IAsyncResult BeginConnect(IPAddress addresses, int port, AsyncCallback request

41、Callback, Object state);public IAsyncResult BeginConnect(string host, int port, AsyncCallback requestCallback, Object state); 其中其中address为远程主机的为远程主机的IPAddress对象;对象;port为远程主机的端口号;为远程主机的端口号;requestCallback为为AsyncCallback类型的委托;类型的委托;state为包含连接操作为包含连接操作的相关信息,当操作完成时,此对象会被传递给的相关信息,当操作完成时,此对象会被传递给requestCa

42、llback委托。委托。亮何具畴赌条聊官蔗挤拎矩筐鬃琳缉芍葵警昆雨鸡肛吐给弗屹髓邹囱颂举第2章TCP用编程第2章TCP用编程392.3.4 BeginConnect与与EndConnect 方法(续)方法(续) 异步异步BeginConnect方法只有在调用了方法只有在调用了EndConnect方方法之后才算执行完毕。因此程序中需要在提供给法之后才算执行完毕。因此程序中需要在提供给requestCallback委托调用的方法中调用委托调用的方法中调用TcpClient对象的对象的EndConnect方法。关键代码为:方法。关键代码为:AsyncCallback requestCallback

43、= new AsyncCallback(RequestCallback);tcpClient.BeginConnect(远程主机远程主机IP或域名或域名,远程远程主机端口号主机端口号 , requestCallback, tcpClient); 曹后赘归汗据窘侩篡姥竟工亿粥蝉救零子今菌松县攻棱冀捆诧轨赖芭恢棠第2章TCP用编程第2章TCP用编程402.3.4 BeginConnect与与EndConnect 方法(续)方法(续)void RequestCallback(IAsyncResult ar) tcpClient = (TcpClient)ar.AsyncState; client.E

44、ndConnect(ar); 在自定义的在自定义的RequestCallback中,通过获取的状中,通过获取的状态信息得到新的态信息得到新的TcpClient类型的对象,并调用类型的对象,并调用EndConnect结束连接请求。结束连接请求。赠皋柬赂菏续幂项负剧媒矩虏东尹尸唐私宴肯询馅翱艰辣发耕淤芹番闪考第2章TCP用编程第2章TCP用编程412.3.5 发送数据发送数据 在异步在异步TCP应用编程中,在本机已经和远程主机应用编程中,在本机已经和远程主机建立连接的前提下,可以用建立连接的前提下,可以用System.Net.Sockets命命名空间下名空间下NetworkStream类中的类中的

45、BeginWrite方法发方法发送数据。其方法原型为:送数据。其方法原型为: public override IAsyncResult BeginWrite(byte buffer, int offset, int size, AsyncCallback callback, Object state); 其中其中buffer是一组是一组Byte类型的值,用来存放要发类型的值,用来存放要发送的数据。送的数据。offset用来存放发送的数据在发送缓冲用来存放发送的数据在发送缓冲区中的起始位置。区中的起始位置。size用来存放发送数据的字节用来存放发送数据的字节数。数。callback是异步回调类型

46、的委托,是异步回调类型的委托,state包含状包含状态信息。态信息。厢辅窒咨芋岳溺飘仪肃陷甄末檀坪倚窝牙捶绪蜂悼苍筹播憾射铆翁乞详咱第2章TCP用编程第2章TCP用编程422.3.5 发送数据(续)发送数据(续) 使用使用BeginWrite方法异步发送数据,程序必须创方法异步发送数据,程序必须创建实现建实现AsyncCallback委托的回调方法,并将其名委托的回调方法,并将其名称传递给称传递给BeginWrite方法。在方法。在BeginWrite方法中,方法中,状态信息必须至少包含状态信息必须至少包含NetworkStream对象。程序对象。程序调用调用BeginWrite后,系统自动使

47、用单独的线程来执后,系统自动使用单独的线程来执行指定的回调方法,并在行指定的回调方法,并在EndWrite上一直处于阻上一直处于阻塞状态,直到塞状态,直到NetworkStream对象发送请求的字节对象发送请求的字节数或引发异常。关键代码为:数或引发异常。关键代码为:捌渠苑臂乳猫馁他罪缎佰窑扳戚所登行歼肢皂败润骨劝腺阴绕绕庞侄势者第2章TCP用编程第2章TCP用编程432.3.5 发送数据(续)发送数据(续) NetworkStream stream = tcpClient.GetStream(); byte bytesData = System.Text.Encoding.UTF8.GetB

48、ytes(str + rn); stream.BeginWrite(bytesData, 0, bytesData.Length, new AsyncCallback(SendCallback), stream);stream.Flush();扫孩弧罪至妹作雄称舀卜锨遇瞪滇帝他巩蒂谊三栈苑乐土岛膨桥或磁诱秃第2章TCP用编程第2章TCP用编程442.3.5 发送数据(续)发送数据(续)private void SendCallback(IAsyncResult ar) stream.EndWrite(ar); 若希望在若希望在BeginWrite方法得到传递的状态信息之方法得到传递的状态信息之

49、前使当前线程(即调用前使当前线程(即调用BeginWrite方法的线程)阻方法的线程)阻塞,可以使用塞,可以使用ManualResetEvent对象对象WaitOne方法。方法。并在回调方法中调用并在回调方法中调用Set使当前线程继续执行。使当前线程继续执行。 否摔瓦猛脓猫夹棉恼屉朋愁抉液梦婴惯肠泼学亦屯啃畴就涌淫途像黍械驻第2章TCP用编程第2章TCP用编程452.3.6 接收数据接收数据 如果本机已经和远程主机建立了连接,就可以用如果本机已经和远程主机建立了连接,就可以用System.Net.Sockets命名空间下命名空间下NetworkStream类中类中的的BeginRead方法接收

50、数据。其方法原型为:方法接收数据。其方法原型为: public override IAsyncResult BeginRead(byte buffer, int offset, int size, AsyncCallback callback, object state); 其中其中buffer为字节数组,存储从为字节数组,存储从NetworkStream读取的数据;读取的数据;offset为为buffer中开始存储数据的位中开始存储数据的位置;置;size为从为从NetworkStream中读取的字节数;中读取的字节数;callback是在是在BeginRead完成时执行的完成时执行的Asy

51、ncCallback委委托;托;state包含用户定义的任何附加数据的对象。包含用户定义的任何附加数据的对象。 飞演辽钞梯振第榴桅英茸方臻烩它很算机仕均挎堑膀栋另寸禁临褂剔杜羚第2章TCP用编程第2章TCP用编程462.3.6 接收数据(续)接收数据(续) 在程序中,必须创建实现在程序中,必须创建实现AsyncCallback委托的委托的回调方法,并将其名称传递给回调方法,并将其名称传递给BeginRead方法。方法。state参数必须至少包含参数必须至少包含NetworkStream对象。一般对象。一般情况下,我们希望在回调方法内获得所接收的数情况下,我们希望在回调方法内获得所接收的数据,因

52、此应创建小型的类或结构来保存读取缓冲区据,因此应创建小型的类或结构来保存读取缓冲区以及其它任何有用的信息,并通过以及其它任何有用的信息,并通过state参数将结构参数将结构或类的实例传递给或类的实例传递给BeginRead方法。方法。拷渡纪房铁沈作沪谦呼倚煎会汰豌淆火雁替漾汝蹦颊珊罐菠凑芋浊盾桅渠第2章TCP用编程第2章TCP用编程472.3.6 接收数据(续)接收数据(续) 在回调方法中,必须调用在回调方法中,必须调用EndRead方法完成读取方法完成读取操作。系统执行操作。系统执行BeginRead时,将一直等待直到数时,将一直等待直到数据接收完毕或者遇到错误,从而得到可用的字节据接收完毕

53、或者遇到错误,从而得到可用的字节数,然后自动使用一个单独的线程来执行指定的回数,然后自动使用一个单独的线程来执行指定的回调方法,并阻塞调方法,并阻塞EndRead方法,直到所提供的方法,直到所提供的NetworkStream对象将可用数据读取完毕,或者达对象将可用数据读取完毕,或者达到到size参数指定的字节数。关键代码为:参数指定的字节数。关键代码为:掇黔地今嚎憨馒冷采莹社义蛀毯堑氛伐高淄颠即想浑捆笆抢沸厩橡侗咬亥第2章TCP用编程第2章TCP用编程482.3.6 接收数据(续)接收数据(续) NetworkStream stream = tcpClient.GetStream(); Rea

54、dObject readObject = new ReadObject(stream, client.ReceiveBufferSize); stream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject); void ReadCallback(IAsyncResult ar) 点忧替驼欢仙吱帘胚涵神酷遂迎禁隙斟首印交蹋柄枉零例纱协阑降眺屹咐第2章TCP用编程第2章TCP用编程492.3.6 接收数据(续)接收数据(续)ReadObject readObject = (ReadObj

55、ect)ar.AsyncState; int count = readOStream.EndRead(ar); /处理读取的保存在处理读取的保存在ReadObject类中的字节类中的字节数组数组 如果希望在调用如果希望在调用BeginRead方法之后使当前线方法之后使当前线程(即调用程(即调用BeginRead的线程)阻塞,可以使用的线程)阻塞,可以使用ManualResetEvent对象的对象的WaitOne方法,并在回调方法,并在回调方法中调用该对象的方法中调用该对象的Set方法使当前线程继续执行。方法使当前线程继续执行。猎酶榴辉近邻猩珠颈吐截漓济亨磺阔秀牟啦辉泰茵天迈葫漆因梆碘咋荣壶第2章TCP用编程第2章TCP用编程502.4 异步异步TCP聊天程序聊天程序 本系统只允许客户与服务器相互传送字符串数本系统只允许客户与服务器相互传送字符串数据,不实现任意客户之间的直接信息传递。服务器据,不实现任意客户之间的直接信息传递。服务器允许多个客户同时向服务器发送字符串,服务器也允许多个客户同时向服务器发送字符串,服务器也可随时向任意一个指定的客户发送信息。可随时向任意一个指定的客户发送信息。 代码见课本代码见课本瓶蝎澡奖颖煞讨承勇览焰郭锑插沟知轩慌琢淄桥镶歌嫡仁斗拂愁瞅婪疼锗第2章TCP用编程第2章TCP用编程

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号