`
feargod
  • 浏览: 42837 次
  • 性别: 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服务器注册、收发消息

    Android使用smack连接ejabberd服务器,完成了连接、登录、创建新用户、收发消息的功能

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

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

    android使用smack,openfire通信

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

    Smack中文文档,chm格式

    Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档

    smack 源码

    smack源码

    smack4.3.1

    smack用于android移动端的开发,可以结合openfire使用,进行im通信

    smack学习笔记

    smack xmpp 即时通讯,使用smack库结合openfire实现即时通讯

    smack4.10含源码

    Smack是一个开源,易于使用的XMPP(jabber)客户端类库。 附件是目前最新版本的smack库,含源码。

    Smack中文API文档

    Smack中文API文档

    Smack API中文版

    这个是Smack API的中文版,详细介绍了smack原理,并且有几个小例子在里面

    smack api帮助文档

    smack api帮助文档官方提供的帮助工具

    smack-jar包

    该资源为smack开发使用到的jar包,请大家务必先下载到本地项目中,进行解压,导入到自己项目中的libs文件。

    smack4.1 demo androidstudio开发

    基于最新的 smack4.1 androidstudio开发demo 可以登录 已验证

    Smack API手册与文档

    1)smack api,基于smack官方javadoc制作而成,格式chm,语言english; 2)smack documentation,内容包括Overview,Getting Started Guide等等,格式chm,语言为中文(感谢fhqdddddd的奉献,本文档基于...

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

    关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利用它我们可以向openfire服务器注册用户,发送消息,并且可以通过监听器获得此用户的应答消息,以及构建聊天室,分组,个人通讯录等等。

    smack 3.2.2

    smack xmpp 3.2.2 for linux

    smack4.1.4 android 测试通过

    最新的 smack4.1.4 android开发demo 可以登录 已验证

    android_smack4.1.9-demo

    smack 在4.1.0以后支持android上使用,demo里集成了smack4.1.9在android的使用

    smack3.3.1源代码

    smack3.3.1源码 open fire开源的聊天服务器。客户端的核心xmpp协议的操作。

    smack4.3.4+spark2.8.3.zip

    Smack主要是xmpp协议的实现,提供了一套很好的api,所以下面操作xmpp都是通过使用Smack的api来实现,从4.1.0开始,它就支持Android了,所以我们直接使用Smack即可,当然在这不支持之前是使用Asmack这个包的,里面...

Global site tag (gtag.js) - Google Analytics