热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个.net客户端通讯框架的设计(一)前言

背景最近我们的团队正在开发一款面向移动平台的LBS应用,客户端有android、j2me版本,LBS的概念非常不错我们希望将其发挥带极致。本人在这个项目

背景

最近我们的团队正在开发一款面向移动平台的LBS应用,客户端有android、j2me版本,LBS的概念非常不错我们希望将其发挥带极致。本人在这个项目中主导服务器开发(java平台)。由于人手有限以及团队中各自专长不同,服务器的数据统计与将来的PC端也又我一人用.NET承包了:P好了,废话不多说我们直入正题。

      其实有人会认为,不就是客户端与服务器的通信嘛,很简单,如果用阻塞I/O的话开两根线程,一根从网络I/O中读取数据,将每条消息投递到一个消息队列中,然后通过一些触发机制触发这些消息的处理代码;要写的话将要写的代码投递到一个输出队列中,另一根线程从这个队列poll消息然后write到流中即可……是的,这么做可以,而且我们android端的通讯就是这么做的。不过我还有一个目的,就是借此写一个轻量级的.NET服务器(之前是用java nio做的服务器),做过服务器的人都清楚,服务器是不可能用阻塞I/O+多线程的。而且我需要的是一个一个可服用、可定制的灵活的服务器/客户端通讯框架,于是就有了这个通信框架。如果您研究过apache mina,会发现在api的设计上与mina有相似之处哦。

项目中的运用

     软件的设计与架构是一门技术也是艺术,将整个合理的分层、熔炼,我们可以方便的在后期独立更换协议、业务、UI、配置。

image image image image image

其中:ClientConnLib是基础的通信框架;ConnProtocolLib结合特定协议的ClientConnLib的一个实现;BizModule则是基于通信框架接口的业务模块;BackEarth则是一个WPF应用程序,整个项目采用MVVM结构,BackEarth相当于MVVM中的View和Model。本系列文章只讲其中的客户端通信基础和急于这个框架的协议库实现。

原理概述

如下图:来自网络的数据会被Decoder处理,IDecoder接口有两个方法:Decodable和Decode,Decodable负责判断消息的完整性,如果接收到了一条完整的消息则在Decode中进行处理(传递到MessageHandler的MessageReceived)

image

 

 

 

ClientConnLib本身并不规定具体的协议格式,如果要定制的话只需自行实现IDecoder、IEncoder和IoHandler即可。

定制协议库

基于ClientConnLib我写了个ConnProtocolLib用于与我的java服务器进行通讯,我的那个服务器通讯协议时这样的

image wps_clip_image-1049

消息头是6个byte,前4个byte是消息的总长度,用于IDecoder进行完整性验证,后2个byte是消息的id,其余的是消息体数据。完整的消息读出后会被放入一个NetworkMessageBase的对象中传递给MessageHandler.MessageReceived处理,当然这个传递时借助一个线程池完成的,这样I/O线程解析完消息后会呗即时释放,业务的处理交由其他线程来完成。

这里我除了有一个NetworkMessageBase还有一个类似的JpNetworkMessageBase,后者是针对大字节序平台写的比如java platform,如果通讯目标使用大字节序则使用JpNetworkMessageBase即可。

余下几篇篇我将讲解这个通讯框架和协议库德实现。

下载链接:

http://files.cnblogs.com/wJiang/ClientConnLib.rar

转:https://www.cnblogs.com/wJiang/archive/2010/12/09/1900992.html



推荐阅读
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在Android开发中,BroadcastReceiver(广播接收器)是一个重要的组件,广泛应用于多种场景。本文将深入解析BroadcastReceiver的工作原理、应用场景及其具体实现方法,帮助开发者更好地理解和使用这一组件。通过实例分析,文章详细探讨了静态广播的注册方式、生命周期管理以及常见问题的解决策略,为开发者提供全面的技术指导。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 在多线程环境中,IpcChannel的性能表现并未如预期般优于Tcp和Http通道。实际测试结果显示,在IIS6中通过Remoting创建的Ipc通道,其速度比Tcp通道慢了约20倍。本文详细分析了这一现象的原因,并提出了针对性的优化建议,以提升IpcChannel在高并发场景下的性能表现。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
author-avatar
普罗土
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有