XMPP Pubsub问题使用smack订阅和发布

XMPP Pubsub问题使用smack订阅和发布,xmpp,smack,Xmpp,Smack,我正在尝试在我的应用程序中使用Pubsub模块,现在我正在尝试运行一些发布/订阅测试,到目前为止没有结果 在服务器端,我使用安装了pubsub的ejabberd 2.1.11(至少看起来是这样) 在客户端,我可以创建节点,但无法订阅它们。这是我的密码 XMPPConnection mycon = new XMPPTCPConnection(connectionConfiguration); mycon.connect(); mycon.login("phantom_notifier", "ph

我正在尝试在我的应用程序中使用Pubsub模块,现在我正在尝试运行一些发布/订阅测试,到目前为止没有结果

在服务器端,我使用安装了pubsub的ejabberd 2.1.11(至少看起来是这样)

在客户端,我可以创建节点,但无法订阅它们。这是我的密码

XMPPConnection mycon = new XMPPTCPConnection(connectionConfiguration);

mycon.connect();
mycon.login("phantom_notifier", "phantom_notifier");

PubSubManager mgr = new PubSubManager(mycon);
LeafNode leaf = mgr.getNode("testNode2");

leaf.addItemEventListener(new ItemEventListener()
{
    @Override
    public void handlePublishedItems(ItemPublishEvent items) {
        //TODO
    }
});
leaf.subscribe(mycon.getUser());
运行这段代码后,我总是得到以下异常

java.io.EOFException: no more data available - expected end tag </stream:stream> to close start tag <stream:stream> from line 1, parser stopped on END_TAG seen ...</x></query></iq>... @1:3734
at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3035)
at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046)
at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
at org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:279)
at org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47)
at org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81)

org.jivesoftware.smack.SmackException$NoResponseException
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:191)
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:175)
at org.jivesoftware.smackx.pubsub.PubSubManager.sendPubsubPacket(PubSubManager.java:303)
at org.jivesoftware.smackx.pubsub.Node.sendPubsubPacket(Node.java:443)
at org.jivesoftware.smackx.pubsub.Node.subscribe(Node.java:248)
at main.DBChangesReceiver.main(DBChangesReceiver.java:115)
java.io.EOFException:没有更多可用数据-期望结束标记关闭第1行的开始标记,解析器在看到结束标记时停止@1:3734
位于org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3035)
更多(MXParser.java:3046)
位于org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
位于org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
位于org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:279)
访问org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47)
位于org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81)
org.jivesoftware.smack.SmackException$NoResponseException
位于org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:191)
位于org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:175)
位于org.jivesoftware.smackx.pubsub.PubSubManager.sendPubsubPacket(PubSubManager.java:303)
位于org.jivesoftware.smackx.pubsub.Node.sendPubsubPacket(Node.java:443)
位于org.jivesoftware.smackx.pubsub.Node.subscribe(Node.java:248)
位于main.DBChangesReceiver.main(DBChangesReceiver.java:115)
无论我订阅哪个节点


另一方面,每次我试图发布消息时,我都没有收到任何错误,但检查日志时,我发现我的消息不正确。我用来发布消息的代码如下

