créer un socket serveur java qui attend des messages de client à l'aide pool de threads

jeremy James:
@FXML
private TextArea textarea;
@FXML
private ImageView imagev;

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    Serverth Server = new Serverth();
    Server.start();
}


class Serverth extends Thread {
    @Override
    public void run() {
        try {
            final int NUM_THREAD = 99;


            ServerSocket socket = new ServerSocket(8078);
            ExecutorService exec = Executors.newFixedThreadPool(NUM_THREAD);
            System.out.println("SERVER SOCKET CREATED");


            while (!isInterrupted()) {
                Socket in = socket.accept();
                Runnable r = new ThreadedHandler(in);
                exec.execute(r);

            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

    }
}

class ThreadedHandler implements Runnable {

    private Socket incoming;

    public ThreadedHandler(Socket in) {
        incoming = in;
    }

    public void run() {
        try {
            try {
                ObjectInputStream is=new ObjectInputStream(incoming.getInputStream());

                while(true) {
                    if (is.available() > 0) {
                        String line = is.readUTF();

                        textarea.appendText("\n" + "[" + new java.util.Date() + "] : " + line);

                        if (line.contains("inviato")) {
                            Object obj = is.readObject();
                            Email ema = (Email) obj;
                            try {
                                SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy-hh-mm-ss");
                                FileOutputStream fileOut = new FileOutputStream("src/Server/" + ((Email) obj).getDestinat() + "/" +  formatter.format(((Email) obj).getData()) + ".txt");
                                ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
                                objectOut.writeObject(ema);
                                objectOut.flush();
                                objectOut.close();
                                System.out.println("The Object  was succesfully written to a file");

                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }

                        }

                    }
                }
                } catch(IOException ex) {
                ex.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
            try {
                incoming.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        }
    }
}

Dans la méthode d'exécution (en classe serveth), je crée un socket serveur et méthode exec.execute d'appel. Dans la méthode d'exécution (en classe ThreadedHandler), le serveur est en attente pour les messages du client (dans ce cas spécifique, il crée un nouveau fichier txt, mais il est important). Tout fonctionne, mais provoque une utilisation excessive de la CPU et le décalage !!!

Joni:

InputSteam.available méthode retourne une valeur instantanément, vous dire qu'aucun octet sont disponibles à lire, donc ce code exécute une boucle de spin très « chaud »:

            while(true) {
                if (is.available() > 0) {
                    ...
                }
            }

La availableméthode est rarement utile et donne souvent des résultats confus (voir par exemple inputstream.available () est 0 toujours ). Je vous suggère de se débarrasser de l'instruction if tout à fait:

            while(true) {
                String line = is.readUTF();

                textarea.appendText("\n" + "[" + new java.util.Date() + "] : " + line);
                ...
            }

Il n'y a aucun moyen pour ce code pour quitter la boucle normalement. Vous pouvez ajouter un mécanisme pour le client de se déconnecter du serveur.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=365491&siteId=1
conseillé
Classement