啥呀啥呀 2023-03-18 00:19 采纳率: 0%
浏览 60
已结题

Android连接mongodb Timed out after 30000 ms while waiting to connect

问题遇到的现象和发生背景

idea中使用Android连接本地mongodb数据库超时失败

遇到的现象和发生背景,请写出第一个错误信息

编译时总是提示Timed out after 30000 ms while waiting to connect.

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myFunction();
    }

    public void myFunction( ) {
        MongoClient cmg = new MongoClient("10.0.2.2");
        //连接的本地数据库
        for(String name : cmg.listDatabaseNames())
            System.out.println("dbName: "+name);
        //输出本地全部数据库名,增强for循环
        MongoDatabase db= cmg.getDatabase("myDatabase");
        //使用myDatabase这个数据库
        for(String name:db.listCollectionNames()) {
            System.out.println("newDB: CollectionName:" + name);
        }
        //输出myDatabase数据库中集合的名称
    }
}
运行结果及详细报错内容
Caused by: java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 27017) from /172.16.1.15 (port 48934) after 20000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:185)
        at libcore.io.IoBridge.connect(IoBridge.java:129)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64)
        at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79)
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) 
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) 
        at java.lang.Thread.run(Thread.java:764) 
D/AndroidRuntime: Shutting down VM
    
    
    --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 2750
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=10.0.2.2:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 27017) from /172.16.1.15 (port 48934) after 20000ms}}]
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2954)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3089)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1819)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6737)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
     Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=10.0.2.2:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 27017) from /172.16.1.15 (port 48934) after 20000ms}}]
        at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:182)
        at com.mongodb.internal.connection.SingleServerCluster.getDescription(SingleServerCluster.java:41)
        at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:152)
        at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:103)
        at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:284)
        at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:188)
        at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:143)
        at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92)
        at com.mongodb.client.internal.MappingIterable.iterator(MappingIterable.java:39)
        at com.example.myapplication.MainActivity.myFunction(MainActivity.java:21)
        at com.example.myapplication.MainActivity.onCreate(MainActivity.java:15)
        at android.app.Activity.performCreate(Activity.java:7144)
        at android.app.Activity.performCreate(Activity.java:7135)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2934)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3089) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1819) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6737) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860) 
W/System.err: java.lang.Exception: call killProcess callstack! pid=2750
W/System.err:     at android.os.Process.killProcess(Process.java:915)
        at com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException(RuntimeInit.java:157)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
W/System.err:     at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
        at java.lang.Thread.dispatchUncaughtException(Thread.java:1955)
I/Process: Sending signal. PID: 2750 SIG: 9

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

已经尝试过更改依赖、更改mongodb config里的IP地址、防火墙也关闭了
现在的问题好像就出现在安卓模拟器上面,因为我已经尝试过相同mongodb-driver版本在Java项目里是可以正常跑起来的,但是相同代码放在安卓上总是连接超时。

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

11条回答 默认 最新

  • OKX安生 2023-03-21 01:39
    关注
    • 该回答引用于gpt与自己的思路:
    • 根据报错信息,在 Android 模拟器上无法连接本地 MongoDB 数据库,出现超时错误。这可能是由于模拟器网络设置或 MongoDB 配置的原因导致的。

    首先,您可以在 Android 模拟器中使用命令 ping 10.0.2.2 来测试是否可以访问本地主机。如果无法访问,则需要检查您的模拟器网络设置。

    其次,您可以确认 MongoDB 的配置是否正确。请确保 MongoDB 正在运行,并且已经在本地主机上启动它。您可以在控制台中执行以下命令来检查 MongoDB 是否正在运行:

    mongo --host 127.0.0.1:27017
    

    如果没有任何错误提示,那么 MongoDB 就正常运行了。接下来可以尝试在 Android 模拟器中连接 MongoDB 数据库。

    另外,请注意防火墙设置。如果您的计算机上有防火墙软件,可能需要将端口 27017 开放,以允许从模拟器连接到 MongoDB。

    最后,检查代码中的 IP 地址和端口号是否正确。从报错信息中看到,Android 模拟器试图连接 IP 地址为 10.0.2.2、端口号为 27017 的 MongoDB 数据库,但无法建立连接。如果您的 MongoDB 不是通过这个地址进行访问的话,就需要将代码中的 IP 地址和端口号修改为正确的值。

    • 如果上述方法都无法解决问题,您可以尝试以下几点:
    1. 确保您的 Android 项目中已经添加了正确版本的 MongoDB 驱动程序。如果没有,请检查您的 Gradle 依赖配置是否正确。

    2. 您可以使用 Telnet 命令测试本地主机的端口是否可用,例如:

      telnet 10.0.2.2 27017
      

      如果连接成功,则表明端口可用,否则可能存在端口被防火墙阻止的问题。

    3. 您可以尝试使用本地主机的 IP 地址代替 10.0.2.2,例如:

      MongoClient cmg = new MongoClient("192.168.0.100");
      

      其中,192.168.0.100 是本地主机的 IP 地址。这样做可以避免通过虚拟网络进行通信时可能遇到的问题。

    4. 您还可以尝试在 MongoDB 的配置文件中添加以下行来启用远程访问:

      bind_ip = 0.0.0.0
      

      这将允许从任何 IP 地址访问 MongoDB 数据库。请注意,在生产环境中,需要更加谨慎地配置安全选项。

    • 如果您仍然无法解决连接 MongoDB 数据库的问题,您可以尝试以下几个方向:
    1. 检查 Android SDK 版本和模拟器版本是否与您的代码和 MongoDB 驱动程序兼容。某些版本的 Android SDK 和模拟器可能存在不稳定性或与某些驱动程序不兼容的问题。

    2. 您还可以尝试使用真实设备而不是模拟器来测试您的应用程序。真实设备可能更接近于生产环境,并且能够更好地模拟实际场景,从而更容易发现和解决问题。

    3. 可以尝试通过 Wi-Fi 连接到同一网络中的计算机,然后在 Android 应用程序中使用计算机的 IP 地址来连接 MongoDB。这样做可以将虚拟网络带来的问题降至最低。

    4. 最后,您还可以考虑更换 MongoDB 驱动程序。有时候,特定版本的驱动程序可能会出现问题,如果您使用的是较旧的驱动程序,则可以尝试升级到最新版本并重新测试您的应用程序。

    希望以上建议对您有所帮助!

    评论

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 创建了问题 3月18日

悬赏问题

  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错