leaf.publish(new PayloadItem<SimplePayload>("test" + System.currentTimeMillis(),
new SimplePayload("book", "pubsub:test:book",
"test book")));
leaf.publish(新的PayloadItem(“测试”+System.currentTimeMillis(),
新的SimplePayload(“book”,“pubsub:test:book”,
"测试手册),;
在调试器中,我上次发送和接收的消息如下:

<iq id="XIaTx-11" to="pubsub.myserver" type="set">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
  <publish node="testNode2">
   <item id="test1413099855673">
     <book xmlns="pubsub:test:book">text book</book>
   </item>
  </publish>
 </pubsub>
</iq>
已发送消息

<iq id="BT97r-10" to="pubsub.myserver" type="set">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
   <publish node="testNode2">
    <item id="test1413022577642">test book</item>
  </publish>
</pubsub>
<iq id="BT97r-10" to="phantom_notifier@myserver/Smack" from="pubsub.myserver" type="error">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
  <publish xmlns="http://jabber.org/protocol/pubsub">
    <item>test book</item>
  </publish>
 </pubsub>
 <error type="modify">
   <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   <invalid-payload xmlns="http://jabber.org/protocol/pubsub#errors"/>
  </error>
</iq>

测试手册

收到的信息

<iq id="BT97r-10" to="pubsub.myserver" type="set">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
   <publish node="testNode2">
    <item id="test1413022577642">test book</item>
  </publish>
</pubsub>
<iq id="BT97r-10" to="phantom_notifier@myserver/Smack" from="pubsub.myserver" type="error">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
  <publish xmlns="http://jabber.org/protocol/pubsub">
    <item>test book</item>
  </publish>
 </pubsub>
 <error type="modify">
   <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   <invalid-payload xmlns="http://jabber.org/protocol/pubsub#errors"/>
  </error>
</iq>

测试手册
现在我对无效的有效载荷一无所知,检查互联网上的文档,我看不出有什么大的区别

编辑

@Flow建议之后,发送到服务器的包如下所示:

<iq id="XIaTx-11" to="pubsub.myserver" type="set">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
  <publish node="testNode2">
   <item id="test1413099855673">
     <book xmlns="pubsub:test:book">text book</book>
   </item>
  </publish>
 </pubsub>
</iq>

教科书
服务器未发送响应,因为似乎存在一些严重错误(与我尝试订阅时的注释相同):

2014年10月12日上午9:44:15 org.jivesoftware.smack.XMPPConnection callconnection closedonErrorListener
连接因错误而关闭
java.io.EOFException:没有更多可用数据-预期结束标记关闭第1行的开始标记,解析器在看到结束标记时停止@1:3625
位于org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3035)
更多(MXParser.java:3046)
位于org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
位于org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
位于org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:279)
访问org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47)
位于org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81)
这里有ejabberd错误日志(希望有用)

=错误报告===2014-10-12 09:45:38===
**状态机终止
**最后一条消息是{route,
{jid,[],“pubsub.myserver”,[],[],
“pubsub.myserver”,[]},
{jid,“幻影通知器”,“myserver”,“Smack”,
“幻影通知程序”、“myserver”、“Smack”},
{xmlelement,“iq”,
[{“类型”,“错误”},
{“from”,“pubsub.myserver”},
{“id”,“XIaTx-11}],
[{xmlement,“pubsub”,
[{“xmlns”,”http://jabber.org/protocol/pubsub"}],
[{xmlelement,“发布”,
[{“node”,“testNode2”}],
[{xmlelement,“项”,
[{“id”,“test1413099855673}],
[{xmlement,“book”,
[{“xmlns”,“pubsub:test:book”}],
[{xmlcata,}]}]}]},
{已中止,没有_事务}]}
**当State==会话_建立时
**数据=={state,
{socket_state,gen_tcp,#Port,},
ejabberd#u插座,#Ref,false,“2115632325”,
{sasl_state,“jabber”,“myserver”,“[],
#有趣,
#有趣,
#有趣,cyrsasl_digest,
{国家,5,“3654209317”,“幻影通知者”[],
#有趣,
#有趣,
ejabberd_auth_internal,“myserver”},
c2s,c2s_整形器,假,真,假,假,
[verify_none,{certfile,“/etc/ejabberd/ejabberd.pem}],
是的,
{jid,“幻影通知器”,“myserver”,“Smack”,
“幻影通知程序”、“myserver”、“Smack”},
“幻影通知程序”、“myserver5”、“Smack”,
{{1413,99937,977476},},
{pres_t,1},
{pres_f,1},
{pres_a,1},
{pres_i,0},
{xmlelement,“存在”,
[{“id”,“XIaTx-9”}],
[{xmlelement,“状态”,[],
[{xmlcata,}]},
{xmlelement,“优先级”、[]、[{xmlcdata、}]},
未定义,
{{2014,10,12},{7,45,37}},
假,,
{userlist,none,[],false},
c2s,ejabberd_auth_internal,
{{84,125,131,61},56127},
[]}
**终止的理由
"test book"
"<book xmlns='pubsub:test:book'>text book</book>"