2015-06-05 3 views
-1

Теперь сегодня я тестировал код сервера и клиента на другой машине. Оба были в одной сети Wi-Fi.java.net.ConnectException: время ожидания подключения: дополнительная информация

Я создал клиентов, используя ниже код и получил это исключение для многих нитей:

java.net.ConnectException: Connection timed out: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source) at SocketTest.connect(Client.java:188) at SocketTest.run(Client.java:73) at java.lang.Thread.run(Unknown Source)

линия 73 является connect(key) и линия 188 является if(!(channel.finishConnect()))

Таким образом, клиентский поток не смог подключиться потому что на сервер не ответили? Правильно ?

Вопрос) Когда я запускаю оба сервера и клиента на одном и том же локальном компьютере, это исключение не возникает. Каковы могут быть причины? (проблемы с сетью ?).

Также я использую параметр очереди Backlog в public void bind (конечная точка SocketAddress, int backlog) как 2000. Хотя точный размер неизвестен (около 200?), Но я использую большое значение, чтобы использовать максимальное значение. (Правильно? Или Java сделает очередь?).

Возможно, это причина: сервер ставит запрос в очередь на отставание и до тех пор, пока он не получит время для его обслуживания, таймаут может произойти на клиенте?

Клиент:

public class Client { 

public static void main(String[] args) { 

    int n=100; 
    SocketTest [] st= new SocketTest[n]; 
    for(int i=0;i<n;i++) 
     st[i]= new SocketTest("hi"); 


    for(int i=0;i<n;i++) 
    { 
     if(i%50 == 0) 
     try{ 
      Thread.sleep(5000); 
     } 
     catch(InterruptedException ie) 
     { 
      System.out.println(""+ie); 
     } 
     new Thread(st[i]).start(); 

    } 
} 
} 
class SocketTest implements Runnable { 

    private String message = ""; 
    ByteBuffer readBuffer = ByteBuffer.allocate(1000); 
    private Selector selector; 
    private int i; 
    public static AtomicInteger cnt= new AtomicInteger(0); 

    public SocketTest(String message){ 
     this.message = message; 
    } 

    @Override 
    public void run() { 
     SocketChannel channel; 
     try { 
      selector = Selector.open(); 
      channel = SocketChannel.open(); 
      channel.configureBlocking(false); 

      channel.register(selector, SelectionKey.OP_CONNECT); 

      channel.connect(new InetSocketAddress("192.168.1.10", 8511)); 

      while (!Thread.currentThread().isInterrupted()){ 

       selector.select(); 

       Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); 

       while (keys.hasNext()){ 
        SelectionKey key = keys.next(); 
        keys.remove(); 

        if (!key.isValid()) continue; 

        if (key.isConnectable()){ 
          connect(key); 
         System.out.println("I am connected to the server"); 
        } 
        if (key.isWritable()){ 
         write(key); 
        } 
        if (key.isReadable()){ 
         read(key); 
        } 
       } 
      } 
     } 
     catch(ClosedByInterruptException e) 
     { 
      // let go of thread 
     } 
     catch(CancelledKeyException e){ 

      e.printStackTrace(); 
     } 
     catch (IOException e1) { 
      System.out.println("IOE Occured|maybe Server died"); 
      e1.printStackTrace(); 
     } finally { 
      close(); 
     } 
    } 

    private void close(){ 

     try { 
       if(selector!=null) 
        selector.close(); 
      } 
      catch(Exception e) 
      { 
        e.printStackTrace(); 
      } 

    } 

    private void read (SelectionKey key) throws IOException { 
     SocketChannel channel = (SocketChannel) key.channel(); 

     readBuffer.clear(); 
     int length; 
     try{ 
     length = channel.read(readBuffer); 

     } catch (IOException e){ 
      System.out.println("Reading problem, closing connection for : "+channel.getLocalAddress()); 
      key.cancel(); 
      channel.close(); 
      return; 
     } 
     if (length == -1){ 
      System.out.println("Nothing was read from server"); 
      channel.close(); 
      key.cancel(); 
      return; 
     } 
     readBuffer.flip(); 
     byte[] buff = new byte[1024]; 
     readBuffer.get(buff, 0, length); 
     //length=buff.length; 

     String fromserver = new String(buff,0,length,"UTF-8"); 
     length = fromserver.length(); 
     System.out.println("Server said: "+fromserver); 

     key.interestOps(SelectionKey.OP_WRITE); 
    } 

    private void write(SelectionKey key) throws IOException { 
     SocketChannel channel = (SocketChannel) key.channel(); 
     i++; 
     message = "location now "+i; 
     if(i==2) 
     { 
      cnt.addAndGet(1); 
      System.out.println("****"+cnt.get()+"****"); 
     } 

     try{ 
      Thread.sleep(5000); 
     } 
     catch(InterruptedException ie) 
     { 
      System.out.println(""+ie); 
      //Thread.currentThread().interrupt(); 
     } 

     //assuming all goes in one shot 
     channel.write(ByteBuffer.wrap(message.getBytes())); 

     key.interestOps(SelectionKey.OP_READ/*|SelectionKey.OP_WRITE*/); 
    } 

    private void connect(SelectionKey key){ 
     SocketChannel channel= (SocketChannel) key.channel(); 

     try 
     { 
      if(!(channel.finishConnect())){ 
       //System.out.println("* Here *"); 
       return; 
      } 
     } 
     catch(ConnectException e){ 
      System.out.println("Conect Exception"); 
      e.printStackTrace(); 
      try{channel.close();} 
      catch(IOException ie){ie.printStackTrace();key.cancel();return;} 
      return; 
     } 
     catch(IOException e) 
     { 
      System.out.println("BP 1"+e); 
      e.printStackTrace(); 
      try{channel.close();} 
      catch(IOException ie){ie.printStackTrace();key.cancel();return;} 
      return; 
     } 
      //channel.configureBlocking(false); 
      //channel.register(selector, SelectionKey.OP_WRITE); 
     key.interestOps(SelectionKey.OP_WRITE); 

    } 
} 
+0

