Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Аплет-чат (установка соединения)


Автор: giperborey 3.3.2006, 14:31
Следующая ниже функция - попытка по нажатию на кнопку в аплете, создать серверный сокет...
Но приводит она к зависанию... Создание серверного сокета в ините блокирует прорисовку до прихода запроса на соединение... в старте вроде таже ерунда...
какой более оптимальный вариант?
может события в аплетах и создание сокетов мало совместимы? непонятно чего на этой функции так глобально ява подвисает
Код
  void doConnect()
  {
    try
    {
      int port = 17171;
      listener = new ServerSocket(port);
      connection = listener.accept();
      listener.close();
      incoming = new InputStreamReader(connection.getInputStream());
      outgoing = new PrintWriter(connection.getOutputStream());
    }
    catch(IOException e)
    {
      transcript.setText("Error opening I/O stream!\n Connection can't be used \n You can close the window now\n");
      closeButton.setText("Close Window");
      sendButton.setEnabled(false);
      clearButton.setEnabled(false);
      this.connection = null;
    }
    if(this.connection != null)
    {
      reader = new Thread(this);
      reader.start();
      //waitFor = false;
      if(!waitFor)
      {
        //sendButton.setEnabled(false);
        transcript.setText("Waiting for connection\n");
        outgoing.println(HANDSHAKE);
        outgoing.flush();
        waitFor = true;
      }
    }
  }

Автор: LSD 3.3.2006, 14:45
1. Для вставке кода используй кнопку Код
2. Неподписанный апплет не может слушать сокет. По идее ты должен был в консоли получить SecurityException.

Автор: giperborey 3.3.2006, 15:06
я пока на локалхосте эксперементирую... поэтому слушает... для рабочей версии на сервере конечно структуру нужно будет менять...
и ситуация такова что при использования инита аплет грузится пока не пришел запрос к сокету...
запрос пришел - связь установилась можно обмениватся сообщениями...
а вот попытки запускать прослушку порта по событию пока пшик... smile
попробую не ранебл а треад использовать там можно приоритет снизить... мот поможет
Добавлено @ 15:18
так
такой обработчик события проходит без зависания...
Код

void doConnect()
{
Runnable doit = new Runnable()
{
public void run()
    {
    transcript.setText("Îæèäàíèå ñîåäèíåíèÿ...");
    }
};
SwingUtilities.invokeLater(doit);
conct = new connect();
conct.start();




}

только сообщения пока в одну сторону передаются, но это думаю нужно переменные пересмотреть,
вероятней всего в классе conct переменная соединения не видна для обработчика входного потока...

Автор: LSD 3.3.2006, 16:45
Цитата(giperborey @ 3.3.2006, 14:31 Найти цитируемый пост)
Но приводит она к зависанию... Создание серверного сокета в ините блокирует прорисовку до прихода запроса на соединение... в старте вроде таже ерунда...

Я не очень внимательно прочитал сначала, так и должно быть. Обработчик кнопки выполняется в EventDispathThread, в этом же потоке выполняется прорисовка компонентов и обработка событий от мыши и клавиатуры.
Так что вполне естественно, что у тебя вся прорисовка встает на ServerSocket.accept(), вынеси прослушивание порта в отдельный поток.

Автор: giperborey 4.3.2006, 15:09
Подписал аплеты - пока после первого тестирования наблюдается работа smile
Так что тему можно помечать как решенную...
Кстати форум оч хорош... Дизайн особенно... И материала много, очень полезная штука для начинающего

Автор: LSD 4.3.2006, 21:09
Заходи еще smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)