Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с Telnet 
:(
    Опции темы
JulT
Дата 29.9.2005, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



Всем привет.Нам с братом дали такое задание,написать программу(обязательно GUI),которая будет по тэлнэту запускать команду,потом считывать поток данных и записывать результат в табличку jtable.
Как сделать через консоль я знаю, а вот как вести сессию в jTextArea не знаю.Вот как мы сделали через консоль:
Код

import com.jscape.inet.telnet.*;
import java.io.*;

public class Telnet_Peter extends TelnetAdapter {

        private Telnet telnet = null;
        private OutputStream output = null;
        private static BufferedReader reader = null;
        private boolean connected = false;
        public TelnetExample(String hostname) throws IOException, TelnetException {
         try{
                String input = null;
                telnet = new Telnet(hostname);
                telnet.addTelnetListener(this);
                telnet.connect();
                connected = true;
                output = telnet.getOutputStream();
               while ((input = reader.readLine()) != null) {
                        if (connected) {
                                ((TelnetOutputStream) output).println(input);
                        } else {
                                break;
                        }
                }
         }catch(Exception e){
           System.out.println("exc="+e.toString());
         }
        }

        public void connected(TelnetConnectedEvent event) {
                System.out.println("Connected");
        }

        public void disconnected(TelnetDisconnectedEvent event) {
                connected = false;
                System.out.print("Разсоединение.  Нажмите Enter для выхода.");
        }

        public void doOption(DoOptionEvent event) {
                telnet.sendWontOption(event.getOption());
        }

        public void willOption(WillOptionEvent event) {
                telnet.sendDontOption(event.getOption());
        }

        public void dataReceived(TelnetDataReceivedEvent event) {
                System.out.print(event.getData());
        }

        public static void main(String[] args) {
                try {
                    reader = new BufferedReader(new InputStreamReader(System.in));
                        System.out.print("Введите имя хоста: ");
                        String hostname = reader.readLine();
                        Telnet_Peter example = new Telnet_Peter(hostname);
                } catch (Exception e) {
                        e.printStackTrace(System.out);
                }
        }
}



PM MAIL   Вверх
LSD
Дата 29.9.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



А обязательно JTextArea? Может так можно
Код
textField.addActionListener(new ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
     JTextField textField = (JTextField) e.getSource();
     String text = textField.getText();
     ...
  }
});



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 29.9.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



Забыла сказать, что сервер под управлением Линукс
Добавлено @ 13:48
Сначала мне нужно создать соединение, после того как оно получено, нужно чтобы в JTextArea а не в консоли вывелись поля длля ввода логина и пароля, т.е. вот так:
lohin:
user:
Потом я ввожу команду, результатом которой является данные которые сгрупированы по столбикам и строчкам, далее мне нужно эти данные записать в JTable
PM MAIL   Вверх
JulT
Дата 29.9.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



HEEEEEEEEEEEEEEEEELP!!!!!!!!!!!!!!!! smile smile
PM MAIL   Вверх
Metal_Heart
Дата 29.9.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: нет
Всего: 12



Цитата(JulT @ 29.9.2005, 13:43)
Сначала мне нужно создать соединение, после того как оно получено, нужно чтобы в JTextArea а не в консоли вывелись поля длля ввода логина и пароля, т.е. вот так:
lohin:
user:
Потом я ввожу команду, результатом которой является данные которые сгрупированы по столбикам и строчкам, далее мне нужно эти данные записать в JTable


JulT, но ведь это получается та же "консоль", но ведь в GUI обычно так не делают.

Можно сделать так - возникает окошечко (модальное), в котором предлагается ввести логин и пароль, затем это окошечко закрывается, а в JTextArea указываешь, что сессию открыл пользователь такой-то.
Под JTextArea, (где нибудь снизу) расположить "JTextField", который и будет служить для ввода команд.
А сам "JTextArea" использовать только для истории ввода команд, ответов на эти команды
(типа LOG).


как тебе такой вариант?

Это сообщение отредактировал(а) Metal_Heart - 29.9.2005, 16:27


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
LSD
Дата 29.9.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



JulT я так понял тебе надо реализовать аналог консоли операционной системы с помощью JTextArea, так?
Если да то у меня есть пара идей как это реализовать smile

Цитата(JulT @ 29.9.2005, 14:43)
результатом которой является данные которые сгрупированы по столбикам и строчкам, далее мне нужно эти данные записать в JTable

Какие разделители используются пробелы или точка с запятой?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 30.9.2005, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



