@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 !!!
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 available
mé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.