Подключение сервера и клиентского сокета по Wi-Fi - PullRequest
0 голосов
/ 15 февраля 2020

Вот код сервера

   void bind(String ip,int port)
   {
    socket=ServerSocketChannel.open();
    socket.configureBlocking(false);

    socket.register(acceptChannel=Selector.open(),SelectionKey.OP_ACCEPT);//Since Non Blocking Create Selector
    socket.bind(new InetSocketAddress(ip,port));//Binding To Specified IP,Port So clients can connect

    accept=threadService.scheduleAtFixedRate(this,100,interval,TimeUnit.MILLISECONDS);
   }

    void run()//Just Loops And Checks For New Clients
    {
     try
     {
      if(acceptChannel.selectNow()==0){return;}

      Set<SelectionKey> channels=acceptChannel.selectedKeys();
      Iterator<SelectionKey> iterator=channels.iterator();

      while(iterator.hasNext())
      {
       SelectionKey key=iterator.next();
       ServerSocketChannel server=(ServerSocketChannel)key.channel();

       SocketChannel client=server.accept();
       client.configureBlocking(false);

       //Do Stuff With Client        

       iterator.remove();
      }
      channels.clear();
     }
     catch(Exception ex){errors.newClientError(ex,mainSocket,client);}
   }

И вот код клиента

    SocketChannel clientSocket;
    void connect(String IP,int port)throws IOException
     {
      clientSocket=SocketChannel.open();
      clientSocket.configureBlocking(false);

      clientSocket.register(connectChannel,SelectionKey.OP_CONNECT);//Non Blocking So Loop to check for status
      clientSocket.connect(new InetSocketAddress(IP,port));//Do Actual Connection Here

      waiting=threadService.scheduleAtFixedRate(this,100,10,TimeUnit.MILLISECONDS);
     }

     public void run()//Loops and checks for successful connection
     {
      try
      {
       if(connectChannel.selectNow()==0){return;}

       Set<SelectionKey> channels=connectChannel.selectedKeys();
       Iterator<SelectionKey> iterator=channels.iterator();

       while(iterator.hasNext())
       {
        SelectionKey client=iterator.next();
        SocketChannel channel=(SocketChannel)client.channel();

        if(channel.finishConnect())
        {
         client.cancel();

         iterator.remove();
         channels.clear();

         //Yeah we are connected job done

         return;
        }

        iterator.remove();
       }
       channels.clear();
      }
      catch(Exception ex)
      {

      }
     }

Как вы видите Мой клиент и сервер должны находиться в неблокирующем режиме для определения проекта c целях.

Теперь этот код работает, когда

1) И клиент, и сервер находятся на одном компьютере, а параметр IP клиента и сервера - "localhost"

2) И клиент, и сервер находятся на одном компьютере, а параметр IP клиента и сервера - это сетевой адрес моего маршрутизатора [Я в windows, поэтому я go ввожу команду ipconfig в cmd и передаю адрес IPV4 в оба этих метода]

Проблема в том, что Мой клиент не может подключиться к моему серверу, когда он находится в другой системе, подключенной по Wi-Fi / локальной сети.

Я привязываю свой сервер к IPV4-адресу моего маршрутизатора и даю тот же адрес моему Метод connect () клиента на другом компьютере, но он получает «ConnectionTimedOutException»

Параметр порта одинаков для клиента и сервера, который равен 8001

Обе системы f irewalls отключены для этого теста.

Есть идеи, что происходит?

1 Ответ

0 голосов
/ 16 февраля 2020

Мне пришлось использовать переадресацию портов для решения моей проблемы

Я предпринял следующие шаги

1) Клиент использует мой глобальный [не локальный ipv4] адрес, который я получил из сети [whatsmyip .com] в методе connect ()

2) На моем сервере я вызываю bind (), используя мой локальный адрес ipv4 [из ipconfig]

3) Общий порт, который я использовал, был 8001, который Мне пришлось настроить переадресацию портов в настройках маршрутизатора, чтобы он пересылал все пакеты с моего глобального ip: порта XXX.XXX.XXX.XXX:8001 на мой локальный адрес ipv4: порт 192.168.xxx.xxx:8001

Этот подход работает, но не эффективен, так как мой IP-адрес меняется, когда я отключаюсь и снова подключаюсь. Если кто-нибудь знает лучшее решение для подключения к серверу без настройки IP-адреса stati c, пожалуйста, поделитесь. Спасибо

...