客户端是选择Java Swing还是C# Winform

 

【专家问答】韦玮:Python基础编程实战专题     【知识库】Swift资源大集合     【公告】博客新皮肤上线啦     快来领福利:C币、机械键盘    
 

客户端是选择Java Swing还是C# Winform 

标签: swingc#winformservice浏览器java
 分类:
 
JAVA(7)   本人作品(20) 

客户端是选择Java Swing还是C# Winform?

在某大型项目中,客户要求不能用浏览器作为客户端(即不能用B/S模式),而要采用桌面客户端的方式(服务端用SSH,客户端通过Web Service访问服务端应用,并且还要求能在客户端与服务端网络中断的情况下离线进行部分业务操作,例如查询)。这可给我们项目组提出了一个大问题:客户端应用开发的技术选型。

公司有些员工强烈建议用Java Swing,认为有一些框架可以利用,例如spring RichClient(Swing),大家都对Spring比较熟悉,有亲近感;甚至可以考虑使用 Eclipse RCP(SWT),因为有Eclipse在前面作为成功标杆。并且公司开发人员绝大多是Java程序员,可以随时抽调精兵强将加入任务繁重的客户端开发中,解决技术难题,甚至突击编写普通业务功能。而C#人员要重新招聘,增加了很多不确定因素。

但是采用Swing,缺点是界面比较难看,控件少得可怜,对客户端资源的控制能力差,开发难度肯定高,并且公司内部也没有积累(Java程序员都是做B/S应用的),并且在人力资源市场上,Swing方面但凡有点水平的开发人员工资都高得吓人(在51Job上查了一下);但好处就是应用服务端与客户端都是用的Java,两边的人手可以灵活配置(当然前题是开发人员对于SSH和Swing都要能上手,一是需要一段时间学习,二是人家技能多了,肯定会要求加工资待遇的)。

并且Spring RichClient已经很久没有更新了,最新的版本是1.10,还是2009年6月发布的,在开发技术日新月益的今天,这种更新速度很叫人担心呀!难不成Spring组织已经放弃了这个子项目?!

另又看了一下Eclipse RCP,最近的更新是2009年8月的,也是叫人心里没有底呀!

而采用C# Winform,界面好看多了,界面控件也很丰富(MS自己的,第三方的都有很多),并且RAD开发平台是MS的绝对强项,客户端运行速度也不错,安装升级很方便,人力资源市场上应用有不少储备。但要在项目组是加入C#开发人员,对于合理组织人力资源有些不利。并且与服务端人员交流也肯定会存在问题。好在C#是Java之子,双方有太多相似的地方,交流起来难度应当没有想像得那样堪比楚河汉界。

关于运行环境方面的问题,下载一个Jre,大约15M;而下载一个.net Framework大约40M。看上去.net的运行环境比Java大得多,但是要注意,从XP Sp3以后所有windows操作系统已经在安装时集成了.net运行环境,也就是说,绝大部分用户是不用下载.net运行环境并安装的。

另外就是开发模式。在Java B/S应用开发中,一般是一个程序员从数据库、SSH到ExtJs全程贯通。好处是效率高,坏处是人员分工不明确,接口定义很随意。

在大型应用开发中,服务端与客户端的开发人员还是要分组比较好。服务端应当定义良好的接口,并且使用完备的测试用例保证其正确性与可用性。而客户端开发人员则着重于用户界面的处理,然后根据服务端的接口文档调用即可。

其实将服务端与客户端完全隔离开来也有其不利因素,就是人员交流成本会有相当程度的提高,服务端要为客户端定义明晰的接口方法,提供完备的接口文档,以方便客户端理解与调用,并且还要为自己的服务端写测试用例,以确保接口功能实现正确性。

但其有利因素也让人心动,就是提高了应用系统的模块化程度,逼迫设计人员精心划分模块、仔细设计接口,不象以前服务端(SSH)与客户端(ExtJs)都是一个人在做开发,很多本应当明确定义的接口,开发人员都只是按自己的意愿随意设计修改。同时,集成第三方应用时,也不用专门费时费力再开发接口,只是将已经设计实现的接口包装一下,加上权限等对第三方的限制条件即可。

我们公司作为一家以客户为导向的应用系统服务型公司,在技术上不应做太多、太深入研究,跟着主流和客户的要求走就没有错!现在服务端的主流是什么?Java(SSH)。客户要求客户端不用浏览器,要做成桌面应用,那现在桌面应用开发的主流是什么?C#WinForm(或者WPF)。桌面应用要求跨平台吗?不用。现在对外发布远程应用接口的主流是什么?Web Service,那我们服务端与客户端的通讯方式就只有采用Web Service。

