在android中使用Smack的ejabberd连接给出连接超时错误

2024-01-09

您好,我们已经从以下位置下载了 ejabberd:this https://docs.ejabberd.im/admin/installation/#install-on-windows。域是localhost我们已将 xmppDomain 设置为我的计算机的 IP 地址。我使用了以下代码进行连接

    public static final String XMPP_DOMAIN = "localhost";
    public static final String XMPP_HOST = "10.0.2.2";//kept for emaulator
    //public static final String XMPP_HOST = "192.168.1.152"; //ip of my pc
    public static final int XMPP_PORT = 5222;
    public static final String XMPP_RESOURCE = "xmppdemo";
    public static final boolean XMPP_DEBUG = true;

      private void initialiseConnection() throws IOException, InterruptedException, XMPPException, SmackException {
        InetAddress addr = InetAddress.getByName(Constants.XMPP_HOST);
        DomainBareJid serviceName = JidCreate.domainBareFrom(Constants.XMPP_DOMAIN);

        XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
                .builder();
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        config.setXmppDomain(serviceName);
        config.setHostAddress(addr);
        config.setPort(Constants.XMPP_PORT);
        config.setDebuggerEnabled(Constants.XMPP_DEBUG);
        config.setResource(Constants.XMPP_RESOURCE);
        connection = new XMPPTCPConnection(config.build());
        connection.addConnectionListener(mConnectionListener);
        connection.addAsyncStanzaListener(mStanzaListener, new StanzaFilter() {
            @Override
            public boolean accept(Stanza stanza) {
                //You can also return only presence packets, since we are only filtering presences
                return true;
            }
        });

        Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
        roster = Roster.getInstanceFor(connection);
        roster.addRosterListener(mRoasterListener);


    }

     public void connect() {

        @SuppressLint("StaticFieldLeak") AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() {
            @Override
            protected synchronized Boolean doInBackground(Void... arg0) {
                //There is no point in reconnecting an already established connection. So abort, if we do
                if (connection.isConnected())
                    return false;

                //We are currently in "connection" phase, so no requests should be made while we are connecting.
                isconnecting = true;

                if (isToasted)
                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(service, "connecting....", Toast.LENGTH_LONG).show();
                        }
                    });

                if (debug) Log.d(TAG, "connecting....");

                try {
                    connection.connect();

                    /**
                     * Set delivery receipt for every Message, so that we can confirm if message
                     * has been received on other end.
                     *
                     * @NOTE: This feature is not yet implemented in this example. Maybe, I'll add it later on.
                     * Feel free to pull request to add one.
                     *
                     * Read more about this: http://xmpp.org/extensions/xep-0184.html
                     **/

                    DeliveryReceiptManager dm = DeliveryReceiptManager.getInstanceFor(connection);
                    dm.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
                    dm.addReceiptReceivedListener(new ReceiptReceivedListener() {
                        @Override
                        public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {

                        }

//                        @Override
//                        public void onReceiptReceived(final String fromid,
//                                                      final String toid, final String msgid,
//                                                      final Stanza packet) {
//
//                        }
                    });
                    connected = true;

                } catch (IOException e) {
                    service.onConnectionClosed();
                    if (isToasted)
                        new Handler(Looper.getMainLooper())
                                .post(new Runnable() {

                                    @Override
                                    public void run() {
                                        Toast.makeText(service, "IOException: ", Toast.LENGTH_SHORT).show();
                                    }
                                });
                    if (debug) Log.e(TAG, "IOException: " + e.getMessage());
                } catch (SmackException e) {
                    service.onConnectionClosed();
                    if (isToasted)
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(service, "SMACKException: ", Toast.LENGTH_SHORT).show();
                            }
                        });
                    if (debug) Log.e(TAG, "SMACKException: " + e.getMessage());
                } catch (XMPPException e) {
                    service.onConnectionClosed();
                    if (isToasted)
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(service, "XMPPException: ", Toast.LENGTH_SHORT).show();
                            }
                        });
                    if (debug) Log.e(TAG, "XMPPException: " + e.getMessage());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //Our "connection" phase is now complete. We can tell others to make requests from now on.
                return isconnecting = false;
            }
        };
        connectionThread.execute();
    }
     //Signup to server
    public void Signup(SignupModel signupModel) {
        XMPPError.Condition condition = null;
        boolean errors = false;
        String errorMessage = "";

        String mUsername = signupModel.getUsername();
        String mPassword = signupModel.getPassword();

        boolean isPasswordValid = signupModel.checkPassword();
        boolean areFieldsValid = signupModel.validateFields();

        if (!isPasswordValid) {
            errors = true;
            errorMessage = Constants.SIGNUP_ERR_INVALIDPASS;
        }

        if (!areFieldsValid) {
            errors = true;
            errorMessage = Constants.SIGNUP_ERR_FIELDERR;
        }

        if (errors) {
            service.onSignupFailed(errorMessage);
            return;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                if (!connected && !isconnecting) connect();
            }
        }).start();

        try {
//            final AccountManager accountManager = AccountManager.getInstance(connection);
//
//
//            accountManager.createAccount(Localpart.from(mUsername), mPassword);


            AccountManager accountManager = AccountManager.getInstance(connection);
            accountManager.sensitiveOperationOverInsecureConnection(true);
            accountManager.createAccount(Localpart.from(mUsername), mPassword);

        } catch (XMPPException | SmackException e) {

            e.printStackTrace();
            if (debug) Log.e(TAG, "Username: " + mUsername + ",Password: " + mPassword);

            if (e instanceof XMPPException.XMPPErrorException) {
                condition = ((XMPPException.XMPPErrorException) e).getXMPPError().getCondition();
            }

            if (condition == null) {
                condition = XMPPError.Condition.internal_server_error;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (XmppStringprepException e) {
            e.printStackTrace();
        }

        if (condition == null) {
            service.onSignupSuccess();
        } else {
            switch (condition) {
                case conflict:
                    errorMessage = Constants.SIGNUP_ERR_CONFLICT;
                    break;
                case internal_server_error:
                    errorMessage = Constants.SIGNUP_ERR_SERVER_ERR;
                    break;
                default:
                    errorMessage = condition.toString();
                    break;

            }

            service.onSignupFailed(errorMessage);
        }
    }

    //Login to server
    public void login() {
        try {

            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (!connected && !isconnecting) connect();
                }
            }).start();

            if (debug) Log.i(TAG, "User " + userId + userPassword);

            connection.login(userId, userPassword);

            if (debug) Log.i(TAG, "Yey! We're logged in to the Xmpp server!");

            service.onLoggedIn();
        } catch (XMPPException | SmackException | IOException e) {

            service.onLoginFailed();
            if (debug) e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

当我运行此代码时,我收到以下异常(当尝试从模拟器运行时)

SMACKException: The following addresses failed: '10.0.2.2:5222' failed because: /10.0.2.2 exception: java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 5222) from /192.168.232.2 (port 34922) after 30000ms

