java.net.ServerSocket.accept () 在 Android 上不返回

2024-05-08

我正在尝试找到一种方法来远程登录到未root的机器人。我有INTERNET权限处于活动状态,我的设备与我的设备连接在同一网络上Mac OS X通过 WiFi,我可以 ping 通我打开的端口。

在最初的实验中,我让它在有根测试设备上工作,但我让套接字处理程序在UI Thread而不是一个单独的线程。现在我将网络模块放在一个单独的线程上,我无法得到ServerSocket.accept ()回来。它适用于 Google 版本的 android(vanilla),但不适用于三星或索尼爱立信的版本。

当我远程登录到它时,我的尝试会超时,并且logcat不会打印出任何异常或错误。

这是我的代码的 google-code 存储库的链接:Google 代码存储库 https://code.google.com/p/android-socket-experiment/

我在跑步ServerScoket.accept ()在一个单独的线程上,并在另一个线程上运行流处理器。对我的设计的评论(即我应该使用Handlers or AsyncTasks)非常受欢迎。现在,为了 Toast 通过 telnet 接收到的消息,我使用了一个处理程序,其中的循环程序通过Context.

以下是我运行时得到的结果netstat -n在非工作设备上的 adb shell 上:

~$ adb shell netstat -n
Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 127.0.0.1:7777         0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:7203         0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:47609        127.0.0.1:7777         ESTABLISHED
tcp        0      0 127.0.0.1:7777         127.0.0.1:47609        ESTABLISHED
tcp        0      0 127.0.0.1:47610        127.0.0.1:7777         ESTABLISHED
tcp        0      0 127.0.0.1:7777         127.0.0.1:47610        ESTABLISHED

不同之处在于,在工作设备中,它们列出了一个 IP,其中我的端口处于“监听”状态。

UPDATE: 拥有<uses-permission android:name="INTERNET"/>设置在我的android_manifest,我尝试将端口号更改为689。没用;我有一个BindException,说我可能缺少 INTERNET 权限。所以,我把它改成了1989,然后我又回到一切工作中,直到accept ()。我认为这是因为我在非 root 手机上运行它,并且我无权访问端口1024及以下。

UPDATE:我在 Mac 上运行了一个非常相似的程序,当我尝试使用分配给我的 IP 地址远程登录到我的 Mac 时,它运行得很好。当我尝试从另一台 Mac 进行远程登录时,它不起作用,但似乎无法连接;连接会超时。不过,它确实可以在临时网络上运行。我还没有使用 droid 进行尝试,但我会尽快更新。

UPDATE:我设法让该应用程序在 3 个运行 Vanilla(由 google 发布的 Android)的独立机器人上运行。它可以在 Nexus、Apanda A60(我的第一台设备;由于某种原因 adb 已停止检测到它。)以及定制的无品牌平板电脑上运行。不过,因为我已经提供了相当大的赏金,所以我打算坚持到底。

如前所述,我的应用程序适用于 Android 的 Vanilla 版本,但不适用于修改版本。无法运行该功能的三款手机均为中端机型; 2Samsung GT-i5503s 和一个Sony-Ericcson E16i.


您似乎遇到了网络问题,而不是代码问题。我使用了你的最新项目,它正在监听端口,正如预期的那样。

我将其添加到TelnetServer.setupServerSocket()确认一些信息:

Log.i("TelnetServer", "ServerSocket Address: " + this.server.getLocalSocketAddress());
try {
    Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
    while (en.hasMoreElements()) {
        NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                Log.i("TelnetServer", "Listen On: " + inetAddress.getHostAddress());
            }
        }
} catch (SocketException ex) {
    Log.e("TelnetServer", ex.toString(), ex);
}

这将打印您的服务正在侦听的所有地址(如果它正在侦听 0.0.0.0/0.0.0.0:xxx(在 ServerSocket Address:) 之后打印)。

你应该跑emulator-tcpdump <file>选项并提供此。它将确认正在尝试任何连接。我的预感是您的客户端无法访问服务器,这就是服务器未接收连接的原因 - 而不是代码问题。

请提供 tcpdump 文件、您的(客户端)IP 地址和 logcat 输出(包括 ServerSocket Address 和 Listen On 语句)以进行进一步分析。

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

java.net.ServerSocket.accept () 在 Android 上不返回 的相关文章

随机推荐