ジェレミー・ジェームズ:
@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();
}
}
}
}
(Servethクラスで)runメソッドの内部では、私は、サーバーソケットとコールexec.executeメソッドを作成します。(ThreadedHandlerクラスで)runメソッドの内部では、サーバーが(この特定の場合には、それが新しい.txtファイルを作成しますが、それは重要ではありません)、クライアントからのメッセージを待っています。すべてが動作しますが、CPUやラグの過度の使用を引き起こし!!!
ジョニ:
InputSteam.available
この方法は、このコードは非常に「熱い」スピンループを実行しているので、何のバイトは、読み込み可能でないあなたに言って、すぐに値を返します。
while(true) {
if (is.available() > 0) {
...
}
}
available
この方法は、まれに有用であり、しばしば混乱の結果を(例を参照できます(inputstream.available)は常に0です)。私はあなたが完全にif文を取り除くことをお勧め:
while(true) {
String line = is.readUTF();
textarea.appendText("\n" + "[" + new java.util.Date() + "] : " + line);
...
}
このコードが正常にループを終了するための方法はありません。あなたは、サーバーから切断するには、クライアントのためのメカニズムを追加することもできます。