Сокетная связь в JavaFX - PullRequest
       2

Сокетная связь в JavaFX

0 голосов
/ 30 ноября 2018

Я пытаюсь разработать почтовый сервер, способный управлять тремя и более клиентами.Сейчас я ориентируюсь только на первого клиента.Механизм, который я использую, заключается в следующем: клиент отправляет свой адрес электронной почты (String) на сервер, чтобы он мог попасть в нужный каталог и извлечь текст из .txt (которые являются электронными письмами).Это структура каталога сервера:

                                  $package
                                     |
                  +------------+----------------------------+
                  |            |                            |
             Server.java  ServerController.java       email@email.com/            
                                                            |
                                                            +
                                                   +--------|---------+
                                                 1.txt     2.txt     3.txt 

Это файл ServerController, который выполняет потоки:

public class ServerController {

@FXML
private TextArea textarea;

public void initModel() {
    try {
        int i = 1;
        ServerSocket s = new ServerSocket(5000);
        while (true) {
            Socket incoming = s.accept(); // si mette in attesa di richiesta di connessione e la apre
            textarea.setText("Waiting for connections");
            Runnable r = new ThreadedEchoHandler(incoming, i);
            new Thread(r).start();
            i++;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ThreadedEchoHandler implements Runnable {

    private Socket incoming;
    private int counter;

    /**
     * Constructs a handler.
     *
     * @param i the incoming socket
     * @param c the counter for the handlers (used in prompts)
     */
    public ThreadedEchoHandler(Socket in, int c) {
        incoming = in;
        counter = c;
    }

    public void run() {
        String nomeAccount = "";
        try {
            //PHASE 1: The server receives the email
            try {
                InputStream inStream = incoming.getInputStream();
                Scanner in = new Scanner(inStream);
                nomeAccount = in.nextLine(); //ricevo il nome
            } catch (IOException ex) {
                Logger.getLogger(ServerController.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    incoming.close();
                } catch (IOException ex) {
                    Logger.getLogger(ServerController.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            //PHASE 2: I'm getting all the emails from the files
            File dir = new File(nomeAccount);
            String[] tmp = new String[5];
            ArrayList<Email> arr = new ArrayList<Email>();
            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
            int i = 0;
            for (File file : dir.listFiles()) {
                if (file.isFile()) {
                    Scanner input = new Scanner(System.in);
                    input = new Scanner(file);
                    while (input.hasNextLine()) {
                        tmp[i++] = input.nextLine();
                    }
                    input.close();
                }
                Date data = df.parse(tmp[4]);
                arr.add(new Email((Integer.parseInt(tmp[0])), tmp[1], nomeAccount, tmp[2], tmp[3], data));
                i = 0;
            }

            //PHASE 3: The server sends the ArrayList to the client
            try {
                ObjectOutputStream objectOutput = new ObjectOutputStream(incoming.getOutputStream());
                objectOutput.writeObject(arr);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ServerController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(ServerController.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                incoming.close();
            } catch (IOException ex) {
                Logger.getLogger(ServerController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Как видите, я делю его нафазы, чтобы лучше понять механизм.В клиенте у меня есть DataModel, которая запоминает список адресов электронной почты и устанавливает соединение с сокетом.Это код:

public void loadData() throws IOException {
    Socket s = new Socket("127.0.0.1", 5000);
    System.out.println("I've created the socket");
    ArrayList<Email> email = new ArrayList<Email>();

    //PHASE 1: The client sends a string to the server
    try {
        InputStream inStream = s.getInputStream();
        OutputStream outStream = s.getOutputStream();
        PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
        out.print(account); //Sends account name

        //PHASE 2: The client receives the ArrayList with the emails
        ObjectInputStream objectInput = new ObjectInputStream(s.getInputStream()); //Error Line!
        try {
            Object object = objectInput.readObject();
            email = (ArrayList<Email>) object;
            System.out.println(email.get(1));
        } catch (ClassNotFoundException e) {
            System.out.println("The list list has not come from the server");
            e.printStackTrace();
        }

    } finally {
        s.close();
    }

    //Casting the arrayList
    emailList = FXCollections.observableArrayList(email);

    //Sorting the emails
    Collections.sort(emailList, new Comparator<Email>() {
        public int compare(Email o1, Email o2) {
            if (o1.getData() == null || o2.getData() == null) {
                return 0;
            }
            return o1.getData().compareTo(o2.getData());
        }
    });
}

Проблема в том, что когда я запускаю сервер, я не получаю никаких ошибок, но графический интерфейс не загружается, и в командной строке я не вижу никаких выходных данных.Если я запускаю клиент (пока сервер работает), я получаю только сообщение System.out.println("I've created the socket");, но после этого ничего не происходит.Что я должен изменить, чтобы эти два сокета связались?

1 Ответ

0 голосов
/ 30 ноября 2018

Использование сокетов - плохая идея.Вам не нужно прямое соединение.Лучше использовать что-то вроде сервиса REST с GET и POST.

, чтобы вы могли управлять любым количеством клиентов.Просто отправьте ответ, чтобы получить и опубликовать.Также вы можете использовать токены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...