我想使用Pubsub模塊進入我的應用程序,現在我正在嘗試運行一些發佈/訂閱測試,目前爲止沒有結果。XMPP Pubsub問題訂閱和發佈使用smack
在我使用ejabberd 2.1.11與發佈訂閱服務器端安裝(或至少這就是它似乎)
mod_pubsub_odbc: [{access_createnode, pubsub_createnode},
{pep_sendlast_offline, false},
{last_item_cache, false},
{plugins, ["flat", "hometree", "pep"]}]
在客戶端的我已經能夠創建節點,但我不能夠訂閱他們。這裏是我的代碼
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)
不管我什麼訂閱節點...
在另一邊每次我試圖發佈消息,我收到沒有錯誤,但檢查日誌,我看到我的消息是不正確的。我用它來發布消息的代碼如下
leaf.publish(new PayloadItem<SimplePayload>("test" + System.currentTimeMillis(),
new SimplePayload("book", "pubsub:test:book",
"test book")));
在調試器中我最後發送和接收消息如下:
發送消息
<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="[email protected]/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>
服務器,因爲它似乎有一些嚴重的錯誤不發送響應(同評論道,當我嘗試訂閱):
oct 12, 2014 9:44:15 AM org.jivesoftware.smack.XMPPConnection callConnectionClosedOnErrorListener
Connection closed with error
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:3625
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)
在這裏,我有ejabberd錯誤日誌(希望這是有益的)
=ERROR REPORT==== 2014-10-12 09:45:38 ===
** State machine <0.4880.3> terminating
** Last message in was {route,
{jid,[],"pubsub.myserver",[],[],
"pubsub.myserver",[]},
{jid,"phantom_notifier","myserver","Smack",
"phantom_notifier","myserver","Smack"},
{xmlelement,"iq",
[{"type","error"},
{"from","pubsub.myserver"},
{"id","XIaTx-11"}],
[{xmlelement,"pubsub",
[{"xmlns","http://jabber.org/protocol/pubsub"}],
[{xmlelement,"publish",
[{"node","testNode2"}],
[{xmlelement,"item",
[{"id","test1413099855673"}],
[{xmlelement,"book",
[{"xmlns","pubsub:test:book"}],
[{xmlcdata,<<"text book">>}]}]}]}]},
{aborted,no_transaction}]}}
** When State == session_established
** Data == {state,
{socket_state,gen_tcp,#Port<0.218148>,<0.4879.3>},
ejabberd_socket,#Ref<0.0.12.23022>,false,"2115632325",
{sasl_state,"jabber","myserver",[],
#Fun<ejabberd_c2s.1.30334249>,
#Fun<ejabberd_c2s.2.32721014>,
#Fun<ejabberd_c2s.3.7052687>,cyrsasl_digest,
{state,5,"3654209317","phantom_notifier",[],
#Fun<ejabberd_c2s.1.30334249>,
#Fun<ejabberd_c2s.3.7052687>,
ejabberd_auth_internal,"myserver"}},
c2s,c2s_shaper,false,true,false,false,
[verify_none,{certfile,"/etc/ejabberd/ejabberd.pem"}],
true,
{jid,"phantom_notifier","myserver","Smack",
"phantom_notifier","myserver","Smack"},
"phantom_notifier","myserver5","Smack",
{{1413,99937,977476},<0.4880.3>},
{pres_t,1},
{pres_f,1},
{pres_a,1},
{pres_i,0},
{xmlelement,"presence",
[{"id","XIaTx-9"}],
[{xmlelement,"status",[],
[{xmlcdata,<<"Phantom on the phone">>}]},
{xmlelement,"priority",[],[{xmlcdata,<<"42">>}]}]},
undefined,
{{2014,10,12},{7,45,37}},
false,
{userlist,none,[],false},
c2s,ejabberd_auth_internal,
{{84,125,131,61},56127},
[]}
** Reason for termination =
** {{badxml,
{xmlelement,"iq",
[{"from","pubsub.myserver"},
{"to","[email protected]/Smack"},
{"type","error"},
{"id","XIaTx-11"}],
[{xmlelement,"pubsub",
[{"xmlns","http://jabber.org/protocol/pubsub"}],
[{xmlelement,"publish",
[{"node","testNode2"}],
[{xmlelement,"item",
[{"id","test1413099855673"}],
[{xmlelement,"book",
[{"xmlns","pubsub:test:book"}],
[{xmlcdata,<<"text book">>}]}]}]}]},
{aborted,no_transaction}]},
{{case_clause,{aborted,no_transaction}},
[{xml,element_to_string_nocatch,1},
{xml,'-element_to_string_nocatch/1-lc$^0/1-0-',1},
{xml,'-element_to_string_nocatch/1-lc$^0/1-0-',1},
{xml,element_to_string_nocatch,1},
{xml,element_to_string,1},
{xml,element_to_binary,1},
{ejabberd_c2s,send_element,2},
{ejabberd_c2s,handle_info,3}]}},
[{xml,element_to_string,1},
{xml,element_to_binary,1},
{ejabberd_c2s,send_element,2},
{ejabberd_c2s,handle_info,3},
{p1_fsm,handle_msg,10},
{proc_lib,init_p_do_apply,3}]}
錯誤,因爲我們可以看到與客戶端中給出的錯誤,一個糟糕的構造xml元素。
「檢查日誌我看到我的消息是不正確的。」您向我們顯示了由調試器顯示的消息,因爲您說它「不正確」,應該發送的預期消息是什麼?您還使用哪個Smack版本? – Flow 2014-10-11 11:21:37
嗨,謝謝你的回答,我正在使用smack 4.0.4,並且我認爲這個消息是不正確的(未正確發佈),因爲我在'error-type'節點內收到了一個'invalid-payload'。也許我錯了?,這個消息是成功發送的? – zozelfelfo 2014-10-11 11:37:25