Я хочу создать приложение, которое позволит пользователю выбрать логический сетевой интерфейс в своей системе и получить для него локальный 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);
}
}