首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asmack文件发送错误503类型=取消打开

Asmack文件发送错误503类型=取消打开
EN

Stack Overflow用户
提问于 2014-02-12 07:41:10
回答 1查看 995关注 0票数 0

登录密码。成功登录。

代码语言:javascript
复制
        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);
        }

我的文件发送代码如下

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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>

请朋友帮忙。我尝试过许多代码片段。从三天以来,我只在做这件事:

EN

回答 1

Stack Overflow用户

发布于 2018-02-15 21:21:05

我也有同样的问题,我调查了这一节并以这种方式解决了它。

许多人在jid中使用"/Smack""/Resource"作为资源部分,但也可以使用另一种方式进行配置。

资源路径是随着用户的存在而改变的。让我们说,我们想要发送图像给这个用户:"user1@mydomain"

您必须在这个jid中添加"/Resource"部件,然后它变成如下所示:

但是/Resource路径是随存在而变化的,因此您必须遵循每次存在更改来更新资源路径。获得用户存在的最佳方法是在名册侦听器中,在presencheChanged()方法中,您将得到最后一个用户资源部分,如下所示:

代码语言:javascript
复制
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将变成:

代码语言:javascript
复制
user1@mydomain/6u1613j3kv

这意味着您必须像这样创建您的传出传输:

代码语言:javascript
复制
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");

这就是我如何解决我的问题,文件传输的smack和Openfire。

sendFile(String sentTo)函数中的表单中,sentTo必须与my一样形成,其资源路径随资源变化而变化。

此外,还必须在Openfire服务器中添加以下属性:

代码语言:javascript
复制
xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777

值得一提的是,我使用的是Openfire 4.0.2和Smack 4.2.2。

而且,这可以简单地配置,只需将资源设置为

XMPPTCPConnectionConfiguration.Builder。

喜欢

代码语言:javascript
复制
XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
XMPPTCPConnectionConfiguration.builder(); 

configurationBuilder.setResource("yourResourceName");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21721605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档