[Почему этот код все еще содержит все те же ошибки, о которых я уже говорил вам неделю назад?] (Http: // stackoverflow.com/a/30473569/207421) – EJP

+0

возможный дубликат [исключение клиента NIO: java.net.ConnectException: соединение отказано: никакой дополнительной информации] (http://stackoverflow.com/questions/30473163/nio-client-giving- exception-java-net-connectexception-connection-отказано-нет) – canihavesomecoffee

+0

@wforums Этот вопрос отличается от этого. В этом случае ** соединение было отказано ** было проблемой здесь ** время соединения **. –

ответ

0

на соединение истекло, так как сервер не ответил.

Когда я запускаю оба сервера и клиента на одном и том же локальном компьютере, это исключение не возникает. Каковы могут быть причины? (проблемы с сетью ?).

Почему должен возникает? Сервер есть, клиент есть, нет сетевых проблем между ними. Вопрос не имеет смысла.

Кроме того, я также использовать параметр очереди нерассмотренных в общественном ничтожной Bind (SocketAddress конечной точки, внутр задела) в 2000 Хотя точный размер неизвестен (около 200?), Но я использую большое значение, так что максимальное значение будет используемый. Правильно?

Право.

или Java сделает очередь?

Я не знаю, что это значит. Java не делает ничего с параметром backlog. Он идет прямо к TCP.

Возможно, это причина: сервер ставит запрос в очередь на отставание и пока не настало время для его обслуживания, таймаут может произойти на клиенте?

Номер только завершено Соединения отправляются в очередь на отставание.

+0

я прочитал это: происходят таймаутов соединения, когда: 1. IP-адрес запрашиваемого сервера успешно найден 2.Подключения пакеты истеблишмента отправляется на IP-адрес адреса назначения 3. преднамеренно игнорирует или не получает их Подобно таймауту соединения - это отказ от соединения, но в этом случае система назначения фактически отправляет пакеты обратно, говоря «уходи». Нет доступных услуг. Верно ли это? Итак, сервер не получает запрос? –

+0

Он не ответил. Это все, что мы знаем. Возможно, он не получил запрос: может быть, ответ потерялся. – EJP

+0

Так что этого не произошло на локальном хосте и произошло в сети. Так что это проблема сети. Правильно? Теперь может быть причина перегруженности? Проблема с маршрутизатором? –

Смежные вопросы