当尝试从我的设备运行时,我保留了HOST_NAME作为我的电脑的 IP 地址,但随后我收到以下错误

E/XMPPHandler: SMACKException: The following addresses failed: '192.168.1.152:5222' failed because: /192.168.1.152 exception: java.net.SocketTimeoutException: connect timed out

When I installed ejabberd on my pc then I received the following Access Control List page Access Control List .. Should I have to change something?? Or missing something?


我也有这个问题。不知道为什么,windows上的ejabberd服务器不能正常工作。我尝试在linux和mac上安装服务器,它工作正常。但在 Windows 版本上总是会出现 SocketTimeoutException。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android中使用Smack的ejabberd连接给出连接超时错误 的相关文章

  • ContentResolver的notifyChange方法是否也通知详细的Uri?

    在应用数据期间我使用notifyChange与Uri 假设我通知content com package my items 我还有详细的Activity显示数据来自content com package my items 1 是否通知 一般
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • Android 应用程序在启动时打开应用程序信息屏幕,而不是启动主 Activity

    我不确定这是否是一个问题 但这是我第一次遇到这个问题 我正在开发一个应用程序 当我在进行一些编码后断开应用程序与 Android Studio 和 PC 的连接时 如果我尝试在手机上打开应用程序 它会启动app info屏幕 我们看到强制停
  • API29 上不推荐使用 setColorFilter

    我使用以下行来更改 VectorDrawable 的颜色 mydrawable getBackground setColorFilter color PorterDuff Mode SRC ATOP 这很好用 尽管它现在已被弃用 文档建议我
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • 如何在活动中的必填字段中显示 * 符号

    我需要在活动中的必填字段中显示 符号 你能建议我怎样才能做到这一点吗 任何帮助 将不胜感激 我想说 作为必填字段的标记不遵循本机 Android 主题 的组合setHint and setError对于 Android 应用程序来说看起来更
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Google 地图删除标记路线上下文菜单

    我使用 Android Studio 的 Google 地图模板启动了一个新项目 并在地图上添加了一个标记 LatLng location new LatLng lat lng Marker marker mMap addMarker ne
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • Jetpack 导航:如何从一个嵌套图的子级导航到另一个嵌套图的子级?

    导航结构 MainActivity nav root HomeFragment AuthNestedGraph nav auth BeforeOtpFragment home OtpFragment ProfileNestedGraph n
  • TextInputLayout 对于在 EditText 中以编程方式给出提示没有效果

    我有一个 EditText 它的父级是 TextInputLayout 我试图以编程方式为 EditText 提供提示 不在布局中 在这种情况下 文本输入提示动画不起作用 它像简单的 EditText 一样工作 有人可以建议如何处理它吗 下
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • 如何关闭 EditText 中的建议?

    如何在 Android 中关闭 EditText 中的建议 android inputType textNoSuggestions 根据this http comments gmane org gmane comp handhelds an
  • 在 Nougat 7.1.1 中点击应用程序快捷方式时出现应用程序未安装错误

    我在向现有应用程序添加静态应用程序快捷方式时遇到一些问题 我按照以下步骤操作https developer android com guide topics ui shortcuts html https developer android
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我