看上去采用Java的长处很明显,短处也很明显,带来的风险也大。而C#一切都显得很中庸,但相应的风险也小。我们还是取中庸之道吧!Java Server+C# Client。

 

另外,根据同事提出的不同意见,有以下几点说明:

 

1、在网络上,开发人员公认C# Winform或者WPF的界面库肯定比Java Swing的丰富得多。可能是概率的问题,我们运气不好,正好没有找到,或者没有合适的人来进行这方面的工作;如果有可能,我们可以在下一步用WPF库(反正.net运行环境已经安装了);
2、在客户端,主要的工作是用户界面处理,这方面不会用到复杂的C#语法与语言特性,主要是对控件的使用(界面事件的响应代码占到60%以上),在这方面编程中,C#与Java在语法上的差别不是太明显,要求人员通吃两边的难度确实不大,对Java开发人员来说,主要是学习熟练使用VS界面及界面控件;
3、关于Web Service的问题,我觉得采用Json是一种选项,实际上.net中也有原生Json处理类。但采用文本方式传递对象产生很多摸名其妙的问题,例如我在服务端一个应用接口中加了一个字段,或者改了字段类型、长度,如果在客户端有几个功能都用到了这个接口,有的可能会正常使用,有的可能会报错,这样给客户端开发、调试及测试带了很多额外负担(困惑与不一致)。如果采用严格的对象接口,在调用时就会全部报错,实际上对开发工作更加有利。并且生成接口看似增加了工作量,实际上可以一次生成,多次使用,而Json格式可能会由各个客户端开发人员各自解析与理解,反而耽误时间,也更有可能出错(当然也可以写一个中间层,统一转换成对象接口,但增加了工作量及出错的可能性)。客户端Web Service接口的生成在VS中是很简单的,可能我们没有找到合适的方法吧?实际上客户端应当有专门的Web Service接口处理工作岗位来统一管理配置Web Service接口,生成桩代码、数据传输实体类及DLL接口库,并提交给其他开发人员直接调用即可,这也是分层开发的要求,不过我们现在没有设置这样的人员岗位而已,这也是我们组建结构合理的C#开发团队的要求之一。
4、因此,问题的根源还是在于人事。项目开始时,我们有成熟的Java框架,有熟练的开发人员,但在C#方面,没有成熟的框架,也没有开发人员,找了一两个新人就开始搭建如此重要的客户端技术框架,这完全是“事倍功半”的做法,但项目进度与人事安排的困难在那里,这也是没有办法的办法。如果一开始就能找到合格的C#的技术架构师,能带来成熟的框架(就象我们在Java服务端的),后面的问题都不会出现。
5、最后,值得高兴的是,现在客户端开发的最困难时期已经过去,不管架构好不好,我们的客户端框架已经建起来了,也已经开发了很多实际的应用功能,并且运行也算良好,这就是一个巨大的胜利。我相信,再过一段时间,客户端开发人员结构会日趋合理,框架也会稳定起来,好用起来,开发工作会越来越顺利。

 

 

 

 

 

 

 

0
0

我的同类文章

JAVA(7) 本人作品(20)
  • •智能客户端:C/S与B/S的融合2012-11-19阅读844
  • •在应用系统中集成文件上传下载的技术解决方案2012-06-19阅读945
  • •我的DS架构尝试过程2007-01-26阅读966
  • •关注Destktop Application Server Application2007-01-26阅读836
  • •Web Service调用轻量级安全解决方案2012-06-19阅读912
  • •关于MDA/BPM/SOA的随想2008-06-30阅读659
  • •我的JAVA开发架构设想2007-01-26阅读1363

参考知识库

img

大型网站架构知识库

1098关注|532收录

img

Java EE知识库

1120关注|581收录

img

MySQL知识库

8381关注|1396收录

img

Java SE知识库

9391关注|454收录

img

Java Web知识库

9681关注|1017收录

猜你在找
使用C#开发信息管理系统C#.NET_面向对象编程技术Java之路快速掌握JQuery视频教程零基础学HTML 5实战开发(第一季)
HTMLSwing还是XMLJava客户端工具选择三 java swing 通过hibernate连接数据库的客户端登录C#WinForm利用Web Service API查询数据库并显示到客户端C# Winform里调用系统里默认的邮件客户端C# Winform 客户端架构 调用 REST 传输 Json
查看评论
1楼 cszdm 2012-12-30 14:09发表  [回复]
刚好项目需要也遇到这个选择问题~请问楼主最后选择c#开发过程遇到过什么问题?是否可以分享一下一些开发经验。因为项目只有我一个人开发,SSH服务端+C# 从来都没有接触过C#还真不知从何下手
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStackVPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQueryBI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS UnitySplashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTCcoremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide MaemoCompuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure SolrAngular Cloud Foundry Redis Scala Django Bootstrap
  • 个人资料
 
