0

私はJavaでコーディングすることを学んでいます。GUIで簡単なチャットを書きたいです。これまでのところ、私のアプリケーションはコマンドラインで動作します。クライアント部分にGUIを構築することに興味があります。GUIとの接続に問題があります。私の質問は、GUI用の特別なクラスを作成し、クライアントクラスでそのようなオブジェクトを作成して操作する必要があるかどうかです。特に、GUIを介したクライアントとサーバー間の通信の確立に問題があります。クライアント部分のコマンドラインアプリケーションコードは次のようになります。この件についてアドバイスをいただければ幸いです。

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 4444);
            System.out.println("CLIENT: Server connected on port 4444");

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("CLIENT: IN and OUT streams opened. Starting sending data...");

            ClientInputThread thread = new ClientInputThread(socket);
            thread.start();

            String serverResponse;
            while ((serverResponse = in.readLine()) != null) {
                System.out.println("Server: " + serverResponse);
                if (serverResponse.equals("koniec")) {
                    break;
                }
            } 
            System.out.println("CLIENT: Ending server connection. Closing client streams and socket.");
            out.close();
            in.close();
            socket.close();
            System.exit(0);
        } 
        catch (UnknownHostException e) {
            System.err.println("CLIENT: Trying to connect to unknown host: " + e);
            System.exit(1);
        } 
        catch (Exception e) {
            System.err.println("CLIENT: Exception:  " + e);
            System.exit(1);
        }
    }
}

public class ClientInputThread extends Thread {
    private PrintWriter out;

    public ClientInputThread(Socket clientSocket) {
        try {
            out = new PrintWriter(clientSocket.getOutputStream(), true);
        } 
        catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public void run() {
        try {    
            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
            String userInput="";    
            while (userInput != null) {
                userInput = console.readLine();
                out.println(userInput);
                out.flush();
                if (userInput.equals("koniec")) {
                    break;
                }
            }
            System.exit(0);
        } 
        catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
4

1 に答える 1

3

通常の方法は、ロジックをGUIから可能な限り分離することです。メッセージの送信/受信部分を実装するクラス(またはいくつかのクラス)を作成します(すでに行っているように見えます)。

これらのクラスは、メッセージを送受信するためのパブリックメソッドを提供する必要があり、おそらくリスナーを登録して着信メッセージを通知できる必要があります。

次に、GUIクラスを作成し、それをサーバークラスにリスナーとして登録し、MessageReceivedイベントが発生したらテキストを更新します。イベント処理の基本はここあり、カスタムイベントの作成と処理の例を次に示します。

//an interface that will let your server work with its listeners
interface MessageListener {
    public void messageSent();
}


class Server {
    List<MessageListener> listeners = new ArrayList<MessageListener>();

    //method to register listeners to be notified of incoming messages
    public void addListener(MessageListener toAdd) {
        listeners.add(toAdd);
    }

    public void sendMessage() {
        //code your logic here
        System.out.println("Message sent");

        // Notify everybody that may be interested.
        for (MessageListener hl : listeners)
            hl.messageSent();
    }

}

class GuiImplementation implements MessageListener {
    @Override
    public void messageSent() {
         System.out.println(message);
    }
}

とメインクラス:

class Test {
    public static void main(String[] args) {
        Server server = new Initiater();
        GuiImplementation gui = new Responder();

        //register gui as a listener for incoming/outgoing messages
        server.addListener(gui);

        //this will trigger the gui method to process incoming message
        server.sendMessage(); 
    }
}
于 2012-12-24T14:03:23.530 に答える