随机推荐

  • 在 Xcode 上管理代码片段的最佳方法是什么?

    我已经爱上了 Visual Studio 的代码片段工具包 Xcode 上有类似的东西吗 您还可以看看this https stackoverflow com questions 20420 any resharper equivalent
  • 如何在Windows上安装PLV8?

    我正在尝试将其安装在我的 PostgreSQL 服务器上 http code google com p plv8js wiki PLV8 http code google com p plv8js wiki PLV8这些文档看起来很棒 但问
  • 断开连接的图表上缺少悬停标记

    我遇到了一个问题 我不确定这是 highcharts 插件中的错误还是编程错误 我使用空值来绘制仅包含一个系列的断开线图 但这似乎是悬停标记的问题 其中一些标记 在第一行的顶部和第二行的底部 似乎没有出现 代码很简单 但我找不到导致此问题的
  • Python - 来自 stdin 的 HTTP post [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我每秒左右从 bash 命令 ibeacon scan 获取这种格式的数据 ibeacon scan b stdin py Out
  • 带 -a 的路径对于 bash 函数没有意义

    这是我的 bash 函数 push gt cd var www html wp gt git init gt git add gt git commit am 1 gt git push f origin master gt 我想执行它 d
  • 如何从支持某些 API 的函数返回非具体值?

    我正在两个模型之间构建 API 我不在乎它是否返回 或 Seq 或任何可折叠的都可以 但如果我尝试这样做 就会出错 module Main where import Prelude hiding foldr import Data Fold
  • C# 检查对象是否为空

    我在使用 if 语句检查对象是否为空时遇到问题 我有一个 webClient 在 try catch 中从网站中提取 JSON 字符串 如果出错 那是因为 API 中不存在 3 位国家 地区 我只想跳过它 这是我的代码 System Net
  • 检查 servlet 和 jsp 中的会话

    在我的网络应用程序中 我需要检查会话是否存在 我想在我的 servlet 和 jsp 中检查这一点 有什么方法可以检查这个吗 Thanks 你可以测试它HttpServletRequest getSession boolean create
  • Android-从 DatePickerDialogFragment 中删除 Calendarview

    我有一个工作正常的 Datepickerdialog 片段 当我单击按钮时 datepickerdialog 将打开 左侧有微调器日期选择 右侧有日历视图 对于我在一个地方的应用程序 我只想单独显示微调器日期选择部分 必须删除或隐藏日历视图
  • 将图像转换为 HTML/CSS 中的灰度

    有没有一种简单的方法可以仅用灰度显示彩色位图HTML CSS 它不需要与 IE 兼容 我想也不会 如果它能在 FF3 和 或 Sf3 中工作 那对我来说就足够了 我知道我可以同时做到SVG和 Canvas 但现在看来工作量很大 有真正懒人的
  • 合并到分支,合并到哪一个并不重要?

    git 版本 1 7 5 4 我有大约5个分支机构 全部来自同一个初始分支 我想将 2 个分支合并在一起 比如说 branch1 和branch2 这些分支有很多差异 我目前正在分支 1 上工作 刚刚意识到我在分支 2 中实现了一些我想要在
  • 在twopi (Graphviz) 中控制间距

    我是 Graphviz 的新手 我正在尝试绘制一棵以实体为中心的树 我正在使用twopi命令 如果我把overlap true即使重叠标签周围有很多空间 它也会重叠 如果我把overlap false 标签变得太小 如何才能拥有第一种情况而
  • 如何在每次加载页面时仅重新加载一次

    我有一个 JSP 页面 即使在删除其中一项内容后 该页面仍显示以前的内容 我正在努力寻找问题 但我需要快速解决此问题 我在这方面很弱JavaScript所以请帮帮我 我需要一个JavaScript每次访问页面时都会自动重新加载页面 重新加载
  • 按日期范围和分类变量合并数据集

    假设我有两个数据集 一个包含带有开始 结束日期的促销列表 另一个包含每个计划的每月销售数据 promotions data frame start date as Date c 2012 01 01 2012 06 14 2012 02 0
  • 汉字显示为问号

    之前已经问过这个问题 但我不知道出了什么问题 我正在使用 phantomjs 打印 pdf render 呈现的页面基本上是具有以下属性的本地静态站点 font normal 17px helvetica arial verdana san
  • 使用 htaccess 在标头内设置文件名

    我们有一个从服务器下载文件的应用程序 下载后 需要保存它 因为它使用来自响应标头的文件名参数 当我使用标准 PHP 时download php id downloadID我可以毫无问题地设置标题 现在的任务是在客户端服务器上没有任何可用的
  • 我应该在 Promise 中使用 `return` 吗?

    function saveToTheDb value return new Promise function resolve reject db values insert value function err user remember
  • OpenGL中的glRotate是旋转相机还是旋转世界轴还是旋转模型对象?

    我想知道是否glRotate旋转相机 世界轴或对象 通过例子解释它们有何不同 相机 OpenGL 中没有相机 世界轴 OpenGL 中没有世界 或物体 OpenGL 中没有对象 使困惑 OpenGL 是一个绘图系统 可使用点 线和三角形进行
  • 为了记录目的而捕获 RuntimeException 是一种不好的做法吗?

    我发现捕获 RuntimeException 通常被认为是不好的做法 因为它们无法纠正并且通常是程序员错误 然而 我们有一个 疯狂的 大型应用程序 其中任何部分的更改都可能产生不可预见的后果 是的 这本身就是一个问题 现在 我们开始在应用程
  • 在android中使用Smack的ejabberd连接给出连接超时错误

    您好 我们已经从以下位置下载了 ejabberd this https docs ejabberd im admin installation install on windows 域是localhost我们已将 xmppDomain 设置