Цитата(LSD @ 29.9.2005, 22:27)
JulT я так понял тебе надо реализовать аналог консоли операционной системы с помощью JTextArea, так?
Если да то у меня есть пара идей как это реализовать smile

Цитата(JulT @ 29.9.2005, 14:43)
результатом которой является данные которые сгрупированы по столбикам и строчкам, далее мне нужно эти данные записать в JTable

Какие разделители используются пробелы или точка с запятой?

Данные представлены так как на рисунке.
Да в виде аналога консоли ОС
А что за идеи, прошу вас поделиться

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  clip_image002.jpg 15,31 Kb
PM MAIL   Вверх
LSD
Дата 30.9.2005, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(JulT @ 30.9.2005, 09:37)
Данные представлены так как на рисунке.

Такую строку 1 3 10.100.100.1 23 ms достаточно легко распарсить:
Код
String str = "1    3     10.100.100.1          23 ms";
String[] elements = str.split("\\s+");
for(String elem: elements)
  System.out.println('"' + elem + '"');

Дальше можно распарсить числа Integer.parseInt(elem), а можно и оставить как есть, по желанию.

А примерчик с эмуляцией консоли я чуть по позже выложу.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 30.9.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



Цитата(LSD @ 30.9.2005, 09:23)
Цитата(JulT @ 30.9.2005, 09:37)
Данные представлены так как на рисунке.

Такую строку 1 3 10.100.100.1 23 ms достаточно легко распарсить:
Код
String str = "1    3     10.100.100.1          23 ms";
String[] elements = str.split("\\s+");
for(String elem: elements)
  System.out.println('"' + elem + '"');

Дальше можно распарсить числа Integer.parseInt(elem), а можно и оставить как есть, по желанию.

А примерчик с эмуляцией консоли я чуть по позже выложу.

Буду ждать
PM MAIL   Вверх
LSD
Дата 30.9.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Вот эдакая псевдо консоль:
Код
import javax.swing.*;
import java.awt.*;
import javax.swing.text.*;
import javax.swing.text.DocumentFilter.FilterBypass;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;

public class ConsoleEmul
{
  private int stopPoint = 0;
  private boolean inserting = false;
  private ConsoleFilter filter;
  private ConsoleListner listener;
  private DefaultStyledDocument document;

  public ConsoleEmul()
  {
    document = new DefaultStyledDocument();
    filter = new ConsoleFilter();
    listener = new ConsoleListner();
    document.setDocumentFilter(filter);
    document.addDocumentListener(listener);
  }

  public Document getDocument()
  {
    return document;
  }

  public void appendText(String text)
  {
    int docLength = document.getLength();
    try
    {
      if(stopPoint < docLength)
        document.remove(stopPoint + 1, docLength - stopPoint);
      inserting = true;
      document.insertString(stopPoint, text, document.getStyle("default"));
      inserting = false;
      stopPoint += text.length();
    }
    catch(BadLocationException ex)
    {}
  }

  public static void main(String[] args)
  {
    ConsoleEmul cm = new ConsoleEmul();
    JTextArea textArea = new JTextArea(cm.getDocument(), "", 25, 80);
    textArea.setLineWrap(true);
    textArea.setFont(new Font("monspaced", Font.PLAIN, 14));

    JFrame frame = new JFrame("Console");
    frame.getContentPane().add(new JScrollPane(textArea));
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    cm.appendText("Login:");
  }

  private class ConsoleListner implements DocumentListener
  {
    public void insertUpdate(DocumentEvent e)
    {
      try
      {
        Document doc = e.getDocument();
        String text = doc.getText(e.getOffset(), e.getLength());
        int pos = text.lastIndexOf('\n');
        if(pos != -1)
        {
          if(!inserting)
          {
            String userText = doc.getText(stopPoint, (e.getOffset() + pos + 1) - stopPoint);
            userText = userText.replace("\n", "\\n");
            System.out.println("User entered: '" + userText + "'");
            //Добавить сюда обработку ввода пользователя
          }
          if( (pos + e.getOffset()) > stopPoint)
            stopPoint = pos + 1 + e.getOffset();
        }
      }
      catch(BadLocationException ex)
      {
        ex.printStackTrace();
      }
    }

    public void removeUpdate(DocumentEvent e)
    {
    }

    public void changedUpdate(DocumentEvent e)
    {
      try
      {
        Document doc = e.getDocument();
        String text = doc.getText(e.getOffset(), e.getLength());
        int pos = text.lastIndexOf('\n');
        if(pos != -1)
        {
          if( (pos + e.getOffset()) > stopPoint)
            stopPoint = pos + 1 + e.getOffset();
        }
      }
      catch(BadLocationException ex)
      {
        ex.printStackTrace();
      }
    }
  }

