2

:) 我正在尝试制作一个 Android 应用程序,它将扫描整个网络以查找特定的开放端口。我正在使用 Android Studio (Windows) 和模拟器。在我的程序停止运行之前,我可以扫描网络 90 秒。我没有收到任何 logcat 错误,并且在调试器中丢失了堆栈和程序计数器。如果不先重新启动模拟器,我将无法重新启动程序。看起来我失去了与模拟器的任何连接。

我还应该提到,删除套接字连接线会导致任务无限期运行。有没有人经历过这种超时?

任何指向正确方向的指针将不胜感激!

珍妮

private class getNetworkState extends AsyncTask<Integer, Integer, Integer> {
    @Override
    protected Integer doInBackground(Integer... params) {

        for (int subnet2 = 216; subnet2 < 220; subnet2++)
        {
            for (int subnet = 0; subnet < 255; subnet++)
            {
                // open a tcp socket
                String server = String.format("192.168.%d.%d", subnet2, subnet);
                Socket socket = new Socket();
                try
                {
                    socket.connect(new InetSocketAddress(server, port), timeOut);
                    System.out.println("Network state of " + server + " == " + socket.isConnected());
                    socket.close();
                }
                catch (Exception e)
                {
                    System.out.println("Network state of " + server + " == " + e);
                }
            }
        }
        return 1;
    }
4

1 回答 1

1

您多久在 socket.connect(...) 中看到异常?代码存在的方式,失败的连接会抛出异常并且套接字不会被关闭。

我认为更好的做法是在 finally 块中关闭套接字。如果问题的原因是大量打开的套接字,这可能有助于解决问题。

private class getNetworkState extends AsyncTask<Integer, Integer, Integer> {
    @Override
    protected Integer doInBackground(Integer... params) {

        for (int subnet2 = 216; subnet2 < 220; subnet2++)
        {
            for (int subnet = 0; subnet < 255; subnet++)
            {
                // open a tcp socket
                String server = String.format("192.168.%d.%d", subnet2, subnet);
                Socket socket = new Socket();
                try
                {
                    socket.connect(new InetSocketAddress(server, port), timeOut);
                    System.out.println("Network state of " + server + " == " + socket.isConnected());
                }
                catch (Exception e)
                {
                    System.out.println("Network state of " + server + " == " + e);
                } finally {
                    socket.close();
                }
            }
        }
        return 1;
    }
于 2013-07-08T17:36:40.580 回答