使用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();
        
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值