中南大学学士论文 基于JAVA的企业级即时通信平台设计与实现
2.2.5 Swing美工技术
Java 基础类(JFC)Swing 工具提供了使用Java 平台创建高度可交互性图形用户界面的类。Swing 是高度灵活的,但是也因此相当复杂,虽然新手能够使用Swing 创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI 界面,你必须理解Swing 的体系架构的基础,尤其是使用Swing 创建复杂、像JTable 、JTree、JComboBox 以及JList 这样基于渲染器的组件,Swing 提供的基于模型和渲染器的组件是构建高性能、可扩展GUI 的关键。 1.Swing 体系结构
最初Smalltalk 系统的UI 工具使用所谓的模型-视图-控制(MVC)模式,MVC 引入这样一个概念:数据源应该同屏幕展现分开。这是一个优秀的体系设计结构,能促进代码重用和程序框架。Swing 使用的是一个变体的MVC 架构,如图2-7所示:
图2-7 Swing的MVC结构 图2-8 带渲染器的Swing MVC结构
典型的Swing GUI 组件包括至少三个对象:一个Component,一个Model 和一个UI Delegate,在这个框架中,Model 负责存储数据,UI Delegate 负责从Model 获取数据并渲染到屏幕上去,Component 通常协调Model 和Delegate 之间的操作,并同时负责将Swing 嵌入到AWT 窗口系统中[12]。
注意,UI Delegate 对象可以在运行的时候动态替换,这就使Swing 具备了可插拔的外观(Pluggable Look-And-Feel, PLAF)。
虽然Swing 的MVC 结构显然具备灵活性的好处,但是这个结构通常被指责为一些程序慢的根源。虽然基于MVC 结构需要更多的方法调用来支持额外的重定向,其实花费在这儿的消耗很小。对基于Swing 的应用程序profile 的结果显示,model-view 分隔的开销可以忽略不计,不到CPU 总开销的1%,复杂的Swing 用户界面的多数处理事件其实都花费在了底层的图形操作上了[12]。Swing 的model-vie w 结构并不是低性能的根源,它是构建可扩展程序的关键。
Swing还提供了一些处理大数据量数据集的组件,包括JTable、JTree、JList 以及JComboBox。这些矢量组件被设计成能够处理成千上万甚至数百万的数据,为了避免占用大量内存,这些组件在Swing 的体系架构增加了渲染器(renderer)概念。下图(图2-8)是增加了渲染器结构的Swing 体系架构。在客户端的有某些界面用了倒影效果、透明化效果、重绘组建技术。下面我分别把这几个技巧详细说下。在服务器个客户端详细设计时就不多说了。
13
中南大学学士论文 基于JAVA的企业级即时通信平台设计与实现
2. Swing 透明和重绘技术
①Swing透明化
透明化在java中其实就是在窗体构造函数中增加一行代码,代码如下:
WindowUtils.setWindowAlpha(JFrame frame, float value)其中value就是对应的透明度,value值越小窗体就越透明。WindowUtils是JDK提供的窗体界面工具类。想了解WindowUtils可以去查看JDK的API,API中有很详细的介绍,
②Swing重绘
重绘窗体在做软件中是件必然的事情,想让你的软件漂亮并且是自己想象中的外型就非得用到窗体重绘技术。在我了解的java中窗体重绘可以有两种方法。
第一种是调用实现RectangularShape抽象类的工具类来绘制自己想要的形状,在JDK中 有Arc2D 、Ellipse2D 、Rectangle2D 、RoundRectangle2D实现了这个抽象类,本文介绍下RoundRectangle2D的实现过程。
RoundRectangle2D实现重绘过程如图2-9。
创建一个窗口创建RoundRectangle2D设置参数这个过程设置你想要的一些参数使用WindowUtils组装
如图2-9 RoundRectangle2D重绘
第二种是重写组件的paintComponent方法,在此方法中使用Graphics2D的绘制方法重绘组件。 3. Swing 倒影技术
首先Swing倒影技术是由Romain Guy和Chet Haase所创立的,我只是在本文中简单介绍下。非本人所创。首先看看我写的一个窗口如图2-9。
图2-9 Swing 倒影
14
中南大学学士论文 基于JAVA的企业级即时通信平台设计与实现
图2-10 倒影创建序列图
从图2-9的表面分析,上面是个窗口(主窗口),下面也是个窗口,只是下面窗口是透明倒立的。其主要流程为:在主窗口创建时同时也把倒影窗口也创建,最后利用工具类把这两个窗口绑定。工具类是把倒影窗口加在主窗口的下方。倒影创建序列图如图2-10 。
15
中南大学学士论文 基于JAVA的企业级即时通信平台设计与实现
第三章 EIM系统通信协议设计
每个IM都有其核心的通信协议,本EIM系统也定义了一组协议栈,规定了服务器与客户端的通信接口。此系统模拟腾讯QQ实现用户之间简单聊天的程序,其中涉及到图形界面的的设计,网络通信的实现,线程的应用等等。启动服务端后,用户点击登陆实现与服务端的连接,同时向服务器发送登陆消息包,服务器接收到一个用户消息包则启动一个客户线程,将当前用户加入到线程中。用户进入主界面便可通过服务端给在线好友发送消息、传送文件、创建好友分组等简单互操作。这些交互都是建立在通信协议的基础上,本章主要介绍该系统的通信协议。
3.1 EIM系统网络结构
如图3-1所示,服务器是客户之间的中介实体,它接受客服端A发送来的消息,对其进行处理并返回应答消息,根据EIM用户01的要求,转发给目的EIM用户04。服务器的核心任务就是解析收的消息,然后根据业务逻辑作相应的处理,再简洁点就是解析,处理,转发消息。而客户机就是个“消息解析器”,例如众所周知的浏览器就是解析Http协议的“消息解析器”。而本系统的客户机就是EIM协议的解析器。
图3-1通信网络结构
3.2 EIM系统通信协议分析 3.2.1现行常用即时通信协议
目前,多数IM软件都是采用IM服务提供商自己设计开发的IM协议,如美国在线的OSCAR协议、微软的MSNP协议等[6]。目前,IM通用标准的协议主要有三个[13-14]:
①即时消息在线协议(Instant Messaging and Presence Protocol,IMPP),由IETF(互联网工程任务组)的IMPP工作组制定;
②可扩展的即时消息在线会话初始协议(SIP for Instant Messaging and
16
中南大学学士论文 基于JAVA的企业级即时通信平台设计与实现
Presence Leverage Extension,SIMPLE),由IETF的SIMPLE工作组制定,是对SIP协议的扩展;
③可扩展消息在线协议(Extensible Messaging and Presence Protocol,XMPP),由IETF的XMPP工作组制定。XMPP用XML(可扩展标记语言)语言定义和描述协议中的命令和数据,充分利用XML通用性强、易扩展的优点,方便了协议在应用中的扩展。
3.2.2 EIM通信协议分析
本通信协议就基于TCP/IP协议的,是面向连接的。如下图3-2所示。关于TCP/IP的相关知识在第二章的相关技术介绍中有详细说明。
图3-2 EIM通信协议 图3-3 交互过程
交互过程和网络上的其它协议一样都是一个消息对应一个相应响应消息。其过程如下图3-3。 3.3 EIM系统协议设计 3.3.1 消息结构设计
所有消息包的数据都是由byte组成,可分为整型和定长字符串两种。定长字符串部分的byte可被编码为字符串。消息结构的组成:所有消息结构都是由两部分组成,即消息头(header)+消息体(body)组成,如表3-1所示。
表3-1消息结构 组成成分 Header Body 说明 消息头,所有消息都是相同格式 消息体,不同消息格式不同
消息头的格式是固定的,所有消息都必须得有相同格式的消息头,其格式如下表3-2:
17