私は最初にこの質問をしました。EDT がどのように機能するかを理解し、これを読んでスイングとワーカー スレッドの詳細を読み始めました。それらがどのように機能するかを理解し始め、コードが実行される場所に修正されました。現在、ワーカー スレッド(サーバー)から情報を取得して、GUI を更新しようとしています。問題が発生しましたが、うまくいかないようです。問題は、新しいクライアントをリッスンし続ける必要があることです(サーバーは複数のクライアントを処理すると想定されているため) が、それが while ループにあるため、ワーカー スレッドのリターンに到達することはありません。設定する他の方法もわかりません。誰かが私のコードを見て、これを機能させる方法を提案してもらえますか?
Main.class
package com.sever.core;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class Main {
private SocketManager network;
private Window window;
public static void main(String[] args){
Main main = new Main();
main.runGUI();
main.runServer();
}
private void runGUI(){
//Runs the swing components in the EDT.
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
window = new Window();
window.setVisible(true);
}
});
}
private void runServer(){
//Runs the Server process on a worker thread.
SwingWorker<String, String> server = new SwingWorker(){
@Override
protected Object doInBackground() throws Exception {
network = new SocketManager(25595);
/*
* Here is the problem. I need to keep running this code so,
* that I can let multiple clients connect. However,
* it then never reaches the return.
*/
while(true){
try {
network.setSocket(network.getServerSocket().accept());
addUser(network.getSocket());
} catch (Exception e) {
System.out.println("Failed to connect.");
}
}
return network.getMessage();
}
@Override
protected void done(){
try {
window.updateChat(get().toString());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
server.run();
}
private void addUser(Socket s){
try {
Scanner input = new Scanner(s.getInputStream());
network.addUser(input.nextLine());
} catch (Exception e) {
}
}
}