Error de envío de archivo Asmack 503 Escriba = cancelar con openfire

Código de inicio de sesión. Inicio de sesión realizado con éxito.

        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);
        }

El código de envío de mi archivo es el siguiente

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");
    }

}

mientras envío recibo esto debajo de dos respuestas xml. por favor echa un vistazo.

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>

Por favor amigos ayuda. He probado muchos fragmentos de código. desde hace tres dias estoy trabajando solo en eso :(

preguntado el 12 de febrero de 14 a las 07:02

Por favor, aclare su pregunta: ¿qué debería pasar, qué está pasando? -

Recibo el error 503 al enviar el archivo. vea el segundo xml en el que su código de error es 503 y el servicio no está disponible. este es el principal problema. :( -

Como SU servicio devuelve 503, la principal responsabilidad de esto recae en el receptor y es probable que no haga nada para solucionarlo en este momento. -

Hola, qué configuración hacer en la propiedad del servidor OpenFire para que el receptor pueda recibir el archivo. -

1 Respuestas

Tuve el mismo problema, investigué la estrofa y lo resolví de esta manera.

Muchas personas usan "/Tortazo" or "/Recurso" como parte del recurso en jid, pero también se puede configurar de otra manera.

La ruta de recursos cambia con cada cambio de presencia del usuario. Digamos que queremos enviar una imagen a este usuario: "usuario1@midominio"

Debes agregar "/Recurso" parte de este jid y se convierte en esto: usuario1@midominio/Recurso

Pero /Recurso la ruta cambia con la presencia, por lo que debe seguir cada cambio de presencia para actualizar la ruta del recurso. La mejor manera es obtener la presencia del usuario en el oyente de la lista y en el método presencheChanged () obtienes la última parte del recurso del usuario como esta:

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
                    //...
                }
            });
}

La cadena de recursos será una cadena generada como "6u1613j3kv" y jid se convertirá en:

user1@mydomain/6u1613j3kv

Eso significa que debes crear tu transferencia saliente así:

EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");

Y así es como resolví mi problema con la transferencia de archivos en Smack y Openfire.

En su caso formule en sendFile(String sentTo) función sentTo debe formarse como mi jid con la ruta del recurso que cambia con cada cambio de presencia.

También para mencionar que debe agregar las siguientes propiedades en su servidor Openfire:

xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777

Solo para mencionar, estoy usando Openfire 4.0.2 y Smack 4.2.2.

Además, esto se puede configurar de manera fácil, simplemente configure el recurso en

XMPPTCPConnectionConfiguration.Builder.

como

XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
XMPPTCPConnectionConfiguration.builder(); 

configurationBuilder.setResource("yourResourceName");

contestado el 10 de mayo de 18 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.