Asmack 文件发送错误 503 类型 = 使用 openfire 取消

Posted

技术标签:

【中文标题】Asmack 文件发送错误 503 类型 = 使用 openfire 取消【英文标题】:Asmack File Sending Error 503 Type = cancel with openfire 【发布时间】:2014-02-12 07:41:10 【问题描述】:

登录代码。登录成功。

        String host=AppContext.HOST;//myHost
        String [] params="a1","aa"
        int port=AppContext.PORT;//My Port 2777
        String service=AppContext.SERVICE;  //service = smack
        ConnectionConfiguration connConfig = new ConnectionConfiguration(
                host, port, service);
        connConfig.setDebuggerEnabled(true);
            Connection.DEBUG_ENABLED = true;
     connConfig.setSASLAuthenticationEnabled(true);
    XMPPConnection connection = new XMPPConnection(connConfig);
        Log.e("XMPP LoginActivity Username ",params[0]+" pass "+params[1]);
        try 
            connection.connect();
            connectionFlg=true;
            Log.i("XMPP LoginActivity",
                    "Connected to " + connection.getHost());
         catch (XMPPException ex) 
            Log.e("XMPP LoginActivity", "Failed to connect to "
                    + connection.getHost());
            Log.e("XMPP LoginActivity", ex.toString());
            appContext.setConnection(null);
        
        try 
            if(connectionFlg)
            
            connection.login(params[0], params[1]);
            Log.i("XMPP LoginActivity",
                    "Logged in as " + connection.getUser());

            Presence presence = new Presence(Presence.Type.available);
            presence.setStatus("I’m available");
            connection.sendPacket(presence);
            loginFlg=true;
            appContext.setConnection(connection);
            else
            
                Log.e("XMPP LoginActivity", "Failed to connect to "
                        + connection.getHost());
            

         catch (XMPPException ex) 
            loginFlg=false;                     ;
            Log.e("XMPP LoginActivity", "Failed to log in as "
                    + params[0]);
            Log.e("XMPP LoginActivity", ex.toString());
            appContext.setConnection(null);
        

我的文件发送代码如下

public void sendFile(String sentTo) 
    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());

    FileTransferManager manager = new FileTransferManager(connection);
    OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(sentTo);
    File file = new File(Environment.getExternalStorageDirectory()
            .getPath() + "/user.json");
    try 
       transfer.sendFile(file, "test_file");
     catch (XMPPException e) 
       e.printStackTrace();
    
    while(!transfer.isDone()) 
       if(transfer.getStatus().equals(Status.error)) 
          System.out.println("ERROR!!! " + transfer.getError());
        else if (transfer.getStatus().equals(Status.cancelled)
                        || transfer.getStatus().equals(Status.refused)) 
          System.out.println("Cancelled!!! " + transfer.getError());
       
       try 
          Thread.sleep(1000L);
        catch (InterruptedException e) 
          e.printStackTrace();
       
    
    if(transfer.getStatus().equals(Status.refused) || transfer.getStatus().equals(Status.error)
     || transfer.getStatus().equals(Status.cancelled))
       System.out.println("refused cancelled error " + transfer.getError());
     else 
       System.out.println("Success");
    


在发送时,我得到以下两个 xml 响应。请看一下。

1)

12:55:16 PM SENT (1092826504): <iq id="SU8c1-17" to="a2@aaa" from="a1@aaa/Smack" type="set"><si xmlns="http://jabber.org/protocol/si" id="jsi_2427513438410796738" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="user.json" size="379" ><desc>test_file</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="form"><field var="stream-method" type="list-multi"><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq>

2)

12:55:16 PM RCV  (1092826504): <iq type="error" id="SU8c1-17" from="a2@aaa" to="a1@aaa/Smack"><si xmlns="http://jabber.org/protocol/si" id="jsi_2427513438410796738" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="user.json" size="379"><desc>test_file</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="form"><field var="stream-method" type="list-multi"><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"/></error></iq>

请朋友帮忙。我已经尝试了很多代码sn-p。因为三天我只在努力:(

【问题讨论】:

请澄清您的问题 - 应该发生什么,发生了什么? 我在发送文件时收到 503 错误。请参阅第二个 xml,因为它们是 503 错误代码并且服务不可用。这是主要问题。 :( 当他们的服务返回 503 时,主要责任在于接收方,此时您不太可能采取任何措施来解决此问题。 hey 在 OpenFire Server 属性中设置什么,以便接收器可以接收文件。 【参考方案1】:

我遇到了同样的问题,我研究了这节并以这种方式解决了。

很多人使用 "/Smack""/Resource" 作为 jid 中的资源部分,但也可以通过其他方式进行配置。

资源路径随着用户的每次改变而改变。假设我们要向该用户发送图像: “user1@mydomain”

您必须将 "/Resource" 部分添加到此 jid 中,它变为: user1@mydomain/资源

/Resource 路径会随着存在而改变,因此您必须遵循每个存在更改来更新资源路径。 最好的方法是让用户存在于名册侦听器中,在 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)
transfer.sendFile(new File("DirectoryPath"), "Description");

这就是我在 smack 和 Openfire 上解决文件传输问题的方法。

在您的情况下,sendFile(String sentTo) 函数 sentTo 中的表单必须像我的 jid 一样形成,其资源路径会随着每次 rpesence 的变化而变化。

另外提到你必须在你的 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");

【讨论】:

以上是关于Asmack 文件发送错误 503 类型 = 使用 openfire 取消的主要内容,如果未能解决你的问题,请参考以下文章

(a)Smack 在 login() 处返回“service-unavailable (503)”错误

Android aSmack - 如何为文件发送自定义消息扩展名?

Asmack 文件传输进度始终为 0.0

python 发送邮件及smtplib.SMTPAuthenticationError 503 错误处理

AWS EC2 t2.micro 盒子发送 503 错误

asmack android,无法传输文件