mentat
 
    • 访问:616038次
    • 积分:9648
    • 等级: 
    • 排名:第1136名
    • 原创:291篇
    • 转载:55篇
    • 译文:3篇
    • 评论:363条
  • 文章分类
  • JAVA(8)
  • 人工智能(72)
  • 历史人文(86)
  • 攻壳机动队(51)
  • 时事军事(63)
  • 本人作品(21)
  • 编程开发(68)
  • 读书笔记(0)
  • 文章存档
  • 2013年10月(1)
  • 2012年11月(1)
  • 2012年06月(2)
  • 2012年05月(1)
  • 2012年03月(1)
展开
  • 阅读排行 
  • 电子表格使用的35种技巧(10091)
  • 《攻壳机动队》全收集(9622)
  • 自然语言处理讲义(8781)
  • 不停止计划生育,中国还在等什么?(7164)
  • 人工智能传奇——关于AI起源与发展的故事 (6366)
  • 汉族人的起源(5890)
  • 人工智能的认识论问题(4992)
  • 赵致真:我们的宇宙(4671)
  • 攻壳机动队2无罪:引文掉书袋(4420)
  • Haraway赛博宣言:二十世纪晚期的科学、技术、社会女性主义 (4048)
  • 评论排行
  • 《攻壳机动队》全收集(31)
  • 人工智能传奇——关于AI起源与发展的故事 (24)
  • 汉族人的起源(19)
  • 攻壳机动队电视版 Stand_Alone_Complex 介绍(16)
  • 不停止计划生育,中国还在等什么?(15)
  • 对人工智能研究的遐想(14)
  • 赵致真:我们的宇宙(12)
  • 攻壳机动队2:绚烂的冷酷的幻灭的(11)
  • 中国最无耻的五所大学(10)
  • 当年运10果断下马是中国民用飞机工业的福音(8)
  • 推荐文章
    • *Android官方开发文档Training系列课程中文版:网络操作之XML解析
    • *Delta - 轻量级JavaWeb框架使用文档
    • *Nginx正反向代理、负载均衡等功能实现配置
    • * 浅析ZeroMQ工作原理及其特点
    • *android源码解析(十九)-->Dialog加载绘制流程
    • *Spring Boot 实践折腾记(三):三板斧,Spring Boot下使用Mybatis
  • 最新评论
  • 对人工智能研究的遐想

    cleavcat: 是时候改变世界了……

  • Web Service调用方式的烦脑

    cszdm: 求lz给个demo!!我用webservice传递时候list总是出现问题~~lz采用什么方式实现

  • 客户端是选择Java Swing还是C# Winform

    cszdm: 刚好项目需要也遇到这个选择问题~请问楼主最后选择c#开发过程遇到过什么问题?是否可以分享一下一些开发...

  • C++程序员常用工具大全

    zhwheiying3: 我所需要的,给力

  • C语言程序运行并将结果保存到文件中

    a422100231: 恩,写的好

  • 中文信息处理 

    猿小卫:

  • 中国的国防工业科技现状令人担忧

    niujibin168: 每个人都会有自己的观点,作者的话还是有几分道理的,很好啊。。。

  • 我的JAVA开发架构设想

    TzSword: 谢谢博主 希望多写点类似的文章

  • 虚拟现实:媒体的终结者

    xiaolinzi13838: 先看下面一个实例http://www.kbonline.net/vr/WebPlayer.html

  • 欲为Java技术大牛所需的25个学习要点

    叶倾城: Oh my Lady Gaga!!!成为java大牛真不容易!!!

转载于:https://www.cnblogs.com/iOS-mt/p/5601016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记(28):Python网络编程并发编程-死锁与递归锁

立即学习:https://edu.csdn.net/course/play/24458/296445?utm_sourceblogtoedu 1.死锁(Lock()的局限性) 知识点:Lock()只能被获得(acquire)一次,要想再次获得必须释放后才能获得 1)死锁情况…

VScode 快速更改编码格式

1、view下的 Cmmand Palette 下的Change file Encoding simplifiled chinese GB2312

iostat

r/s: 每秒读取的请求数。 w/s: 每秒写入的请求数。 Avgqu-sz: 平均I/O队列长度 Await:平均每次设备I/O操作的等待时间(毫秒) Svctm:平均每次设置I/O操作的服务时间(毫秒),Svctm越接近Await则说明等待时间少 %util:表示设备的繁忙程度,80%表示设备设备已经…

学习笔记(29):Python网络编程并发编程-信号量

