Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Работа с Telnet


Автор: JulT 29.9.2005, 13:04
Всем привет.Нам с братом дали такое задание,написать программу(обязательно 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);
                }
        }
}



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

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

Автор: JulT 29.9.2005, 14:26
HEEEEEEEEEEEEEEEEELP!!!!!!!!!!!!!!!! smile smile

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


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

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


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

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

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

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

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

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

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

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

Автор: 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), а можно и оставить как есть, по желанию.

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

Автор: JulT 30.9.2005, 10:22
Цитата(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), а можно и оставить как есть, по желанию.

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

Буду ждать

Автор: 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() помечается как не редактируемое.

Автор: JulT 3.10.2005, 11:17
Цитата(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;

Автор: LSD 3.10.2005, 12:01
JDK 1.4 или старше?

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

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