spark smack openfire 讲解


Spark/Smack/Spark/Smack/ OpenfireOpenfire OverviewOverview 简介简介简介简介简介简介简介简介 •• SparkSpark 是一个开源,跨平台是一个开源,跨平台IMIM--XMPPXMPP 协议客协议客 户端。它的特性支持集组聊天,电话集成户端。它的特性支持集组聊天,电话集成 和强大安全性能。和强大安全性能。Openfire+SparkOpenfire+Spark 是是Jive Jive SoftwareSoftware 官方推荐的最佳的组合。官方推荐的最佳的组合。 •• 基于基于jre6jre6 ,swing(,swing( 部分使用部分使用swingxswingx ) ) 程序启动过程程序启动过程程序启动过程程序启动过程程序启动过程程序启动过程程序启动过程程序启动过程--launchlaunch Startup.start unpackArchives Unpack the plugin and library(all end with “.pack ”) in the Plugins and lib directory Create a instance of spark and invoke its startup method get “User.home” from the System property as the runtime directory Load “Spark.properties ”as the user settings Locale,auto login,etc. add the resource directory to property “java.library.path” Create a new spark instance?? 启动启动启动启动启动启动启动启动--loginlogin 启动启动启动启动启动启动启动启动--buildworkspacebuildworkspace 启动启动启动启动启动启动启动启动--contactlistcontactlist ---- pluginplugin buildContactList showEmptyGroups showOfflineUsers SparkManager.getWorkspace ().loadPlugins() Load base plugin (gatewayPlugin ) (transcriptPlugin ) (broadcastPlugin ) (bookmarkPlugin ) They are in classpath Invoke in Workspace loadInternalPlugins Load t he META-INF/plugins.xmlin the classpath loadPublicPlugins Load from ${sparkfolder}/Plugins Load each plugin.xml Invoke in PluginManager Load plugin by get the parameter: System.getProperty ("plugin") addSubscriptionListener Here will add the Presence listener Add presence and message listeners ,listen for these to force open a 1-1 peer chat window from other operators if One isn't already open SparkManager.getSessionManager ().getConnection().addPacketListener (this , workspaceMessageFilter); PluginPlugin •• 工程结构:工程结构: PluginPlugin 安装安装安装安装安装安装安装安装 class plugin 玦 n t e rf a c e , P lu g in + canShutDown() : boolean + initialize() : void + shutdown() : void + uninstall() : void UIUI 结构结构结构结构结构结构结构结构 ChatArea ManagerManager •• SparkManagerSparkManager –– 获得其它获得其它managermanager class spark EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version SparkManager {leaf} + DATE_SECOND_FORMATTER: SimpleDateFormat = new SimpleDateF... {readOnly} + addFeature(String) : void + getApplicationImage() : ImageIcon + getChatManager() : ChatManager + getClipboard() : String + getConnection() : XMPPConnection + getContactList() : ContactList + getFocusedComponent() : Component + getMainWindow() : MainWindow + getMessageEventManager() : MessageEventManager + getNativeManager() : NativeManager + getPreferenceManager() : PreferenceManager + getSearchManager() : SearchManager + getSessionManager() : SessionManager + getSoundManager() : SoundManager + getTransferManager() : SparkTransferManager + getUserDirectory() : File + getUserManager() : UserManager + getVCardManager() : VCardManager + getWorkspace() : Workspace + printChatRoomTranscript(ChatRoom) : void + printChatTranscript(TranscriptWindow) : void + removeFeature(String) : void + setClipboard(String) : void •• ChatManagerChatManager 负责负责chatchat 事件监听的注册和事件监听的注册和 chatroomUIchatroomUI 的相关等的相关等 class spark EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version EA 7.5 Unregistered Trial Version ChatManager + COLORS: Color ([]) = {Color.red, Col... + ERROR_COLOR: Color = (Color)UIManage... + FROM_COLOR: Color = (Color)UIManage... + NOTIFICATION_COLOR: Color = (Color)UIManage... + TO_COLOR: Color = (Color)UIManage... + activateChat(String, String) : void + addChatRoomListener(ChatRoomListener) : void + addContactItemHandler(ContactItemHandler) : void + addGlobalMessageListener(GlobalMessageListener) : void + addInvitationListener(RoomInvitationListener) : void + addMessageFilter(MessageFilter) : void + addSparkTabHandler(SparkTabHandler) : void + addTranscriptWindowInterceptor(TranscriptWindowInterceptor) : void + addTypingNotification(ChatRoom) : void + cancelledNotification(String, String) : void + chatRoomExists(String) : boolean + composingNotification(String, String) : void + containsTypingNotification(ChatRoom) : boolean + createChatRoom(String, String, String) : ChatRoom + createConferenceRoom(String, String) : ChatRoom + deliveredNotification(String, String) : void + displayedNotification(String, String) : void + filterIncomingMessage(ChatRoom, Message) : void + filterOutgoingMessage(ChatRoom, Message) : void + fireContactItemDoubleClicked(ContactItem) : boolean + fireContactItemPresenceChanged(ContactItem, Presence) : boolean + fireGlobalMessageReceievedListeners(ChatRoom, Message) : void + fireGlobalMessageSentListeners(ChatRoom, Message) : void + getChatContainer() : ChatContainer + getChatRoom(String) : ChatRoom + getDefaultConferenceService() : String + getGroupChat(String) : GroupChatRoom + getIconForContactHandler(String) : Icon + getInstance() : ChatManager + getInvitationListeners() : Collection + getMessageFilters() : Collection + getSelectedContactItems() : Collection + getTabIconForContactHandler(Presence) : Icon + getTranscriptWindowInterceptors() : Collection + handleURIMapping(String) : void + isStaleRoom(ChatRoom) : boolean + notifySparkTabHandlers(Component) : void + offlineNotification(String, String) : void + removeChat(ChatRoom) : void + removeChatRoomListener(ChatRoomListener) : void + removeContactItemHandler(ContactItemHandler) : void + removeGlobalMessageListener(GlobalMessageListener) : void + removeInvitationListener(RoomInvitationListener) : void + removeMessageFilter(MessageFilter) : void + removeSparkTabHandler(SparkTabHandler) : void + removeTranscriptWindowInterceptor(TranscriptWindowInterceptor) : void + removeTypingNotification(ChatRoom) : void -singleton •• SessionManagerSessionManager sparkspark 会话信息,例如,连接会话信息,例如,连接 的主机,用户在线状态等的主机,用户在线状态等。。 class spark SessionManager {leaf} + addPresenceListener(PresenceListener) : void + changePresence(Presence) : void + connectionClosed() : void + connectionClosedOnError(Exception) : void + getBareAddress() : String + getConnection() : XMPPConnection + getDiscoveredItems() : DiscoverItems + getPassword() : String + getPersonalDataManager() : PrivateDataManager + getServerAddress() : String + getUsername() : String + initializeSession(XMPPConnection, String, String) : void + reconnectingIn(int) : void + reconnectionFailed(Exception) : void + reconnectionSuccessful() : void + removePresenceListener(PresenceListener) : void + SessionManager() + setConnection(XMPPConnection) : void + setServerAddress(String) : void ChatRoomListener (and ChatRoomListenerAdapter) – 允许plugin 去监听的chatroom 事件,例如 创建,关闭,活动。 MessageListener – 监听消息的发送接收事件。 ContactGroupListener – 组的信息变化事件。 ContactListListener – 联系人信息变化事件。 TransferListener – 文件传输事件。 ContextMenuListener –右键菜单事件。 PresenceListener –出席状态改变事件。 ContactItemHandler –允许plugin 改变contatitem 行为。 MainWindow – 主界面 class jivesoftware ChatFrame ActionListener MainWindow {leaf} + actionPerformed(ActionEvent) : void + addMainWindowListener(MainWindowListener) : void + closeConnectionAndInvoke(String) : void + getInstance() : MainWindow + getMenu() : JMenuBar + getMenuByName(String) : JMenu + getSplitPane() : JSplitPane + getTopToolBar() : JToolBar + isDocked() : boolean + isInFocus() : boolean + logout(boolean) : void + removeMainWindowListener(MainWindowListener) : void + saveLayout() : void + shutdown() : void -singleton •• ChatRoomChatRoom –– 聊天室由聊天室由ChatRoomImplChatRoomImpl and and GroupChatRoomGroupChatRoom ..实现。实现。 class ui BackgroundPanel ActionListener DocumentListener FocusListener C ha tRo om + actionPerformed(ActionEvent) : void + addClosingListener(ChatRoomClosingListener) : void + addFileDropListener(FileDropListener) : void + addMessageListener(M essageListener) : void + addPacketID(String) : void + addToTranscript(Message, boolean) : void + addToTranscript(String, String, String, Date) : vo i d + changedUpdate(DocumentEvent) : void + clearUnreadMessageCount() : void + closeChatRoom() : void + connectionClosed() : void + connectionClosedOnError(Exception) : void + disableToolbar() : void + enableToolbar() : void + fireFileDropListeners(Collection) : void + focusGained(FocusEvent) : void + focusLost(FocusEvent) : void + getBottomPanel() : JPanel + getChatInputEditor() : ChatInputEditor + getChatPanel() : JPanel + getChatRoom() : ChatRoom + getChatType() : Message.Type + getChatWindowPanel() : JPanel + getEditorBar() : JPanel + getLastActivity() : long + getNickname() : String + getNotificationLabel() : JLabel + getRoomname() : String + getRoomTitle() : String + getScrollPaneForTranscriptWindow() : JScrollPane + getSendButton() : JButton + getSendFieldToolbar() : JPanel + getSplitPane() : JSplitPane + getTabIcon() : Icon + getTabTitle() : String + getToolBar() : ChatToolBar + getTranscripts() : List + getTranscriptWindow() : TranscriptWindow + getUnreadMessageCount() : int + getVerticalSlipPane() : JSplitPane + handleDefaultAction(MouseEvent) : boolean + increaseUnreadMessageCount() : void + insertM essage(M essage) : void + insertUpdate(DocumentEvent) : void + isActive() : boolean + leaveChatRoom() : void + packetIDExists(String) : boolean + poppingDown(JPopupMenu) : void + poppingUp(Object, JPopupMenu) : void + positionCursor() : void + processPacket(Packet) : void + reconnectingIn(int) : void + reconnectionFailed(Exception) : void + reconnectionSuccessful() : void + removeClosingListener(ChatRoomClosingListener) : v o i d + removeFileDropListener(FileDropListener) : void + removeM essageListener(MessageListener) : void + removeUpdate(DocumentEvent) : void + saveTranscript() : void + scrollToBottom() : void + sendMessage(Message) : void •• ChatAreaChatArea –– chatroomchatroom 的编辑控件和显示控件的编辑控件和显示控件 class ui JTextPane MouseListener MouseMotionListener ActionListener ChatArea + DEFAULT_CURSOR: Cursor = new Cursor(Curs... {readOnly} + HAND_CURSOR: Cursor = new Cursor(Curs... {readOnly} + styles: SimpleAttributeSet = new SimpleAttri... {readOnly} + actionPerformed(ActionEvent) : void + addContextMenuListener(ContextMenuListener) : void + addLinkInterceptor(LinkInterceptor) : void + ChatArea() + clear() : void + fireLinkInterceptors(MouseEvent, String) : boolean + getForceEmoticons() : Boolean + getMarkup() : String + insert(String) : void + insertAddress(String) : void + insertImage(String) : boolean + insertLink(String) : void + insertText(String) : void + insertText(String, Color) : void + mouseClicked(MouseEvent) : void + mouseDragged(MouseEvent) : void + mouseEntered(MouseEvent) : void + mouseExited(MouseEvent) : void + mouseMoved(MouseEvent) : void + mousePressed(MouseEvent) : void + mouseReleased(MouseEvent) : void + removeContextMenuListener(ContextMenuListener) : void + removeLinkInterceptor(LinkInterceptor) : void + setBold() : void + setFont(String) : void + setFontSize(int) : void + setForceEmoticons(Boolean) : void + setItalics() : void + setText(String) : void + setUnderlined() : void Smack overviewSmack overview •• 使用使用smacksmack 进行进行xmppxmpp 协议上的通讯协议上的通讯 •• 连接:连接: •• XMPPConnectionXMPPConnection conn1 = new conn1 = new XMPPConnection("jabber.orgXMPPConnection("jabber.org ");"); •• conn1.connect();conn1.connect(); •• // Create a connection to the // Create a connection to the jabber.orgjabber.org server on a specific port.server on a specific port. •• ConnectionConfigurationConnectionConfiguration configconfig = new = new ConnectionConfiguration("jabber.orgConnectionConfiguration("jabber.org ", 5222);", 5222); •• XMPPConnectionXMPPConnection conn2 = new conn2 = new XMPPConnection(configXMPPConnection(config );); •• conn2.connect();conn2.connect(); 出席出席出席出席((((在线在线在线在线))))状态状态状态状态出席出席出席出席((((在线在线在线在线))))状态状态状态状态 •• RosterRoster :跟踪用户的在线状态:跟踪用户的在线状态 接收接收接收接收接收接收接收接收//监听消息监听消息监听消息监听消息监听消息监听消息监听消息监听消息 发送消息发送消息发送消息发送消息发送消息发送消息发送消息发送消息 •• XMPPConnection.sendPacket(messageXMPPConnection.sendPacket(message );); 语音视频支持语音视频支持语音视频支持语音视频支持语音视频支持语音视频支持语音视频支持语音视频支持 JingleJingle 扩展框架扩展框架扩展框架扩展框架扩展框架扩展框架扩展框架扩展框架 •• JingleJingle 是是XMPPXMPP 协议上的扩展协议,它着手解协议上的扩展协议,它着手解 决在决在XMPPXMPP 协议框架下的点对点的连接问协议框架下的点对点的连接问 题,也即题,也即P2PP2P 连接。在连接。在JingleJingle 框架下,即使用框架下,即使用 户在防火墙或是户在防火墙或是NATNAT 网络保护之下,也能网络保护之下,也能 够建立连接,从而提供文件传送、视频、够建立连接,从而提供文件传送、视频、 音频服务等等。音频服务等等。 目前代码编译的目前代码编译的jinglepluginjingleplugin 语音效果不太好。语音效果不太好。 •• SIPSIP 插件,需要模拟电话交换台插件,需要模拟电话交换台 ,常用的,常用的 asterisk,asterisk, 配置比较复杂,涉及较多语音相关配置比较复杂,涉及较多语音相关 知识,概念也不太清楚,还没有配置成功。知识,概念也不太清楚,还没有配置成功。 •• 这两个协议都支持视频,但是都没有很好这两个协议都支持视频,但是都没有很好 的实现。的实现。 OpenfireOpenfire OverviewOverview •• OpenfireOpenfire (原来的(原来的WildfireWildfire )是一个跨平台,)是一个跨平台, 采用采用JavaJava 开发,开源的实时协作(开发,开源的实时协作(RTCRTC)服)服 务器基于务器基于XMPPXMPP((JabberJabber )协议。)协议。OpenfireOpenfire 安安 装和使用都非常简单,并利用装和使用都非常简单,并利用WebWeb 进行管理。进行管理。 单台服务器可支持上万并发用户。单台服务器可支持上万并发用户。 z2 幻灯片 幻灯片 幻灯片 幻灯片 25252525 z2 z2 z2 z2 开源 XMPP 服务器 Openfire ,其官方站点在一篇题为“ Scalability : Turn it to Eleven ”的 Blog 中声称在改用 Mina 作为其网络 I/O 框架后,性能提升了 11 倍之多。具体的数据有两个版本,皆令人印象深刻,分别是: 1.单机单 JVM 同时支持 17 ,000 在线 XMPP 客户端。 2.在启用了单个 Connection Manager 的情况下,可同时支持多达 33 ,000 个在线 XMPP 客户端 解释一下:目前看来,这篇 Blog 发表于 2006 年 12 月 19 日,并且在发表之后至少有过一次更新,我所见到的第一个版本的原文目前已 无法考证,因此第一个版本的数据是我凭记忆写下来的,可能与原文有所出入。在更新后的版本中,原数据被更新为添加了 connection manager 支持后的评测数据。原文如下: So far we’ve hit 33k concurrent users with a single connection manager, running on a (old) Sun 280R server. CPU usage in the connection manager and core Wildfire server both hovered around 7% each. Those numbers are a pretty huge improvement over the previous version of Wildfire, which was barely able to hit 7500 concurrent users with maxed out CPU and memory usage. We’re also only part way through the optimization process. The goal for the 3.2 release is to demonstrate 100k concurrent users on a single domain. 解释一下,所谓的 connection manager ,是一种作用类似于整流器的服务器,大致的作用就是将外部的海量客户端发起的 TCP 连接汇总为 少数的连至后台业务逻辑服务器的 TCP 长连接,从而使后台业务逻辑服务器能够处于较为稳定的网络环境并专注于业务逻辑处理。因此使用 connection manager 这样的整流服务器确实可以提高单台业务逻辑服务器所能够承受的并发客户端数目。 不过 Openfire 团队在这里却有些含糊其辞: 首先,尽管自打一开始在 Blog 的评论中就有人希望 Openfire 团队公开具体的运行环境和配置以帮助调校自己的服务器性能,但看起来 Openfire 团队并没有打算将之公布。于是,从实验验证的角度上看,他人难以重现,从而也就难以验证这组数据。 其次,在第二版的数据中, Openfire 团队声称只是用一个 connection manager 便轻松达到了支持 33 k 并发用户的性能,这是很可疑的。 诚然,上文解释过 connection manager 的整流作用确实可以提高整个集群的并发支持能力,但一般而言,这是在多台 connection manager 对应一台业务逻辑服务器的情况下达到的。如果只使用单个 connection manager 实例,那么实际上跟没有使用差不了多少,因为集群的并 发性能仍然受制于这单个 connection manager 所能承受的最高并发用户数。换言之,产生第二版数据的测试环境上的那个 connection manager 应该独立承担这 33 k 个并发用户。然而,截至本文发文时止,从 Openfire 官方站点来看,当前与 Openfire 配套使用的 Connection Manager 的并发性能似乎与这个期望值仍有较大差距,摘录官方站点原文如下: Each connection manager should handle at least five thousand concurrent users. Experimental support for non-blocking connections is under development, which will greatly increase the number of connections that each connection manager module can support. 可见,这里只说每个 connection manager 至少可以支撑 5k 个并发用户,与我们的期望值 33 k 差的还是蛮远。不知是不是 Openfire 团队 雪藏了什么能够大幅提高 Openfire 服务器集群性能的秘密武器呢? zhouka, 2009-6-11 •• 安装管理简单功能强大,支持安装管理简单功能强大,支持 pluginplugin 和和gatewaygateway 整合。整合。 •• 安装非常方便,安装非常方便,step by stepstep by step ,支持,支持 内嵌数据库和外部数据库,在安内嵌数据库和外部数据库,在安 装时选择。装时选择。 目录结构目录结构目录结构目录结构目录结构目录结构目录结构目录结构 实际配置实际配置::openfire.xmlopenfire.xml available-plugins.xml 管理界面管理界面管理界面管理界面::::管理界面管理界面管理界面管理界面:::: Many Many pluginplugin SparkSpark ------------------------ openfireopenfire howdyhowdy End and 3KSEnd and 3KS
还剩35页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

344724999

贡献于2012-06-12

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf