Как общаться с виртуальной машиной на Java?

1

Я сделал небольшую программу Java, которая просит человека ввести пин-код. Как только вводится пин-код, он считывается в файл "bdd.txt", в котором хранятся все булавки, а затем отображается :), если это хорошо, и :( если не так. Простое приложение до сих пор.

То, что я хочу сделать, это переместить этот файл базы данных в виртуальную машину на моем компьютере (например, Ubuntu, например), а затем сделать то же самое. Таким образом, он больше не будет локальным, так как файл больше не будет находиться в корне моего проекта.

Вот как выглядит мое приложение:

Изображение 174551Изображение 174551

Как вы можете видеть, приложение запускается, пользователю предлагается ввести пин-код. Если это хорошо, приложение будет выполнено, если у него еще 2 попытки осталось до тех пор, пока приложение не остановится.

Когда введенный штифт введен, моя программа проверяет "bdd.txt", если контакт находится там или нет. Он играет роль базы данных:

Изображение 174551

Чтобы понять, что мне нужно, необходимо ассимилировать эту программу на что-то, что необходимо для обеспечения безопасности. Мы не хотим, чтобы база данных контактов находилась на том же месте, что и программа (или устройство в реальной жизни). Поэтому мы помещаем его в виртуальную машину, и мы должны общаться между моей программой Windows7 Java в Eclipse и файлом bdd.txt на VMWare Player Ubuntu.

Мой вопрос в том, как это возможно? Как мне изменить свой код, чтобы моя программа достигла чего-то на моей виртуальной машине? Есть ли спецификационная технология, которую я должен использовать для этого? Нужно ли сначала делать некоторые конфигурации?

Вот мой код:

import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame {

    private static final long serialVersionUID = 1L;

    private JPanel container = new JPanel();
    private JPasswordField p1 = new JPasswordField(4);
    private JLabel label = new JLabel("Enter Pin: ");
    private JButton b = new JButton("OK");


    public Main() {
        this.setTitle("NEEDS");
        this.setSize(300, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());
        container.add(p1);
        JPanel top = new JPanel();

        PlainDocument document =(PlainDocument)p1.getDocument();

        b.addActionListener(new BoutonListener());

        top.add(label);
        top.add(p1);
        p1.setEchoChar('*');
        top.add(b);  

        document.setDocumentFilter(new DocumentFilter(){

            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                String string =fb.getDocument().getText(0, fb.getDocument().getLength())+text;

                if(string.length() <= 4)
                super.replace(fb, offset, length, text, attrs); //To change body of generated methods, choose Tools | Templates.
            }
        });


        this.setContentPane(top);
        this.setVisible(true);
    }

    class BoutonListener implements ActionListener {
        private final AtomicInteger nbTry = new AtomicInteger(0);
        ArrayList<Integer> pins = readPinsData(new File("bdd.txt"));

        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent e) {
            if (nbTry.get() > 2) {
                JOptionPane.showMessageDialog(null,
                        "Pin blocked due to 3 wrong tries");
                return;
            }
            final String passEntered=p1.getText().replaceAll("\u00A0", "");
            if (passEntered.length() != 4) {
                JOptionPane.showMessageDialog(null, "Pin must be 4 digits");
                return;
            }
            //JOptionPane.showMessageDialog(null, "Checking...");
            //System.out.println("Checking...");
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {
                    boolean authenticated = false;

                    if (pins.contains(Integer.parseInt(passEntered))) {
                        JOptionPane.showMessageDialog(null, ":)");
                        authenticated = true;
                    }

                    if (!authenticated) {
                        JOptionPane.showMessageDialog(null, ":(");
                        nbTry.incrementAndGet();
                    }
                    return null;
                }
            };
            worker.execute();
        }

    }

    //Function to read/access my bdd.txt file
    static public ArrayList<Integer> readPinsData(File dataFile) {
        final ArrayList<Integer> data=new ArrayList<Integer>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(dataFile));
            String line;
            try {
                while ((line = reader.readLine()) != null) {
                    try {
                        data.add(Integer.parseInt(line));
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                        System.err.printf("error parsing line '%s'\n", line);
                    }
                }
            } finally {
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("error:"+e.getMessage());
        }

        return data;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });

    }
}

Есть идеи? Благодаря,

Флоран.

Теги:
web-services
virtual

2 ответа

2
Лучший ответ

Общая папка, безусловно, будет работать, но, кажется, мало смысла иметь виртуальную машину вообще, потому что файл PIN также находится на вашей главной машине, а java читает его напрямую.

Может быть, вам нужна архитектура клиент/сервер?

Программой с пользовательским интерфейсом будет клиент. Клиент будет настроен с помощью вызова сервера (IP-адрес и порт). Клиент не имеет доступа к файлу bdd.txt, но сервер делает это.

На вашей виртуальной машине у вас есть другое Java-приложение - сервер. Ваш сервер прослушивает запросы от клиента. Запрос будет содержать PIN-код, введенный пользователем. Затем сервер проверяет его на ПИН в файле и отвечает да или нет. Ваш клиент получает ответ "да"/"нет" с сервера и возвращает результат пользователю.

Читайте о программировании Sockets здесь, чтобы начать

  • 0
    Да, я думаю, что это так. Архитектура клиент-сервер или также использование веб-сервисов?
  • 0
    Веб-сервисы сделают свое дело, и есть несколько Java HTTP серверов на выбор. Из них я использовал только Tomcat, который кажется чрезмерным для этого приложения.
Показать ещё 11 комментариев
0

Вам нужно сделать две вещи:

  1. Разделите папку между вашей ОС хоста и вашей виртуальной машиной. Это позволит вашей виртуальной машине получать доступ к файлам из операционной системы хоста. Вы хотели бы поместить свой файл в эту папку.
  2. Попросите приложение прочитать файл контактов из общей папки. Это означало бы изменение этой строки:

    ArrayList<Integer> pins = readPinsData(new File("bdd.txt"));

    Прямо сейчас этот код читает файл bdd.txt из текущего каталога, в котором находится пользователь, и я предполагаю, что это каталог, в котором находится ваш исполняемый файл. Вместо этого вы хотите, чтобы это указывало на pin файл в вашей общей папке. Чтобы сделать ваш код как можно более гибким, вы можете перейти к пути к pin файлу в качестве аргумента командной строки при запуске программы.

  • 0
    На самом деле я думал, чтобы избежать этого способа добраться до файла. Это все о безопасности. Файл должен быть в стороне от программы. Я думал: веб-сервисы?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню