使用smack Android发送文件时出现异常

时间:2017-05-05 12:38:59

标签: android file kotlin smack

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()函数不可用。

1 个答案:

答案 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");