




已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章TCP协议开发 10 0引言10 1相关概念10 2定义与获取主机信息10 3同步套接字编程10 4同步套接字开发举例 简单聊天程序10 5使用TcpClient和TcpListener简化TCP编程10 6异步套接字编程10 7异步套接字开发举例10 8小结 10 0引言 1 面向连接的套接字使用TCP协议来建立IP地址端点之间的会话 如图 服务器客户端 10 0引言 10 0引言 10 0引言 2 服务器端编程1 指定IP地址和端口号 IPAddress IPEndPoint IPAddressip IPAddress Parse 127 0 0 1 IPEndPointiep newIPEndPoint ip 6788 2 创建套接字Socketsocket newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp 10 0引言 3 套接字与IP端口绑定 Bind4 侦听客户端的请求 Listen5 接收客户端的请求 Accept6 接收客户端发送的信息 Receive 7 向客户端发送信息 Send8 关闭套接字 Close 代码见TcpChatOne 10 0引言 3 服务器端编程需做的特殊处理发送信息使用用户自身触发的事件 但接收对方发来的信息是对方来触发的事件 是不是意味着随时都处于接收状态 类似QQ的聊天 对方何时发来信息是不确定的 如何解决 10 0引言 4 客户端编程1 向服务器端发出请求Connect来处理2 其他处理的方式类似服务器端 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 127 0 0 1 IPEndPointmyServer newIPEndPoint myServerIP 13 2 主机解析程序实例 Dns Resolve 的使用usingSystem usingSystem Net publicclassTestFileStream staticvoidMain Console Write 输入主机名或者IP地址 stringstr Console ReadLine IPHostEntryhost Dns Resolve str for inti 0 i host AddressList Length i Console WriteLine host AddressList i ToString Console WriteLine host HostName Console ReadLine 10 3同步套接字编程 1 服务器端口绑定与监听在服务器与客户机连接传输数据前 服务器需要做以下事情 1 创建一个套接字 2 创建本地IPEndPoint对象 3 使用Bind 方法将所创建的套接字与本地IPEndPoint绑定 4 使用Listen 方法设置套接字为监听模式 5 使用Accept 方法接收客户端连接请求并为客户端创建一个客户端套接字 实现方法usingSystem Net usingSystem Net Sockets IPAddressip IPAddress Parse 127 0 0 1 IPEndPointiep newIPEndPoint ip 6788 Socketsocket newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp socket Bind iep socket Listen 10 最多允许10个客户端同时连接while true SocketclientSocket socket Accept 2 客户端建立与服务器的连接客户端在传送数据前 只需要做两件事 1 创建一个套接字 2 使用Socket类的Connect 方法将套接字与远程服务器地址相连 实现方法 IPAddressip IPAddress Parse 202 196 101 246 服务器IPEndPointiep newIPEndPoint ip 6788 Socketsocket newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp socket Connect iep 3 发送数据 1 使用Socket类的Send 方法 2 使用NetworkStream类的Write 方法 注意 发送的数据必须为字节数组字节数组的数据并不是直接发送到远程机器上 而是发送到了TCP缓冲区中 该缓冲区默认大小为1024字节 TCP缓冲区 1 使用Socket类的Send 方法对服务器端 可以使用客户端连接时创建的套接字发送数据 例如 byte bytes newbyte 1024 stringmessage 发送的数据 bytes System Text Encoding Unicode GetBytes message intnCount clientSocket Send bytes 0 bytes Length SocketFlags None 说明 Send函数的返回值表示实际发送到TCP缓冲区的字节数 intdataleft bytes Length intstart 0 while dataleft 0 intsen clientSocket Send bytes start dataleft SocketFlags None start sen dataleft sen 2 使用NetworkStream类的Write 方法如果创建了NetworkStream对象 就可以直接使用该对象发送数据 例如 NetworkStreamnetstream newNetworkStream clientSocket stringmessage 发送的数据 byte bytes System Text Encoding Unicode GetBytes message netstream Write bytes 0 bytes Length 与套接字的Send 方法不同 NetworkStream对象的Write 方法返回值为void 4 接收数据与发送数据相似 接收数据的方法也有两种 1 使用Socket类的Receive方法 2 使用NetworkStream类的Read方法 其用法与发送数据类似 例如 byte message newbyte 1024 NetworkStreamnetstream newNetworkStream clientSocket intlen netstream Read message 0 message Length 注意 Read 方法有一个整型的返回值 表明实际从TCP缓冲区中读取了多少字节的数据 这是因为有可能TCP缓冲区还没有接收到远程设备发送过来的指定长度的数据 5 TCP协议的无消息边界问题TCP协议的无消息边界问题TCP协议是无消息边界的 即不能保证来自单个Send方法的数据能被单个Receive方法读取 例 第一次发送 abcdefg第二次发送 1234567接收方接收的数据 第一次接收 abcdefg1234567极端情况下 第一次接收 abcd第二次接收 efg12第三次接收 34567 TCP协议的无消息边界问题 解决方法 发送固定长度的消息将消息长度与消息一起发送 比如字符串消息前用2个字节表明本次消息长度 使用特殊标记分隔消息 要求消息本身不包括特殊标记符 10 4简单聊天程序 10 4 1服务器端编程 1 开始监听 的Click事件代码privatevoidbuttonStart Click objectsender System EventArgse this buttonStart Enabled false IPAddressip IPAddress Parse this textBoxIp Text IPEndPointserver newIPEndPoint ip Int32 Parse this textBoxPort Text socket newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp socket Bind server socket Listen 10 clientSocket socket Accept this listBoxState Items Add 与客户 clientSocket RemoteEndPoint ToString 建立连接 thread newThread newThreadStart AcceptMessage thread Start 2 接收消息方法privatevoidAcceptMessage while true try NetworkStreamnetStream newNetworkStream clientSocket byte datasize newbyte 4 netStream Read datasize 0 4 intsize System BitConverter ToInt32 datasize 0 Byte message newbyte size intdataleft size intstart 0 while dataleft 0 intrecv netStream Read message start dataleft start recv dataleft recv this richTextBoxAccept Rtf System Text Encoding Unicode GetString message Catch this listBoxState Items Add 与客户断开连接 break 3添加 发送信息 的Click事件代码 privatevoidbuttonSend Click objectsender System EventArgse stringstr this richTextBoxSend Rtf inti str Length if i 0 return else i 2 为什么i 2byte datasize newbyte 4 datasize System BitConverter GetBytes i byte sendbytes System Text Encoding Unicode GetBytes str try NetworkStreamnetStream newNetworkStream clientSocket netStream Write datasize 0 4 netStream Write sendbytes 0 sendbytes Length netStream Flush this richTextBoxSend Rtf Catch MessageBox Show 无法发送 4 停止监听 的Click事件代码 privatevoidbuttonStop Click objectsender System EventArgse this buttonStart Enabled true try socket Close if clientSocket Connected clientSocket Shutdown SocketShutdown Both clientSocket Close thread Abort catch MessageBox Show 监听尚未开始 关闭无效 5窗口关闭前触发的事件代码 privatevoidForm1 Closing objectsender System ComponentModel CancelEventArgse socket Close if clientSocket Connected clientSocket Shutdown SocketShutdown Both clientSocket Close thread Abort 10 4 2客户端编程 1 请求连接 的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 try socket Connect server catch MessageBox Show 与服务器连接失败 return this buttonRequest Enabled false this listBoxState Items Add 与服务器连接成功 Threadthread newThread newThreadStart AcceptMessage thread Start 2 接收消息函数privatevoidAcceptMessage while true try NetworkStreamnetStream newNetworkStream socket byte datasize newbyte 4 netStream Read datasize 0 4 intsize System BitConverter ToInt32 datasize 0 Byte message newbyte size intdataleft size intstart 0 while dataleft 0 intrecv netStream Read message start dataleft start recv dataleft recv this richTextBoxReceive Rtf System Text Encoding Unicode GetString message catch this listBoxState Items Add 服务器断开连接 break 3 发送信息 的Click事件代码 privatevoidbuttonSend Click objectsender System EventArgse stringstr this richTextBoxSend Rtf inti str Length if i 0 return else i 2 byte datasize newbyte 4 datasize System BitConverter GetBytes i byte sendbytes System Text Encoding Unicode GetBytes str try NetworkStreamnetStream newNetworkStream socket netStream Write datasize 0 4 netStream Write sendbytes 0 sendbytes Length netStream Flush this richTextBoxSend Text catch MessageBox Show 无法发送 4 关闭连接 的Click事件代码 privatevoidbuttonClose Click objectsender System EventArgse try socket Shutdown SocketShutdown Both socket Close this listBoxState Items Add 与主机断开连接 thread Abort catch MessageBox Show 尚未与主机连接 断开无效 this buttonRequest Enabled true 5 关闭窗口前触发的事件代码 privatevoidForm1 Closing objectsender System ComponentModel CancelEventArgse socket Shutdown SocketShutdown Both socket Close 10 4 3分析 作为服务器是否能接收多个客户端呢 服务器和客户端聊天是否合乎逻辑 如何改进程序 10 5使用TcpClient和TcpListener类简化TCP编程 TcpClient类用于连接 发送和收发数据TcpListener类用于监听是否有传入的连接请求 10 5 1TcpClient类 构造函数1 TcpClient 将套接字与自动选择的本地IP地址和端口号绑定 2 TcpClient IPEndPointiep 将套接字与本地IPEndPoint进行绑定 3 TcpClient stringhost intport 将套接字与自动选择的本地IP地址和端口号绑定 并且与远程设备建立连接 Host指远程主机的IP地址或主机名 2 常用方法1 Connect 与远程设备建立TCP连接2 GetStream 获取能够发送和接收数据的NetworkStream对象 建立连接后才能使用 3 Close 关闭TCP连接 10 5 2TcpListener类 1 构造函数1 TcpListener intport 将TcpListener与指定的本地端口号进行绑定2 TcpListener IPAdressaddress intport 将TcpListener与指定的本地IP地址和端口号进行绑定3 TcpListener IPEndPointiep 将TcpListener与指定的本地IPEndPoint进行绑定 2 常用方法1 AccpetTcpClient 该方法返回一个TcpClient对象 可以通过这个对象进行收发信息 TcpClientnewClient tcpListener AccpetTcpClient 2 AcceptSocket 该方法返回一个Socket对象 可以通过这个对象进行收发信息 3 Start 开始监听 4 Stop 结束监听 关闭套接字 10 5 3课堂练习 用TcpClient和TcpListener两个类改写我们课本中的聊天程序 10 5 4综合示例 1 功能要求 改进书本上的聊天程序 实现多人之间的聊天功能 2 功能演示 见TcpChatThree示例 10 5 4综合示例 3 功能分析 1 如何实现服务器接收多个客户端 2 多个用户之间聊天如何实现 每个用户既是客户端又是服务器端 还是采用其他方法 3 私聊如何实现 4 在线人员情况如何维护 10 5 4综合示例 4 实现 1 接收多个客户端 线程处理2 客户端之间聊天 服务器转发3 多人聊天和私聊 转发时设置转发对象4 在线人员维护上线和离线时需要处理 10 5 4综合示例 4 实现 5 消息类型6 服务器需要保存所有客户的相关信息 10 5 4综合示例 5 思考 即时通信软件能不能这么做 10 6异步套接字编程 10 6 1概述1 异步套接字的用途可以解决同步套接字中出现的阻塞问题 采用asyncCallback委托机制 2 asyncCallback委托1 asyncCallback委托的声明格式 publicdelegatevoidAsyncCallback IAsyncResultar 2 IAsyncResult接口该接口表示异步操作的状态 仅包括四个属性 10 6 1概述 objectAsyncState 获取用户定义的对象 它限定或包含关于异步操作的信息 WaitHandleAsyncWaitHandle 获取用于等待异步操作完成的System Threading WaitHandle boolCompletedSynchronously 获取异步操作是否同步完成的指示 boolIsCompleted 获取异步操作是否已完成的指示 3 异步套接字的方法 如下表所示 10 6 1概述 异步套接字结构图服务器客户端 10 6 2BeginAccept 方法和EndAccept 方法 异步Socket中使用BeginAccept方法开始接收新的连接请求 其方法原型为 publicIAsyncResultBeginAccept AsyncCallbackcallback Objectstate 其中 参数1为AsyncCallback类型的委托 委托提供的方法用于接收连接并且调EndAccept 参数2为Object类型 用于将状态信息传递给委托提供的方法 示例1 Socketsocket newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp IPEndPointiep newIPEndPoint IPAddress Any 6788 socket Bind iep intnCount 10 socket Listen nCount socket BeginAccept newAsyncCallback ClientConnected Object socket 示例2 PrivatevoidClientConnected IAsyncResultar Socketserver Socket ar AsyncState Socketclient server EndAccept 异步套接字编程中 客户端使用BeginConnect 方法连接到远程主机 其格式为 IAsyncResultBeginConnect EndPointep AsyncCallBackcallback Objectstate 其中第一个参数是远程主机的EndPoint对象 第二个参数用于和远程主机连接成功后执行委托调用的方法 最后一个参数是状态对象 用于传递必要的数据 EndConnect 方法的格式为 publicvoidEndConnect IasyncResultar 10 6 3BeginConnect 方法和EndConnect 方法 IAsyncResultBeginSend byte buffer intoffset intsize SocketFlagssocketFlags AsyncCallbackcallback Objectstate intEndSend AsyncResultasyncResult IAsyncResultBeginReceive byte buffer intoffset intsize SocketFlagssocketFlags AsyncCallbackcallback Objectstate intEndReceive IAsyncResultasyncResult 10 6 4异步发送和接收数据 10 7异步套接字开发举例 10 7 1服务器端开发 10 7 2客户端开发 10 8小结 10 8 1同步 异步套接字开发比较1 编程思路1 同步套接字服务器客户端 2 异步套接字服务器客户端 2 数据收发1 同步套接字Send Receive Socket Write Read NetworkStream 2 异步套接字BeginSend EndSend Socket BeginRec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年健康教育与健康促进策略测试题答案及解析
- 2025年传染病学防控应急处置模拟试题答案及解析
- 2025-2030功能性食品原料创新研发与消费者认知调研报告
- 2025-2030功能性化妆品市场潜力与政策环境影响分析报告
- 2025-2030共聚焦显微镜下游应用场景扩展战略研究报告
- 2025-2030共享经济产业市场现状及发展潜力分析评估研究报告
- 2025年新能源光伏发电市场发展与2026-2032年政策影响分析报告
- 2025年新能源行业绿色技术创新与产业协同发展报告
- 2025年农村新能源技术创新在提升农村居民能源利用效率中的作用报告
- 2025年跨境电商物流服务创新模式与市场前景报告
- 冲压质量培训
- 2025年辽宁交投集团招聘笔试参考题库含答案解析
- 设备维护与保养手册
- 喷雾干燥塔操作规程模版(3篇)
- 《天疱疮诊断及治疗》课件
- 学校教代会代表换届选举方案
- 现代交换原理第二章
- 2024版工业润滑油销售协议范例版
- 企业级智能数据分析系统开发与服务合同
- 2024数据要素典型案例
- Unit 3 She has long hair. (教学设计)-2024-2025学年湘鲁版英语五年级上册
评论
0/150
提交评论