Нужна помощь в улучшении слушателя порта Java-клиента - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть небольшой кусочек кода, который запускается в апплете, который содержит элементы управления SWING и используется для записи информации в сокет на определенном порте, а затем прослушивает ответ.Это работает нормально, но есть проблема с этим.Слушатель порта находится в цикле, пока сервер не получит нулевое значение.Я хочу, чтобы пользователи могли выполнять другие действия в графическом пользовательском интерфейсе, создаваемом апплетом, в ожидании ответа сервера (это может занять несколько минут).Мне также нужно беспокоиться о разрыве соединения между сервером и клиентом.Но при написании кода апплет, кажется, зависает (это действительно в цикле), пока сервер не ответит.Как я могу позволить слушателю выполнять его прослушивание в фоновом режиме, позволяя другим вещам происходить в программе.Я предполагаю, что мне нужно использовать потоки, и я уверен, что для этого приложения это легко реализовать, но мое отсутствие твердого фундамента мешает мне.Ниже приведен код (вы можете увидеть, как это просто).Как я могу улучшить его, чтобы он делал то, что мне нужно, чтобы сделать>> 1001 *

  public String writePacket(String packet) {
/* This method writes the packet to the port - established earlier */
   System.out.println("writing out this packet->"+packet+"<-");
   out.println(packet);
  String thePacket =    readPacket();  //where the port listener is invoked.  
   return thePacket;
   }
    private String readPacket() {
      String thePacket ="";
      String fromServer="";
      //Below is the loop that freezes everything.   
     try {
      while ((fromServer = in.readLine()) != null) { 
        if (thePacket.equals("")) thePacket = fromServer;
        else 
        thePacket = thePacket+newLine+fromServer;
    }
        return thePacket;  //when this happens, all listening should stop.   
   } catch (IOException e) {
        // TODO Auto-generated catch block
    e.printStackTrace();
    return null;
    }

     }  

Спасибо,

Эллиот

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Существует множество способов выполнения ввода-вывода в другом потоке, но в этом случае вы, вероятно, захотите использовать SwingWorker .

Ваш код будет выглядеть примерно так:

private final Executor executor = Executors.newSingleThreadExecutor();

public void writePacket(final String packet) 
{
  // schedules execution on the single thread of the executor (so only one background operation can happen at once)
  //
  executor.execute(new SwingWorker<String, Void>()
      {

        @Override
        protected String doInBackground() throws Exception
        {
          // called on a background thread


          /* This method writes the packet to the port - established earlier */
          System.out.println("writing out this packet->"+packet+"<-");
          System.out.println(packet);
          String thePacket = readPacket();  //where the port listener is invoked.  
          return thePacket;            
        }

        @Override
        protected void done()
        {
          // called on the Swing event dispatch thread


          try
          {
            final String thePacket = get();

            // update GUI with 'thePacket'
          }
          catch (final InterruptedException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          catch (final ExecutionException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } 
        }
      });
}

private String readPacket() 
{
  String thePacket ="";
  String fromServer="";
  //Below is the loop that freezes everything.   
  try 
  {
    while ((fromServer = in.readLine()) != null) 
    { 
      if (thePacket.equals("")) 
        thePacket = fromServer;
      else 
        thePacket = thePacket+newLine+fromServer;
    }
    return thePacket;  //when this happens, all listening should stop.   
  } 
  catch (IOException e) 
  {
    e.printStackTrace();
    return null;
  }
}
0 голосов
/ 07 сентября 2011

Все сетевые операции ввода-вывода должны выполняться в отдельном потоке.

BTW readLine () возвращает ноль, когда сервер закрывает соединение, а не когда он завершил отправку данных на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...