05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Status is: Error
05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Exception is: org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - cancel
05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Error is: null
logcat的:
<iq xml:lang='en' to='user1@replica3377.cloudapp.net/Android' from='user2@replica3377.cloudapp.net/Smack' type='error' id='0GfHL-35'><si xmlns='http://jabber.org/protocol/si' id='jsi_8960344439394443510' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='attachment.jpg'><desc>First file</desc></file><feature xmlns='http://jabber.org/protocol/feature-neg'><x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si><error code='503' type='cancel'><service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>User session not found</text></error></iq>,
我还检查了ejabberd服务器文件发送/接收服务是否可用。即使进度也不是从0更新,但状态从初始转换为谈判转移。
更新
发送XML
http://jabber.org/protocol/si'id ='jsi_8960344439394443510'mime-type ='image / jpeg'profile ='http://jabber.org/protocol/si/profile/file-transfer'&gt;第一个文件http://jabber.org/protocol/bytestreams {{3 }}
接收XML
roster.getPresence(entry.user).from
它表示错误代码503服务不可用。
[此链接] [1]说503错误意味着您没有提供完整的JId。
获得完整的jId:
Log.i("Service enable ",FileTransferNegotiator.isServiceEnabled(connection).toString())
它也以user2@replica3377.cloudapp.net的形式返回Jid
更新2:
使用以下代码我检查了天气文件传输服务是否可用
var serviceDiscoveryManager:ServiceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection) serviceDiscoveryManager.addFeature( “http://jabber.org/protocol/ibb”) serviceDiscoveryManager.addFeature( “闲聊:IQ:隐私”)
pip install opencv_python-3.2.0+contrib-cp36-cp36m-win_amd64.whl
但它返回false表示文件传输服务不可用。
如何启用文件传输服务? FileTransferNegotiator。 setServiceEnabled()函数不可用。
答案 0 :(得分:1)
我有同样的问题,然后我调查了这个节并以这种方式解决了。
许多人使用“/ Smack ”或“/资源”作为jid中的资源部分,但这可以通过其他方式完成。
资源路径随着用户的每次更改而变化。让我们说我们想要向这个用户发送图像: 的 “USER1 @ MYDOMAIN”强>
你必须在这个jid中添加“/ Resource”或“/ Smack”部分,它会变为: 的 USER1 @ MYDOMAIN /资源强>
但资源路径随着状态而变化,因此您必须遵循每个状态更改来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在presencheChanged()方法中获得最后一个用户资源部分:
Roster roster=getRoster();
roster.addRosterListener(new RosterListener() {
@Override
public void entriesAdded(Collection<Jid> addresses) {
Log.d("entriesAdded", "ug");
context.sendBroadcast(new Intent("ENTRIES_ADDED"));
}
@Override
public void entriesUpdated(Collection<Jid> addresses) {
Log.d("entriesUpdated", "ug");
}
@Override
public void entriesDeleted(Collection<Jid> addresses) {
Log.d("entriesDeleted", "ug");
}
@Override
public void presenceChanged(Presence presence) {
Log.d("presenceChanged", "ug");
//Resource from presence
String resource = presence.getFrom().getResourceOrEmpty().toString();
//Update resource part for user in DB or preferences
//...
}
});
}
资源字符串将是一些生成的字符串,如“6u1613j3kv ”,jid将变为: 的 USER1 @ MYDOMAIN / 6u1613j3kv 强>
这意味着您必须像这样创建传出转移:
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv");
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
在你的情况下,你使用的是 / Smack ,这是不正确的。从状态使用资源部分。
这就是我在smack和Openfire上解决文件传输问题的方法。
另外,您必须在Openfire服务器中添加以下属性:
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port -7777
请注意,我使用的是Openfire 4.0.2和Smack 4.2.2。
这也可以通过简单的方式进行配置,只需在
上设置资源即可XMPPTCPConnectionConfiguration.Builder。
像
XMPPTCPConnectionConfiguration.Builder configurationBuilder =
XMPPTCPConnectionConfiguration.builder();
configurationBuilder.setResource("yourResourceName");