`
feargod
  • 浏览: 44156 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用Smack碰到若干问题的解决

阅读更多

 

前一段时间在我自己的视频会议系统中用到了smack,我想有必要小结一下。其实关于smack的介绍和使用方法,网上还是挺多的,尤其是官网上面,有很详细的文档可以查考。所以具体的使用方法,我觉得我没有必要写在这里。我需要在这里总结的是我碰到的一些问题,同时目前网上对于这些问题的处理方法还不太详细。

首先是发送消息和接收消息的监听,这里得分两种情况,一种是自己先主动发消息给别人,需要通过

chat = chatManager.createChat(buddyJID, messageListener);
chat.sendMessage(message);

 这个方法中chat会被自动添加监听。另外一种情况是被人来主动发消息,这个时候就要把监听加在ChatManager上。我在使用过程中发现使用第一种方法时有时会出现不能监听到消息的情况,但是用第二种方法就没有问题。

 

ChatManager().addChatListener(new ChatManagerListener() {
        
         @Override
         public void chatCreated(Chat chat, boolean createdLocally) {
            //这个方法中如果是之前还没有和该联系人聊天,那么
	    // createdLocally的值是false,如果已经在聊了那么是true。
            //所以如果是false,那么就要建立新的聊天,如果是true,
             //则将消息转给已经打开的窗口即可
         }
      });
 }
 

 

第二个问题是如何获得联系人列表,smack的联系人都封装在Roster类中。Roster可以有两种方式来得到联系人,一种是先得到分组的联系人。首先要得到分组列表,然后在每个组中得到联系人。

 

groups = roster.getGroups();
      LogTools.INFO("创建分组中!");
      for(RosterGroup group : groups){
         LogTools.INFO("创建了分组:"+group.getName());
         entries = group.getEntries();
         for(RosterEntry entry : entries){
            LogTools.INFO("创建了好友列表: "+entry.getUser());
         }
      }

 

 

第二种方法是直接得到联系人,不分组的。

那么直接就是

 

Collection<RosterEntry> entries = roster.getEntries();
        for(RosterEntry entry : entries){
          System.out.println("用户列表:"+entry.getName());
        }

 

 

 

其他的网上的介绍还是挺详细的。先总结这些,还在研究如何扩充smack的视频通信。以后再和大家分享。

下面是根据网上的一个具体例子,可以给大家参考。

 

import java.util.Collection;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Type;

public class XmppManager {
    
    private static final int packetReplyTimeout = 500; // millis
    
    private String server;
    private int port;
    
    private ConnectionConfiguration config;
    private XMPPConnection connection;

    private ChatManager chatManager;
    private MessageListener messageListener;
    private Chat chat;
    
    public XmppManager(String server, int port) {
        this.server = server;
        this.port = port;
    }
    
    public void init() throws XMPPException {
        
        System.out.println(String.format("Initializing connection to server %1$s port %2$d", server, port));

        SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);
        
        config = new ConnectionConfiguration(server, port,"serverName.com");
        System.out.println("连接成功:");
        config.setSASLAuthenticationEnabled(true);
        config.setSecurityMode(SecurityMode.enabled);
        System.out.println("config设置成功!");
        connection = new XMPPConnection(config);
        connection.connect();
        
        System.out.println("Connected: " + connection.isConnected());
        
        chatManager = connection.getChatManager();
        messageListener = new MyMessageListener();
    }
    
    public void performLogin(String username, String password) throws XMPPException {
    	System.out.println("连接对象的值:"+connection+"是否已经连接的判断:"+connection.isConnected());
        if (connection!=null && connection.isConnected()) {
            System.out.println("登录部分的代码执行了");
            connection.login(username, password);

        }
    }

    public void setStatus(boolean available, String status) {
        
        Presence.Type type = available? Type.available: Type.unavailable;
        Presence presence = new Presence(type);
        
        presence.setStatus(status);
        connection.sendPacket(presence);
        
    }
    
    public void destroy() {
        if (connection!=null && connection.isConnected()) {
            connection.disconnect();
        }
    }
    
    public void sendMessage(String message, String buddyJID) throws XMPPException {
        System.out.println(String.format("Sending mesage '%1$s' to user %2$s", message, buddyJID));
        chat = chatManager.createChat(buddyJID, messageListener);
        chat.sendMessage(message);
    }
    
    public void createEntry(String user, String name) throws Exception {
        System.out.println(String.format("Creating entry for buddy '%1$s' with name %2$s", user, name));
        Roster roster = connection.getRoster();
        
        roster.createEntry(user, name, null);
    }
    
    class MyMessageListener implements MessageListener {

        @Override
        public void processMessage(Chat chat, Message message) {
        	System.out.println("收到消息!");
            String from = message.getFrom();
            String body = message.getBody();
            System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
        }
        
    }
    
}
 

 

 

public class XmppTest {
    
    public static void main(String[] args) throws Exception {
        
        String username = "userName@serverName.com";
        String password = "your password";

        
        XmppManager xmppManager = new XmppManager("serverName.com", 5222);
        System.out.println("连接服务器成功!");
        xmppManager.init();
        System.out.println("初始化成功!");
        xmppManager.performLogin(username, password);
        System.out.println("登录成功!");
       
        xmppManager.setStatus(true, "Hello everyone");
        
        String buddyJID = "friend@serverName.com";
        String buddyName = "friend";
        xmppManager.createEntry(buddyJID, buddyName);
        
        xmppManager.sendMessage("Hello mate", "friend@serverName.com");
        System.out.println("发送消息成功!");
        boolean isRunning = true;
        
        while (isRunning) {
            Thread.sleep(50);
        }
        
        xmppManager.destroy();
        
    }

}
0
0
分享到:
评论
2 楼 suiu 2013-02-27  
视频研究的怎么样了?
1 楼 517913840 2012-12-15  
请问 A添加了roster.addRosterListener(new RosterListener() {
  public void presenceChanged(Presence presence) {}
} 当B上线时 Presence presence = new Presence(Type.available);
connection.sendPacket(presence);  这时A如何获取A上线了呢?  每次presence.isAvailable() 都是false  希望楼主指点

相关推荐

    Android使用smack连接ejabberd服务器注册、收发消息

    implementation 'org.igniterealtime.smack:smack-android-extensions:4.3.5' implementation 'org.igniterealtime.smack:smack-tcp:4.3.5' implementation 'org.igniterealtime.smack:smack-im:4.3.5' ...

    使用SMACK虚拟文件系统和CIPSO进行网络安全控制

    **使用SMACK虚拟文件系统和CIPSO进行网络安全控制** SMACK(Simple Mandatory Access Control Kernel)是一种强制访问控制机制,它允许系统管理员为文件、进程和网络数据包设置精细的安全标签,以增强系统的安全性...

    smack4.1.4 android 测试通过

    10. **错误处理和调试**:在开发过程中,理解并处理Smack的异常和错误信息是必要的,这可以帮助定位和修复问题。同时,Smack提供了一些调试工具和日志记录功能,帮助开发者更好地理解和调试代码。 在提供的压缩包...

    smack4.3.1

    "libs"目录包含了Smack的库文件,开发者可以将这些JAR文件添加到Android项目的依赖中,以便在项目中使用Smack的功能。通常,这些库文件包含了Smack的核心模块以及可能需要的额外模块,如XMPP连接管理、多用户聊天...

    smack android

    然而,Smack 4.1引入了对Android的原生支持,这意味着开发者可以直接使用最新的Smack库,而不用担心兼容性问题。这不仅简化了开发流程,还能确保应用能够利用Smack的所有最新特性和性能改进。Smack 4.1可能包含的...

    smack api帮助文档

    在“smack api帮助文档”中,我们可以找到关于如何使用Smack API的详细指南。这份文档通常包括以下几个部分: 1. **Javadoc**:这是Java开发者非常熟悉的文档格式,它包含了Smack API中所有类、接口、方法和常量的...

    Smack文档中文版

    学习如何利用Smack提供的工具进行问题定位,能快速解决问题,提升开发效率。 10. **实战案例**:结合实际项目,如创建一个简单的聊天应用,将理论知识与实践相结合,能更好地掌握Smack的使用。 通过阅读《Smack...

    基于xmpp_openfire_smack开发之smack类库介绍和使用

    Smack 是一个强大的开源 Java 库,专门用于处理 XMPP(可扩展消息处理和存在协议)通信。XMPP 是一种实时通信协议,广泛应用...通过深入理解和熟练使用 Smack,开发者可以构建高效、稳定且功能丰富的即时通讯解决方案。

    Smack帮助文档中文版

    Openfire是基于XMPP标准的服务器软件,常用于搭建即时通讯系统,与Smack配合使用,能构建出强大的企业级通讯解决方案。 Smack帮助文档中文版包含了Smack库的详细使用指南、API参考和常见问题解答,是开发者学习和...

    smack中文文档

    在学习过程中,你可能会遇到一些挑战,比如连接问题、权限设置、多线程使用等。这时,除了参考文档外,还可以查阅Smack的官方更新日志和社区论坛,获取最新的解决方案和最佳实践。随着对Smack和XMPP的深入理解和实践...

    smack-jar包

    "smack-jar包"正是这个库的归档文件,包含了所有必要的类和资源,供开发者在自己的项目中使用。 首先,我们需要了解什么是jar包。Java Archive (JAR) 文件是一种特殊类型的归档文件,它包含了一组Java类文件以及...

    smack_4_1_8

    这对于跟踪库的更新和解决潜在兼容性问题非常有用。 3. **libs**:这个文件夹包含了Smack库的实际Java类库文件(.jar文件)。开发者在构建项目时,需要把这些库添加到项目的类路径中,以便在代码中导入并使用Smack...

    smack 3.2.2

    Smack 3.2.2 是一个专门针对Linux...同时,Smack的详尽文档和社区支持使得开发者能够快速上手并解决遇到的问题。总之,Smack 3.2.2 是构建基于XMPP的Linux应用的强大工具,为开发者提供了高效、可靠的即时通讯功能。

    Smack帮助文档中文版和英文版

    5. **故障排查**:提供常见问题的解决方案和提示,帮助开发者解决在使用Smack过程中遇到的问题。 6. **版本更新**:记录每个新版本的改进和新增功能,有助于开发者了解升级的必要性和可能的影响。 7. **社区与支持...

    android使用smack,openfire通信

    Asmack是smack的android版,是对xmpp协议进行了封装,并提供了丰富的api,简化了操作。Openfire是一个开源的IM服务器,基于Xmpp实现。换句话说使用xmpp开发即时通讯应用的话,服务器端已经开发好了,就是openfire。

    smack_3_3_0

    9. **错误处理**:在使用Smack时,可能出现网络中断、认证失败等问题,需要正确捕获和处理`XMPPException`、`SmackException`等异常。 10. **扩展性**:Smack支持自定义协议扩展,可以通过实现`ExtensionElement`...

    smack4.1 demo androidstudio开发

    在Android Studio中使用Smack,我们可以利用其提供的API来创建连接、发送和接收消息、管理用户状态、加入聊天室等。 在"smacktest2"这个项目中,开发者可能已经实现了以下关键功能: 1. **连接服务器**:使用`...

    最新smack_4_1_6

    通过javadoc理解API,通过releasedocs了解版本更新,以及使用libs进行实际开发,开发者可以充分利用Smack的强大功能,创建出高效、稳定且功能丰富的实时通讯解决方案。无论是新手还是经验丰富的开发者,都能从中受益...

    Smack API java的类库

    Smack Android库提供了针对这些问题的解决方案。 在实际开发中,Openfire是一款流行的开源XMPP服务器,它支持多种客户端连接,包括使用Smack API的Java应用。Openfire提供了用户管理、群组管理、权限控制等一系列...

Global site tag (gtag.js) - Google Analytics