Java Работа в сети Как использовать NetworkInterface, чтобы получить список NICS системы и заполнить поле со списком для выбора пользователя? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу создать приложение, которое позволит пользователю выбрать логический сетевой интерфейс в своей системе и получить для него локальный IP-адрес. Я решил использовать метод выбора, потому что в моей системе сетевой интерфейс по умолчанию, который получает InetAddress.getLocalHost (), является адресом петлевого интерфейса. Я уверен, что другие люди будут иметь такую ​​же проблему. Я каким-то образом неправильно использую объект NetworkInterface в моей программе, когда он помещает системные интерфейсы в массив данных в al oop, а затем заполняет комбинированный список из объектов networkInterface в массиве. Существует метод, который получает сетевые интерфейсы от системы по одному до 12, и метод, который добавляет объекты из массива в выпадающий список. Программа не заполняет комбинированный список объектами из массива с помощью метода getName (). Программа должна отобразить имена сетевых адаптеров в выпадающем списке, а затем получить локальный IP-адрес для соответствующего NI C, выбранного пользователем. Что я делаю не так и что я должен делать вместо этого? Любое предложение приветствуется.

import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.ComboBox;
 import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
 import javafx.scene.layout.GridPane;
 import javafx.stage.Stage;   
 import java.io.IOException;
 import java.net.*;
 import java.util.ArrayList;
 import java.util.Enumeration;

    public class Main extends Application { 
      //Arraylist that stores network interface objects from the system's network interfaces 
      ArrayList<NetworkInterface> Interfaces = new ArrayList<>();

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Advanced IP Address Finder");
        GridPane gp = new GridPane();
        primaryStage.setScene(new Scene(gp, 300, 275));
        primaryStage.show();


        //Text Fields and labels for displaying IP addresses
        Label PublicAddress = new Label("Public");
        gp.setConstraints(PublicAddress, 0,0);

        TextField publicAddress = new TextField();
        gp.setConstraints(publicAddress, 1,0);

        Label LocalAddress = new Label("Local");
        gp.setConstraints(LocalAddress, 0,1);

        TextField localAddress = new TextField();
        gp.setConstraints(localAddress, 1,1);

        ComboBox PickInterface = new ComboBox();
        gp.setConstraints(PickInterface, 2,1);
        //Populates arraylist with network interfaces and then populates combobox with entries from arraylist before calculation
        discoverNetworkInterfaces(Interfaces);
        populateComboBox(PickInterface,Interfaces);

        //Calculates IP addresses by querying network interfaces
        Button GetAddress = new Button("Get Addresses");
        gp.setConstraints(GetAddress, 1,2);
        GetAddress.setOnAction(e-> {
            try{
                NetworkInterface nif = NetworkInterface.getByName(PickInterface.getValue().toString());
                Enumeration<InetAddress> nifAddresses = nif.getInetAddresses();
                Socket socket = new Socket();
                socket.bind(new InetSocketAddress(nifAddresses.nextElement(), 0));
                socket.connect(new InetSocketAddress(9999));

            }catch(SocketException e1){
                e1.printStackTrace();
            }catch(IOException e2){
                e2.printStackTrace();
            }
        });
        gp.getChildren().addAll(GetAddress, PickInterface, localAddress, LocalAddress, PublicAddress, publicAddress);
    }
    //discovers up to 12 network interfaces on a system and adds them to the arraylist
    public void discoverNetworkInterfaces(ArrayList <NetworkInterface> interfaces){
        for(int count=0; count <= 12; count++) {
            try {
                NetworkInterface nif = NetworkInterface.getByIndex(count);
                interfaces.add(nif);
            }catch(SocketException e){
                e.printStackTrace();
            }
        }
    }
    public NetworkInterface getNetworkInterface(ArrayList <NetworkInterface> interfaces, int i){
        return interfaces.get(i);
    }
    //Uses the populated arraylist to populate the combobox with network interfaces
    public void populateComboBox(ComboBox comboBox, ArrayList<NetworkInterface> interfaces) {
        for(int count =0; count <=12; count++) {
            if(interfaces.get(count) == null){
                break;
            }
            //something here is causing the system to not add the network controllers to the combobox from the arraylist
            comboBox.getItems().add(interfaces.get(count).getName());
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
 }
...