Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在网络中查找服务器_Java_Sockets_Networking - Fatal编程技术网

Java-在网络中查找服务器

Java-在网络中查找服务器,java,sockets,networking,Java,Sockets,Networking,当我不知道ip时,我想在我的网络中找到我的服务器。 这就是我的代码,但测试所有IP确实需要(!)很长时间: for (int j = 1; j < 255; j++) { for (int i = 1; i < 255; i++) { String iIPv4 = "192.168." + j + "."; try { Socket socket = new Socket(); SocketAddress ad

当我不知道ip时,我想在我的网络中找到我的服务器。 这就是我的代码,但测试所有IP确实需要(!)很长时间:

for (int j = 1; j < 255; j++) {
   for (int i = 1; i < 255; i++) {
       String iIPv4 = "192.168." + j + ".";
       try {
          Socket socket = new Socket();
          SocketAddress address = new InetSocketAddress(iIPv4 + i, 2652 );
          socket.connect(address, 5);
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          String fromServer;
          while ((fromServer = in.readLine()) != null) {
             if (fromServer.equals("Connected to CC3000")) {
                System.out.println("CC3000 found! : " + iIPv4 + i);
                return iIPv4 + i;
             }
          }
       } catch (UnknownHostException e) {
       } catch (IOException e) {
       }
   }
}
for(int j=1;j<255;j++){
对于(int i=1;i<255;i++){
字符串iIPv4=“192.168.+j+”;
试一试{
套接字=新套接字();
SocketAddress地址=新的InetSocketAddress(iIPv4+i,2652);
插座连接(地址5);
BufferedReader in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
来自服务器的字符串;
而((fromServer=in.readLine())!=null){
if(fromServer.equals(“连接到CC3000”)){
System.out.println(“找到CC3000!:”+iIPv4+i);
返回iIPv4+i;
}
}
}捕获(未知后异常e){
}捕获(IOE异常){
}
}
}
那么,找到服务器的更好方法是什么


关于

我认为多线程可以帮助您,因为您不希望等待每个连接建立或失败。

你可以试着一次说几百个插座。另外,检查IP是否可访问可能会为您节省一些时间

下面的代码确实是一个幼稚而可怕的例子,因为根本没有线程管理,但我希望您能理解。你应该更快地得到结果

public static void findLanSocket(final int port, final int timeout) {
    List<Thread> pool = new ArrayList<>();

    for (int j = 1; j < 255; j++) {
        for (int i = 1; i < 255; i++) {
            final String iIPv4 = "192.168." + j + "." + i;

            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    System.out.println("TESTING: " + iIPv4);

                    try {
                        // First check if IP is reachable at all.
                        InetAddress ip = InetAddress.getByName(iIPv4);
                        if (!ip.isReachable(timeout)) {
                            return;
                        }

                        // Address is reachable -> try connecting to socket.
                        Socket socket = new Socket();
                        SocketAddress address = new InetSocketAddress(ip, port);
                        socket.connect(address, timeout);

                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String fromServer;
                        while ((fromServer = in.readLine()) != null) {
                            if (fromServer.equals("Connected to CC3000")) {
                                System.out.println("CC3000 found! : " + iIPv4);
                            }
                        }

                    } catch (UnknownHostException e) {
                    } catch (IOException e) {
                    }
                }
            });

            pool.add(thread);
            thread.start();
        }
    }

    // Wait for threads to die.
    for (Thread thread : pool) {
        try {
            if (thread.isAlive()) {
                thread.join();
            }
        } catch (InterruptedException ex) {
        }
    }
}
公共静态void findLanSocket(最终int端口,最终int超时){
列表池=新的ArrayList();
对于(int j=1;j<255;j++){
对于(int i=1;i<255;i++){
最终字符串iIPv4=“192.168.+j+”+i;
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
系统输出打印项次(“测试:+iIPv4);
试一试{
//首先检查IP是否可以访问。
InetAddress ip=InetAddress.getByName(iIPv4);
如果(!ip.isReachable(超时)){
返回;
}
//地址可访问->尝试连接到套接字。
套接字=新套接字();
SocketAddress地址=新的InetSocketAddress(ip,端口);
socket.connect(地址、超时);
BufferedReader in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
来自服务器的字符串;
而((fromServer=in.readLine())!=null){
if(fromServer.equals(“连接到CC3000”)){
System.out.println(“找到CC3000!:”+iIPv4);
}
}
}捕获(未知后异常e){
}捕获(IOE异常){
}
}
});
pool.add(线程);
thread.start();
}
}
//等待线程死亡。
for(线程:池){
试一试{
if(thread.isAlive()){
thread.join();
}
}捕获(中断异常例外){
}
}
}

如果您知道服务器的主机名和域,您可以直接使用它。这需要很长时间!您正在尝试对每个主机执行TCP连接。让您的服务器监听广播/多播数据包并做出响应(假设本地局域网-类似于UPnP的工作方式)怎么样?DNS失败?@RomanC我知道,但我想让它变得动态。@chrixm不知道你的确切意思。你能给我解释一下如何通过广播来实现吗?正如其他评论所说,这不是最好的解决方案。这就是说,由于您可能在本地LAN上,因此可以通过将连接超时减少到500毫秒来加快速度。