java - 扫描 LAN 中的套接字?

标签 java sockets

我正在创建一个基本的小游戏,我希望它能够使用套接字通过 LAN 进行扫描,我当前的代码可以工作,但它很粗糙且缓慢。

我当前的代码是这样工作的,它获取当前计算机的前2个 Octave 音阶(例如192.168),然后执行双for循环(0-255)从192.168.0.0扫描到192.168.255.255,在我看来这是是扫描 LAN 中所有 IP 的非常低效的方法。

这是代码:

new Thread(new Runnable() {
@Override
public void run() { 
            int next = 0;
            try{
            String ipAd = InetAddress.getLocalHost().getHostAddress();
            String ipStart = ipAd.substring(0, NetHandler.nthOccurrence(ipAd, '.', 2)-1);

            Socket s;

            for(int i = 0 ; i < 255; i++){
                for(int j = 0 ; j < 255; j++){
                    s = new Socket();
                    String ip = ipStart + (i + "." + j);
                    tests++;
                    server = ip;    
                    try{
                    s.connect(new InetSocketAddress(ip, 26655), 10);
                    }catch(Exception e){
                        continue;
                    }
                    servers[next++] = ip;
                    componentList.add(new GuiButton(ids++, GuiMultiplayer.this, SpaceGame.WIDTH/2, SpaceGame.HEIGHT/4 - 60 + (50 * ids), ip));
                }
            }
            }catch(Exception e){
            }
        }
    }).start();
}

是否有更简单的方法来列出我的 LAN 网络上的所有设备?或者我的粗略、缓慢的解决方案是唯一的方法?

这个怪物的预览:

enter image description here

最佳答案

发现 LAN 上正在运行的应用程序实例通常是使用 UDP 广播完成的。让请求应用程序向预先确定的端口上的 LAN 子网广播 IP 发送一条请求消息,这会将消息复制到连接到该子网的每台 PC 上的该端口。您的其他应用程序可以在该端口上打开 UDP 监听套接字以接收请求。当每个应用程序收到请求时,它将拥有请求者的IP,并可以直接向其发送回复,从而允许请求者发现回复者。发送初始请求后,请求者可以等待一段时间来收集收到的所有回复,然后根据需要使用该信息。

关于java - 扫描 LAN 中的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053034/

相关文章:

objective-c - 如何在 Objective-C 中使用本地域套接字

java - 如何捕获 throws 子句中列出的异常

java - 检查字符串是否符合正则表达式要求

java - 我需要在java中使用“符号

java - @JsonRootName 无法正常工作

c - 手动完成 3 次握手?

java - 斯坦福 NLP 注释文本非常慢

Java 套接字 - 如何向多个线程发送消息?

python - 在 python 套接字中为 socket.connect() 指定源 IP 地址

php - 在 HandlerSocket 上基于原始套接字的查询中表示 NULL 键值的正确方法