【问题标题】:How to use Smack 4.2 for connecting to ejabberd?如何使用 Smack 4.2 连接到 ejabberd?
【发布时间】:2015-06-01 15:25:31
【问题描述】:

我已更改我的应用以使用 Smack 4.2 替换 Smack 4.1

但我在 config.setServiceName(); 中遇到错误

此方法的参数已从 String 更改为 DomainBareJid。 我不知道如何在这个新的 Smack 中使用 DomainBareJid 和 setServiceName。

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
                .builder();
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);


        config.setServiceName("What should i put here?");


        config.setHost(serverAddress);
        config.setPort(5222);
        config.setDebuggerEnabled(true);
        connection = new XMPPTCPConnection(config.build());

        connection.setUseStreamManagement(true);

如果我不设置服务名称,则会收到以下错误:

03-28 13:44:29.834: E/AndroidRuntime(7104): FATAL EXCEPTION: main
03-28 13:44:29.834: E/AndroidRuntime(7104): java.lang.RuntimeException: Unable to create service com.marothiatechs.cpm.MyService: java.lang.IllegalArgumentException: Must provide XMPP service name
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2715)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.app.ActivityThread.access$1600(ActivityThread.java:153)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.os.Looper.loop(Looper.java:137)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.app.ActivityThread.main(ActivityThread.java:5289)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at java.lang.reflect.Method.invoke(Method.java:525)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at dalvik.system.NativeStart.main(Native Method)
03-28 13:44:29.834: E/AndroidRuntime(7104): Caused by: java.lang.IllegalArgumentException: Must provide XMPP service name
03-28 13:44:29.834: E/AndroidRuntime(7104):     at org.jivesoftware.smack.ConnectionConfiguration.<init>(ConnectionConfiguration.java:106)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration.<init>(XMPPTCPConnectionConfiguration.java:52)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration.<init>(XMPPTCPConnectionConfiguration.java:36)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration$Builder.build(XMPPTCPConnectionConfiguration.java:126)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.marothiatechs.cpm.MyXMPP.initialiseConnection(MyXMPP.java:134)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.marothiatechs.cpm.MyXMPP.init(MyXMPP.java:119)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.marothiatechs.cpm.MyXMPP.<init>(MyXMPP.java:84)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.marothiatechs.cpm.MyXMPP.getInstance(MyXMPP.java:93)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at com.marothiatechs.cpm.MyService.onCreate(MyService.java:74)
03-28 13:44:29.834: E/AndroidRuntime(7104):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2705)

请提供一些示例代码来设置 serviceName。

【问题讨论】:

标签: android xmpp smack


【解决方案1】:

服务名称应该是您服务的主机名。 例如:

config.setServiceName("gtalk.com");

【讨论】:

  • 我无法在这个新的 smack 4.2 中提供字符串作为参数
  • 哦!服务名称应该是字符串。请使用 4.1 稳定版本而不是 alpha 版本。
  • @ZMH 哈哈...我想你会发现这是一种设计选择(旨在让我们的生活变得更加复杂),而不是与 alpha 和 beta 有任何关系!跨度>
【解决方案2】:
DomainBareJid serviceName = JidCreate.domainBareFrom("example.org");
config.setServiceName(serviceName);

【讨论】:

  • 谢谢...setServiceName( DomainBareJid serviceName) 现在已弃用...改用setXmppDomain(DomainBareJid xmppServiceDomain)。有时很难跟上!
  • 谢谢 Ninogumy。这很有帮助! :)
【解决方案3】:

这是我的连接代码,效果很好。

    DomainBareJid domainBareJid = JidCreate.domainBareFrom(mServiceName) ;
    XMPPTCPConnectionConfiguration.Builder builder=
            XMPPTCPConnectionConfiguration.builder();
    builder.setServiceName(domainBareJid);
    builder.setHostAddress(InetAddress.getByName(mServiceName));
    builder.setUsernameAndPassword(mUsername, mPassword);
     builder.setResource("resource");
    builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

    mConnection = new XMPPTCPConnection(builder.build());
    mConnection.addConnectionListener(this);
    mConnection.connect();
    mConnection.login();

【讨论】:

  • 这些方法在 4.2 中不存在
  • 现在我正在使用 smack 4.2,这段代码可以正常工作。
【解决方案4】:
        DomainBareJid serviceName = null;
        try
        {
            serviceName = JidCreate.domainBareFrom("yourdomain.com");
        }
        catch (XmppStringprepException e)
        {
            e.printStackTrace();
        }

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setUsernameAndPassword("1234567890@test", "123")
                .setHost("yourhostname.com")
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                //.setSendPresence(true)
                .setXmppDomain(serviceName)
                .setPort(5222)
                .setDebuggerEnabled(true) // to view what's happening in detail
                .build();

        conn = new XMPPTCPConnection(config);

我已经对此进行了测试并且工作正常。

【讨论】:

    【解决方案5】:

    这是使用 Smack 4.4 的方法

       XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()
                .setHostAddress(InetAddress.getByName(host))
                .setXmppDomain(JidCreate.domainBareFrom(Domain))
                .setUsernameAndPassword("username", "password")
                .setPort(5222)
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .build();
        AbstractXMPPConnection connection = new XMPPTCPConnection(conf);
        connection.connect();
        connection.login();
    

    【讨论】:

    • 谢谢,我正在为 4.4 寻找一种方法,但找不到很多资源。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2020-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多