第12讲 NET远程通信.ppt_第1页
第12讲 NET远程通信.ppt_第2页
第12讲 NET远程通信.ppt_第3页
第12讲 NET远程通信.ppt_第4页
第12讲 NET远程通信.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C NET编程技术 第12讲 NET远程通信 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 通信模型概述 什么是通信 两个或多个物理或逻辑实体之间的数据交互计算机通信的要素 信道通信地址通信协议 信道 信道 不是一个有明确意义的名词在不同的应用场景下 可能具有不同的含义物理的信道光纤信道 无线频点 CDMA码点逻辑的信道Ethernet FDDI ATM X 25TCP UDP HTTP IPC 本讲所说的信道 指将数据从通信一端传递到另一端的逻辑路径 例如TCP虚电路 通信地址与通信协议 通信地址不是一个孤立的概念 常常是与通信协议相配套的 在TCP IP网络的不同层次上有不同的编址方式和通信协议 例如 数据链路层 MAC地址 Ethernet协议 网络层 IP地址 IP协议 传输层 IP地址 端口 TCP UDP协议 应用层 域名 IP地址 端口 HTTP协议 本讲关注的是传输层和应用层通信 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 套接字通信 在TCP IP网络上的传统通信模型起源于UNIX操作系统以一个 套接字 socket 作为通信的端点 数据在两个socket之间传递套接字通信不关心应用层数据的格式 套接字通信示例 TCP服务器端 创建一个侦听套接字SocketsListen newSocket AddressFamily InterNetwork SocketType Stream ProtocolType Tcp 侦听套接字绑定地址sListen Bind newIPEndPoint IPAddress Any 8960 侦听到来的连接sListen Listen 接受连接到一个新的套接字SocketsAccecpt sListen Accept 使用新的套接字接收和发送数据sAccecpt Send NET类库对套接字通信的封装 为了使用方便 NET针对不同的协议 对套接字通信进行了封装传输层协议封装TcpListener TcpClient UdpClient用于执行TCP连接通信和UDP无连接通信 UDP是无连接的 基于数据包的协议 数据包所承载通信数据的格式需自行定义 TCP是基于流的协议 单次接收不一定能收到足够的数据 因此必须自行制定协议 确保收到了足够的数据 NET类库对套接字通信的封装 续 应用层协议封装WebClientWebRequestWebResponse用于以URI标定地址的通信 一般都是请求 响应模式具体派生类HttpWebRequest HttpWebResponseFtpWebRequest FtpWebResponseFileWebRequest FileWebResponse 使用套接字封装类的示例 发起到192 168 0 1 80的TCP连接 并收发数据TcpClienttcpClient newTcpClient 192 168 0 1 80 using Streams tcpClient GetStream s Read s Write 发起到的HTTP请求 并获得响应using HttpWebRequesthttpReq HttpWebRequest Create asHttpWebRequest HttpWebResponsehttpRes httpReq GetResponse 套接字及封装通信类的特点 优点 一脉传承自UNIX 是经典的网络通信编程模型 C C 程序员容易入手使用简单 含义明确不足 程序员需熟悉通信协议及TCP IP协议栈如果使用其它通信 如IPC MSMQ 程序员同样需熟悉具体协议需自行维护通信数据格式 及通信的完整性 这意味着 程序员必须消耗额外的精力用于学习通信协议的底层细节 和设计可靠的数据传输流程 而这种学习和设计常常不是软件项目所要求的业务工作 而只是一些潜在的背景知识和底层架构 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 面向对象的通信 NET是面向对象的语言而使用socket的通信 传递的是无格式数据能否在通信中传递对象 通信中传递对象的好处 与面向对象编程风格保持一致 无需关注通信中的数据流格式及数据传递的完整性 与常规编程方式一样使用对象 不关心底层如何通信的 从而集中全部精力在业务功能上 从编程角度看通信的实质 从编程的角度看 什么是通信 所谓通信 就是函数调用 侦听到来的连接sListen Listen 接受连接到一个新的套接字SocketsAccept sListen Accept 使用新的套接字接收和发送数据byte data 1 2 3 4 sAccept Send data byte rcvData newbyte 5 sAccept Receive rcvData 发送数据 就是调用一个函数 Send 并把要发送的数据 data 作为形参传入 接收数据 就是调用一个函数 Receive 并把要存储收到数据的缓冲区作为形参传入 基于socket通信的示意图 字节数据 从编程角度看通信的实质 续 在基于socket的通信中 被调用的函数都是固定类型 Socket TcpClient WebRequest等 的方法传递的数据则是无格式的连续字节数据的传入和接收都是使用函数形参发送和接收使用不同的函数那么 是否可以 以任意类型的方法作为通信函数 传递的数据能否是有意义的对象 以函数返回值的方式返回数据 发送端 接收端的函数 能否是同一个 面向对象通信的示意图 MyObject ResonseSocket ExecReq Requestreq 通信对象 通信函数 信道 MyObject ResonseSocket ExecReq Requestreq 任意对象作为通信对象 传递的数据是有意义的 一个Request类型对象 以函数返回值的方式返回数据 一个Response类型对象 MyObjectobj newMyObject Requestreq newRequest Responseres obj ExecReq req 这样的通信 怎样编程 这与平常的编程没有任何区别 根本看不出通信的存在 发送和接收函数 是同一个 ExecReq 面向对象通信 面向对象通信与面向对象本地编程 在代码上完全一样 二者区别在于 参数传到了本地 还是传到了远程机器函数的执行 是在本地还是在远程机器 面向对象通信编程 看起来像是调用了个本地函数 就得到了结果 实际上参数是传递到了远程机器上 而函数也是在远程机器上执行的 面向对象通信的几个要点 信道数据通过什么信道传递的 TCP HTTP IPC 通信对象通信双方使用的通信对象是什么在socket通信中 socket标识通信端点 而在面向对象通信中 端点是任何对象 我们叫做通信对象封装格式面向对象通信传递的是对象 而各类信道只能传递无格式的字节串或文本 那么如何将对象封装成字节串或文本 且不丢失对象本身的信息 NET3 5支持的主要通信模型 NETRemoting仅能使用在 NET平台上 信道 可使用HTTP TCP IPC 也可以自定义可以用Binary XML SOAP封装通信中的对象WebServices与平台无关的通信模型 兼容性好 信道 只能使用HTTP只能用SOAP封装通信中的对象WindowsCommunicationFoundation WCF NET3 0提供的统一通信模型 融合了 NETRemoting WebServices MSMQ等多种通信方式 后两种通信模型 我们在讲完ASP NET之后再讲述 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 NETRemoting 一种面向对象通信模式信道 TCP HTTP IPC 可自行扩展定义通信对象 自定义引用类型封装格式 TCP和IPC信道使用Binary HTTP信道使用SOAP负责两个应用程序域之间的通信回顾 什么是应用程序域 NETRemoting的几个术语 代理 消息 信道 格式化程序对象封送方式MBR 引用封送 和MBV 值封送 MBR激活类型WKO 知名对象 和CAO 客户端激活对象 WKO类型状态配置单例和单一调用 NETRemoting通信示意图 客户端 服务器端 调度程序 格式化程序 透明代理 信道 格式化程序 真实代理 远程对象 NETRemoting通信示意图 客户端 服务器端 调度程序 格式化程序 透明代理 信道 格式化程序 真实代理 远程对象 代理 的作用 是给客户端提供通信对象的接口 使客户端认为自己好像在调用一个本地对象 而实际上通信对象的实体在服务器端 代理 负责接收客户端输入的调用参数 然后将这些参数封装成 消息 并传递给服务器端 所谓 消息 就是一个实现了IMessage接口的对象 NETRemoting通信示意图 客户端 服务器端 调度程序 格式化程序 透明代理 信道 格式化程序 真实代理 远程对象 格式化程序 负责将要传递给服务器端的调用参数进行变换 以适应信道 例如对于TCP和IPC信道 将被变换成二进制格式 Binary 这就是前述三要点中的 封装格式 NETRemoting通信示意图 客户端 服务器端 调度程序 格式化程序 透明代理 信道 格式化程序 真实代理 远程对象 NET2 0以后支持的 信道 有三种 TCP IPC和HTTP TCP与HTTP的区别 1 TCP是全双工的通信信道 而HTTP本质上是单工通信 客户端发送请求 服务器回送响应 2 TCP的载荷是二进制数据 HTTP的载荷是可打印文本字符 对象封送方式 一个对象 实质上是对象实例 怎样从通信一端跑到另一端 MBR 引用封送当服务器端把MBR对象传给客户端时 客户端所得到的只是对服务器端对象的一个引用 而对象实体仍在服务器端这意味着 客户端对MBR对象任何方法 属性的访问 都会通过代理传递到服务器端执行 而非本地执行 通信对象 必须是MBR 否则无法完成我们期望的功能 MBR对象传递示意图 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject obj SetData stringstr MBRObjmbr obj GetObj MyObject对象实例 看起来似乎创建了一个本地对象实例 实际上这个实例是在服务器端创建 而非本地 看起来似乎调用了本地对象的一个函数 实际上此函数是在服务器端执行的 参数通过信道传递了过去 stringstr MBRObj对象实例 对象引用 看起来似乎从服务器获得了一个MBRObj类型的对象实例 其实获得的只是这个实例的引用 实例实体只有一份 在服务器上 客户端对 mbr 变量任何方法的调用 都跟上述的obj一样 将参数通过信道传递到服务器上去 方法代码在服务器上执行 对象封送方式 续 MBV 值封送当服务器端把MBV对象传给客户端时 客户端所得到的是服务器端对象的一个完整副本这意味着 客户端对所获得的MBV对象任何方法 属性的访问 都是本地调用 不会影响到服务器上的对象使用 通信对象 的方法进行通信时 可使用MBV对象作为形参或返回值 MBV对象传递示意图 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject MBVObjmbv obj GetObj MyObject对象实例 MBVObj对象实例 MBVObj对象实例 服务器上生成一个实例 并拷贝一份 通过信道传递给客户端 mbv 已经是本地变量 客户端对 mbv 变量任何方法的调用 都是在本地执行 对服务器没有影响 对象封送方式 续 什么样的对象是MBR对象 派生自MarshalByRefObject的对象什么样的对象是MBV对象 不派生自MarshalByRefObject 且可序列化的对象 什么样的对象可序列化 具有 Serizable 特性的对象 都是可序列化的 例如 Serizable publicclassMyObject MBR激活类型 MBR对象的实体保存在服务器端那么这个对象什么时候实例化 先想一下本地对象是怎么实例化的当程序使用new关键字 或Activator GetObject动态生成时 对象实例化MBR对象实例化的两个思路 客户端使用new关键字时 通过代理传递消息到服务器 对象实例化当对象真正被用到时 例如 首次调用其方法或属性时 根据客户端的消息 服务器端进行实例化如果选择前者 则称此MBR对象是 知名对象 WKO 选择后者 则叫 客户端激活对象 CAO WKO激活示意图 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx MyObject对象实例 客户端用new关键字时 服务器端并未实例化 客户端尝试调用此实例的一个方法时 服务器端才对其实例化 CAO激活示意图 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx MyObject对象实例 客户端用new关键字时 服务器端立即实例化 MBR激活类型 续 WKO与CAO的区别CAO可以使用带参数的构造函数WKO必须使用无参数的构造函数 为什么 WKO类型状态配置 MBR对象是在服务器端实例化的当不同的客户端使用同一个服务器上的MBR对象时 是实例化一次还是多次 也就是说 多个客户端访问服务器上MBR对象时 他们访问的是同一个实例 还是各自不同的实例 SingleTon和SingleCallSingleTon 只有一个实例SingleCall 对应于每个客户端 分别生成不同的实例 Singleton示意图 WKO 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx MyObject对象实例 客户端调用远程WKO对象方法时 服务器端实例化 客户端2 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx 另一个客户端调用此远程WKO对象方法时 如果服务器端先前已经实例化 则仍使用该实例 而不生成新的实例 SingleCall示意图 WKO 客户端 服务器端 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx MyObject对象实例 客户端调用远程WKO对象方法时 服务器端实例化 客户端2 信道 MyObject是远程对象类型MyObjectobj newMyObject obj xxxx 另一个客户端调用此远程WKO对象方法时 又生成一个新的实例 MyObject对象实例2 WKO SingleCall与CAO的区别 WKO SingleCall在首次被调用时实例化 CAO在客户端实例化时实例化WKO SingleCall只能使用无参的构造 CAO可以使用有参构造WKO SingleCall针对每个客户端 只有一个实例 一对一 而CAO在客户端可以构造多个实例WKO SingleCall是无状态保持的 当其方法被调用后 立即进入垃圾收集 CAO则有状态保持 远程对象的生存期管理 远程对象什么时候应该被垃圾回收 MBV对象对于服务器 客户端来说 MBV都是本地对象 因此不再被使用时即可垃圾回收MBR对象对象实体在服务器上 而非客户端本地什么时候才能确定它 不再被使用 MBR对象的生存期管理 WKO SingleCall无状态保持的 当其方法被调用后 立即进入垃圾收集WKO SingleTon所有客户端都使用同一个实例服务器端无法确认什么时候它才 不再被使用 CAO有状态保持 因远程使用 也无法判断什么时候不再被使用 为什么 对于WKO SingleTon和CAO对象实例 服务器端采用 租约 的方式 确定何时进入垃圾回收 租约管理 对于WKO SingleTon和CAO 使用租约的方式管理对象实例的垃圾收集实例化时 给定一个生存期 例如40分钟 每次其方法被调用时 生存期时间复位 即恢复到40分钟 当上一次调用后 生存期倒计时 如果到0仍无后续调用 则垃圾收集 再来调用怎么办 重新生成一个实例 内容提要 通信模型概述套接字通信编程面向对象的通信 NETRemoting基本原理 NETRemoting通信编程 NETRemoting编程 NETRemoting编程的步骤 客户端 服务器端注册一个或多个信道 客户端 服务器端注册一个或多个通信对象 即服务器上可被远程访问的MBR对象 客户端实例化并使用此对象 实质上是通过代理远程调用 第一步 注册信道 服务器端staticvoidMain string args 注册一个信道ChannelServices RegisterChannel newIpcChannel localhost 9090 false 客户端staticvoidMain string args ChannelServices RegisterChannel newIpcChannel false 服务器端注册一个IPC信道 也可以注册成TCP HTTP信道 注册信道时需要指明服务地址和端口 客户端也注册一个IPC信道 由于客户端用于访问服务器端 所以自身的地址和端口无需指明 第二步 注册通信对象 服务器端staticvoidMain string args 注册一个信道ChannelServices RegisterChannel newIpcChannel localhost 9090 false 注册通信对象RemotingObjectRemotingConfiguration RegisterWellKnownServiceType typeof RemotingObject rmObj WellKnownObjectMode Singleton 这里将其注册成了WKO SingleTon 也可以注册成CAO的 当客户端不使用new进行实例化时 不必在客户端执行注册 有关RemotingObject类型的定义 详见示例代码 第三步 客户端实例化并使用对象 客户端staticvoidMain string args ChannelServices RegisterChannel newIpcChannel false IRemotingObjectrmObj Activator GetObject typeof IRemotingObject ipc localhost 9090 rmObj asIRemotingObject Console WriteLine rmObj GetContextInfo MBRObjectmbrObj rmObj GetMBRObj Console WriteLine mbrObj GetContextInfo 有关IRemotingObject MBRObject类型的定义 详见示例代码 字符串所指示的 就是在服务器端注册的信道地址和服务名称 NETRemoting的一些关键类 ChannelServices负责注册信道 查找信道信息等RemotingConfiguration负责注册通信对象 及判断是否远程对象等MarshalByRefObjectMBR对象基类给出租约访问接口 ILease ChannelServices ChannelServices RegisterChannel方法注册一个信道ChannelServices RegisteredChannels属性获得所有已注册信道的列表ChannelServices GetChannel方法根据信道的名字 获取一个信道 用什么表示 信道 实现了IChannel和其它相关接口的类型 如TcpChannel IpcChannel等 RemotingConfiguration RemotingConfiguration RegisterWellKnownServiceType方法在服务器端注册一个WKO对象RemotingConfiguration RegisterWellKnownClientType方法在客户端注册一个WKO对象 客户端也可以不执行这项注册 而直接用Activator GetObject实例化 如示例代码 但注册后可以使用new关键字实例化 RemotingConfiguration 续 RemotingConfiguration RegisterActivatedServiceType方法在服务器端注册一个CAO对象RemotingConfiguration RegisterActivatedClientType方法在客户端注册一个CAO对象 RemotingConfiguration 续 以下函数用于获取已注册的服务器端或客户端类型RemotingConfiguration GetRegisteredActivatedClientTypesRemotingConfiguration GetRegisteredActivatedServiceTypesRemotingConfiguration GetRegisteredWellKnownClientTypesRemotingConfiguration GetRegisteredWellKnownServiceTypes以下函数用于判断一个类型的远程属性RemotingConfiguration IsActivationAllowedRemotingConfiguration IsRemotelyActivatedClientTypeRemotingConfiguration IsWellKnownClientType MarshalByRefObject 以下两个方法用于WKO SingleCall和CAO对象的租约管理MarshalByRefObject GetLifeServiceMarshalByRefObject InitializeLifeService

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论