扫描局域网的插槽?

时间:2013-02-24 15:05:05

标签: java sockets

我正在创建一个基本的小游戏,我希望它能够使用套接字扫描局域网,我当前的代码工作,但它是粗糙和缓慢。

我当前的代码是这样的,它获得当前计算机前2个八度音程(例如192.168),然后它执行双重for循环(0-255)从192.168.0.0扫描到192.168.255.255,在我看来这个扫描局域网中的所有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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

我的建议是多线程化您的应用程序,以便您一次启动多个连接。如果您之前没有完成多线程Java应用程序,请查看Java Concurrency tutorials如何执行此操作。

编辑:您当然也可以在评论中将其与其他人的建议结合起来。事实上,在处理并发之前,我可能会使用他们的建议。