java - android套接字连接后卡住

标签 java android sockets ip port

我正在尝试制作一个应用程序来扫描特定开放端口(5050)范围内的所有 IP,如果它是开放的,则在日志上写入一些消息。

代码如下:

public void run(){
        for(int i=0;i<256;i++)
        {
            Log.d("NetworkScanner","attemping to contact 192.168.1."+i);
            try {
                Socket socket=new Socket(searchIP+i,5050);
                possibleClients.add(searchIP);
                socket.close();

                Log.d("NetworkScanner"," 192.168.1."+i+" YEAAAHHH");

            } catch (UnknownHostException e) {

                Log.d("NetworkScanner"," 192.168.1."+i+" unavailable");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

编辑:这里有一个新问题:即使在没有打开端口的情况下找到在线主机,扫描过程(for循环)也会在移动到下一个之前停留很长时间。扫描每个主机也需要相当长的时间!

唷,最终的解决方案是使用默认构造函数创建一个 Socket 对象,然后为主机创建 InetAddr 对象,然后使用套接字 api 的 Connect(InetAddr,timeout) 函数,超时时间为毫秒(大约 300 毫秒),该函数会扫描每个只需 300 毫秒或更短时间即可扫描 IP(少于 200 毫秒可能会出错),多线程并行扫描使其扫描范围内的所有 IP 仅需 5 秒。

最佳答案

当没有抛出 Exception 时,您将跳出循环。

您需要删除break;

<小时/>

解决您的新问题:

当然是慢了。你期待什么?您正在尝试与子网中的每个 IP 建立连接,这需要时间。看来您只是想弄清楚网络上有哪些设备可用,因此您可以通过查看 this 来稍微减少时间。回答。他正在使用接受超时值的 isReachable 方法中的构建。仍然需要一些时间,但时间不会那么长。

关于java - android套接字连接后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15793259/

相关文章:

java - 如何在不同的线程中运行监听器或在不同的线程中进行计算

android - 从生成的 AutoCompleteTextView$DropDownListView 中获取有关 AutocompleteTextView 的信息

java - Android 应用程序强制关闭(检索数据)

java - RxJava 有类似 Promise.all() 的方法吗?

c - 如何将数据插入到客户端发送的 .csv 文件中?

C 套接字范围 header 无效

java - 如何更改 Visual VM 中的默认设置?

java - 有没有办法在java中使用filewriter来打开不同的文本文件

c - Linux 本地通信套接字 : Why is bind() not failing as expected?

java - 以编程方式设置按钮和TextView的Id并根据id执行操作