代码之家  ›  专栏  ›  技术社区  ›  Jordan Sitkin

尝试使用smackx pubsub获取节点时未找到项(404)

  •  3
  • Jordan Sitkin  · 技术社区  · 16 年前

    我正在尝试使用最新的smackx主干来获取并订阅pubsub节点。但是,OpenFire只是向我发送一个返回错误:找不到项(404)。

    我正在从CaldFielf实例化Java对象,所以我的代码片段看起来很有趣,但也许有人能告诉我我忘记了什么。

    以下是创建节点的方法:

        ftype = createObject("java", "org.jivesoftware.smackx.pubsub.FormType");
        cform = createObject("java", "org.jivesoftware.smackx.pubsub.ConfigureForm").init(ftype.submit);
        cform.setPersistentItems(true);
        cform.setDeliverPayloads(true);
        caccess = createObject("java", "org.jivesoftware.smackx.pubsub.AccessModel");
        cform.setAccessModel(caccess.open);
        cpublish = createObject("java", "org.jivesoftware.smackx.pubsub.PublishModel");
        cform.setPublishModel(cpublish.open);
        cform.setMaxItems(99);
    
        manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection);
    
        myNode = manager.createNode("subber", cform);
    

    下面是我尝试的方法(在代码的另一部分中):

        manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection);
        myNode = manager.getNode("subber");
    

    立即 创建 我似乎可以像这样向它发布节点:

        payload = createObject("java", "org.jivesoftware.smackx.pubsub.SimplePayload").init("book","pubsub:test:book","<book xmlns='pubsub:test:book'><title>Lord of the Rings</title></book>");
        item = createObject("java", "org.jivesoftware.smackx.pubsub.Item").init(payload);
        myNode.publish(item);
    

    但是,正是getnode()调用导致代码出错。

    我通过检查OpenFire服务器使用的数据库来验证节点是否正在创建。我可以在那里看到它们,它们被正确地归类为叶节点等。

    有什么建议吗? 还有其他人对XMPP和ColdFusion做过什么吗? 我已经成功地通过CF发送和接收消息,而Smack还没有让Pubsub工作:)

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  3
  •   Jordan Sitkin    16 年前

    回答如下:

    PubSubManager类上的第二个方法接受两个参数,一个连接和一个 参数。显然,明火需要这个 参数,经过一些实验,我发现它可以使用pubsub.your.xmpp.address工作。

    manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection,"pubsub.127.0.0.1");
    
        2
  •  0
  •   Lemontree    8 年前

    也许这个例子可以作为你的参考。

     public void login(String Ip,String username,String passwaord)
         {
             try 
             {
                connConfig = new AndroidConnectionConfiguration(Ip, 5222);
                connection = new XMPPConnection(connConfig);
                connection.connect();  
                connection.login(username, passwaord);
                pubSubAddress = "pubsub."+ connection.getServiceName();
                manager = new PubSubManager(connection,pubSubAddress);
                Log.i("MyError","connection success");  
             }
             catch (XMPPException e) 
             {
                 Log.i("MyError","connection failed");      
                 e.printStackTrace();
             }
    
         }
    
        3
  •  0
  •   Z. Mei    8 年前

    规范化示例如下所示:

    发布节点:

    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smackx.pubsub.LeafNode;
    import org.jivesoftware.smackx.pubsub.PayloadItem;
    import org.jivesoftware.smackx.pubsub.PubSubManager;
    import org.jivesoftware.smackx.pubsub.SimplePayload;
    
    public class XmppPubsub_Publisher {
        private static XMPPConnection connection = new XMPPConnection("think");
        private static String USRE_NAME = "test1";
        private static String PASSWORD = "1";
        static{
            try {
                connection.connect();
                connection.login(USRE_NAME,PASSWORD);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args)throws Exception{
            try{
                PubSubManager manager = new PubSubManager(connection);
                String nodeId = "test2";
                LeafNode myNode = null;
                try {
                    myNode = manager.getNode(nodeId);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if(myNode == null){
                    myNode = manager.createNode(nodeId);
                }
                String msg = "fsadfasdfsadfasdfd---";
                SimplePayload payload = new SimplePayload("message","pubsub:test:message", "<message xmlns='pubsub:test:message'><body>"+msg+"</body></message>");
                PayloadItem<SimplePayload> item = new PayloadItem<SimplePayload>("5", payload);
                myNode.publish(item);
                System.out.println("-----publish-----------");
            }
            catch(Exception E)
            {E.printStackTrace();}
        }
    }
    

    检索节点:

    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smackx.pubsub.ItemPublishEvent;
    import org.jivesoftware.smackx.pubsub.Node;
    import org.jivesoftware.smackx.pubsub.PayloadItem;
    import org.jivesoftware.smackx.pubsub.PubSubManager;
    import org.jivesoftware.smackx.pubsub.listener.ItemEventListener;
    
    public class XmppPubsub_Reciever {
        private static XMPPConnection connection = new XMPPConnection("think");
        private static String USRE_NAME = "test1";
        private static String PASSWORD = "1";
        static {
            try {
                connection.connect();
                connection.login(USRE_NAME, PASSWORD);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) throws Exception {
            String nodeId = "test2";
            PubSubManager manager = new PubSubManager(connection);
            Node eventNode = manager.getNode(nodeId);
            eventNode.addItemEventListener(new ItemEventListener<PayloadItem>() {
                public void handlePublishedItems(ItemPublishEvent evt) {
                    for (Object obj : evt.getItems()) {
                        PayloadItem item = (PayloadItem) obj;
                        System.out.println("--:Payload=" + item.getPayload().toString());
                    }
                }
            });
            eventNode.subscribe(connection.getUser());
            while(true);
        }
    }