  private class ConsoleFilter extends DocumentFilter
  {
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.insertString(offset, string, attr);
    }

    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.remove(offset, length);
    }

    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.replace(offset, length, text, attrs);
    }
  }
}

работает следующим образом, у документа есть точка редактировать до которой нельзя, с помощью DocumentFilter мы запрещаем редактирование текста до этой точки. Т.е. что было уже введено пользователем (по нажатию Enter) и то что было напечатанно терминалом appendText() помечается как не редактируемое.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JulT
Дата 3.10.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.6.2005

Репутация: нет
Всего: 1



Цитата(LSD @ 30.9.2005, 15:09)
Вот эдакая псевдо консоль:
Код
import javax.swing.*;
import java.awt.*;
import javax.swing.text.*;
import javax.swing.text.DocumentFilter.FilterBypass;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;

public class ConsoleEmul
{
  private int stopPoint = 0;
  private boolean inserting = false;
  private ConsoleFilter filter;
  private ConsoleListner listener;
  private DefaultStyledDocument document;

  public ConsoleEmul()
  {
    document = new DefaultStyledDocument();
    filter = new ConsoleFilter();
    listener = new ConsoleListner();
    document.setDocumentFilter(filter);
    document.addDocumentListener(listener);
  }

  public Document getDocument()
  {
    return document;
  }

  public void appendText(String text)
  {
    int docLength = document.getLength();
    try
    {
      if(stopPoint < docLength)
        document.remove(stopPoint + 1, docLength - stopPoint);
      inserting = true;
      document.insertString(stopPoint, text, document.getStyle("default"));
      inserting = false;
      stopPoint += text.length();
    }
    catch(BadLocationException ex)
    {}
  }

  public static void main(String[] args)
  {
    ConsoleEmul cm = new ConsoleEmul();
    JTextArea textArea = new JTextArea(cm.getDocument(), "", 25, 80);
    textArea.setLineWrap(true);
    textArea.setFont(new Font("monspaced", Font.PLAIN, 14));

    JFrame frame = new JFrame("Console");
    frame.getContentPane().add(new JScrollPane(textArea));
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    cm.appendText("Login:");
  }

  private class ConsoleListner implements DocumentListener
  {
    public void insertUpdate(DocumentEvent e)
    {
      try
      {
        Document doc = e.getDocument();
        String text = doc.getText(e.getOffset(), e.getLength());
        int pos = text.lastIndexOf('\n');
        if(pos != -1)
        {
          if(!inserting)
          {
            String userText = doc.getText(stopPoint, (e.getOffset() + pos + 1) - stopPoint);
            userText = userText.replace("\n", "\\n");
            System.out.println("User entered: '" + userText + "'");
            //Добавить сюда обработку ввода пользователя
          }
          if( (pos + e.getOffset()) > stopPoint)
            stopPoint = pos + 1 + e.getOffset();
        }
      }
      catch(BadLocationException ex)
      {
        ex.printStackTrace();
      }
    }

    public void removeUpdate(DocumentEvent e)
    {
    }

    public void changedUpdate(DocumentEvent e)
    {
      try
      {
        Document doc = e.getDocument();
        String text = doc.getText(e.getOffset(), e.getLength());
        int pos = text.lastIndexOf('\n');
        if(pos != -1)
        {
          if( (pos + e.getOffset()) > stopPoint)
            stopPoint = pos + 1 + e.getOffset();
        }
      }
      catch(BadLocationException ex)
      {
        ex.printStackTrace();
      }
    }
  }

  private class ConsoleFilter extends DocumentFilter
  {
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.insertString(offset, string, attr);
    }

    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.remove(offset, length);
    }

    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException
    {
      if(offset >= stopPoint)
        fb.replace(offset, length, text, attrs);
    }
  }
}

работает следующим образом, у документа есть точка редактировать до которой нельзя, с помощью DocumentFilter мы запрещаем редактирование текста до этой точки. Т.е. что было уже введено пользователем (по нажатию Enter) и то что было напечатанно терминалом appendText() помечается как не редактируемое.

Пытаюсь откомпилить, он мне пишет cannot access...... и подчеркивает import javax.swing.text.DocumentFilter.FilterBypass;
PM MAIL   Вверх
LSD
Дата 3.10.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



JDK 1.4 или старше?

Можно поробовать удалить import javax.swing.text.DocumentFilter.FilterBypass;, и заменить везде FilterBypass на DocumentFilter.FilterBypass.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.