2016-04-04 6 views
-2

Я пытаюсь реализовать Thread, который непрерывно связывает подключения к локальной сети. Я хотел бы сделать это, создав новый Socket для каждого IP-адреса, обрабатывая исключения, если он не может подключиться. Однако выполнение последовательности тайм-аутов при создании сокета (я подписал его с комментарием в коде).Java многопоточность, сокеты

Как я могу решить эту проблему?

class Ping implements Runnable 
{ 

    private int actPort = 1024; 

    public void run() 
    {   
     Socket s; 
     int[] ip = {192,168,0,0}; 

     while(true){ 

      try { 

       for(int i = 0;i<256;i++) 
       { 
        ip[2] = i; 

        for(int j = 0;j<256;j++) 
        { 

         ip[3] = j; 
         String address = ip[0]+"."+ip[1]+"."+ip[2]+"."+ip[3]; 
         s = new Socket(address,actPort); // EXECUTION STOPS 
         System.out.println(address);        
        } 
       }     

      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 

     } 

    } 
} 

Спасибо за ваше время

+0

делает это тайм-аут в конце концов? –

+0

Нет, извините я редактировал вопрос. – freestar

+0

так почему вы думаете, что не будет тайм-аут, если IP-адрес не существует? –

ответ

1

Вы создаете Socket, который является TCP/IP поток и создает statefull связь между вами (клиентом) и с учетом IP, PORT. Я предполагаю, что эта программа останавливается при создании первого Socket.

Если посмотреть на API из Socket класса:

* If UDP socket is used, TCP/IP related socket options will not apply. 
* 
* @param  host  the IP address. 
* @param  port  the port number. 
* @param  stream if {@code true}, create a stream socket; 
*      otherwise, create a datagram socket. 
@Deprecated 
public Socket(InetAddress host, int port, boolean stream) throws IOException { 
    this(host != null ? new InetSocketAddress(host, port) : null, 
     new InetSocketAddress(0), stream); 
} 

Это @Deprecated версии создания сокета UDP, но то, что вам действительно нужно DatagramPacket от java.net, который создает лицо без связи, и может быть истек если пакет не завершился.

Посмотрите здесь какой-то пример кода написания DatagramPacket:

https://github.com/awadalaa/Socket-Programming-Java/blob/master/UDP-Pinger/PingClient.java

1

Вы пытаетесь сделать как сканер IP (цикл по всем 192.168) и сканер портов. Таким образом, вы могли бы искать решения для обоих: java code to ping an IP address Sockets: Discover port availability using Java

Для многопоточной части, он делает 65536 значение, чтобы проверить, было бы слишком много нитей, так что вы можете использовать ThreadPool с исполнителями, и отменить его, если он принимает слишком долго.

см метод использовать (я позволю вам сделать алгоритм

tp = Executors.newWorkStealingPool(512); // to create up to 512 Threads 
//todo the creation loop... 
future = tp.submit(()->{/* your port scan */ return true;}); 
//todo the waiting processing 
future.cancel(true);// to cancel your future 
Смежные вопросы