立即学习:https://edu.csdn.net/course/play/24458/296446?utm_sourceblogtoedu 信号量(了解):也是一把锁semaphore 1. from threading import Thread,Semaphore,currentThread import time#定义信号量(3把锁) sm Semaphore(3)def task()…

Ajax基础2

什么是服务器 网页浏览过程的分析 如何配置自己的服务器程序(AMP) 什么是Ajax 无刷新数据读取 异步,同步 Ajax基础(2) 使用Ajax 基础请求显示txt的文件 字符集编码 缓存,阻止缓存 动态数据,请求js或(json&a…

学习笔记(30):Python网络编程并发编程-Event事件

立即学习:https://edu.csdn.net/course/play/24458/296447?utm_sourceblogtoedu threading.Event事件 1.概念及功能:主要是完成线程之间的通信,将另一个线程的运行状态通知给另一个线程 2.使用场景: 1)客户端运行时等待服务器启…

vs2012 与 win7 不兼容的问题

我用的是win7 64位系统,所以安装位置那里是“C:\Program Files (x86)”,多了个(x86)。 百度搜索到园子里的师兄给的解决办法http://www.cnblogs.com/mumuliang/archive/2013/08/20/3270628.html 装这个补丁: Update for Microsoft Visual Stu…

Scrum方法论(四)

本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/1358371,如需转载请自行联系原作者

学习笔记(32):Python网络编程并发编程-线程queue

立即学习:https://edu.csdn.net/course/play/24458/296449?utm_sourceblogtoedu 线程queue 一:Queue先进先出 1.queue.Queue(n):创建一个最大容量为n的队列 2.queue.Queue(n).put():添加元素 3.queue.Queue(n).get():取元素 4.put()和get(),默认阻塞状态为True&am…

gulp配置实现修改js、css、html自动刷新

写在前面: 本配置支持es6、less、react 1.首先 给出初始的目录结构 给出执行gulp后的目录结构 给出执行gulp --p后的目录结构 2.package.json里是一个写入。文件描述了npm包的相关配置信息(作者、简介、包依赖等)和所需模块。 {"name&qu…

作为程序员之正则表达式

目录 正则表达式基础语法标准字符集合自定义的字符集合多行、单行模式高级语法选择符和分组反向引用预搜索/零宽断言例子匹配邮箱正则表达式 基础语法 标准字符集合 \D 和[^\d]意思一样,就是与 \d 相反 REG意义\ddigital表示 0 到 9 之间任意的一个数字\wworld表示任…

javascript 的dateObj.getTime() 在为C#的获取方式

publicstringGetTime() { Int64 retval 0; DateTime st newDateTime(1970, 1, 1); TimeSpan t (DateTime.Now.ToUniversalTime() -st); retval (Int64)(t.TotalMilliseconds 0.5); returnretval.ToString(); } 在Net中的实际测试代码 MSScriptControl.Scri…

Jmeter服务器监控插件使用

Jmeter服务器监控插件使用 Jmeter-Plugins支持CPU、Memory、Swap、Disk和Network的监控,在测试过程中更加方便进行结果收集和统计分析。 一、准备工作: 1、下载Jmeter-Plugins插件,下载Server端ServerAgent插件; 2、解压Jmeter-Pl…

CCNA系列课程(4)交换技术

第四节课 交换技术杜飞2009-06-28咱们今天来看一下局域网交换技术,也称为层2交换技术,内容主要包括层2交换的工作原理、网络环路、如何利用Spanning-Tree Protocol 来解决网络环路、VLAN及VTP技术,闲话少说,书归正传。我们在…

python学习之路基础篇(第八篇)

一、作业(对象的封装)     要点分析 1.封装,对象中嵌套对象 2.pickle,load,切记,一定要先导入相关的类二、上节内容回顾和补充      面向对象基本知识: 1.类和对象的…

Ubuntu实现树莓派交叉编译

一、交叉编译 在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的…

ubuntu系统安装vscode教程

方法一: 依次输入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示输入a即可 方法二: 在windows系统下载安装包&#xff0c…

Vue2 源码漫游(一)

Vue2 源码漫游(一) 描述: Vue框架中的基本原理可能大家都基本了解了,但是还没有漫游一下源码。 所以,觉得还是有必要跑一下。 由于是代码漫游,所以大部分为关键性代码,以主线路和主要分支的代码…

神经网络中的反向传播算法

神经网络中的方向传播算法讲得复杂难懂。简单地说明它的原理: 神经网络:输入层,隐藏层,输出层。根据线性关系,激活函数,并最终根据监督学习写出误差表达式。此时,误差函数可写成,那么…

有限元笔记02:第三章

1.局部坐标到全局坐标变换 2.