0

Java で簡単な GUI チャット プログラムを作成しています。目標は、ユーザーがサーバーをホストするか、クライアントとして接続するかを選択することです。これはすべて機能します。私が抱えている問題は、クライアントまたはサーバーのチャットを許可することです。理想的には、ユーザーまたはサーバーが textField に入力して Enter キーを押す (または送信ボタンを押す) と、接続されているすべてのクライアントにメッセージが送信されます。実行中、サーバーは無限の while ループを実行し、さらにクライアントを待機します。私が抱えている問題は 2 つあります: 1) 文字列を入力ストリームに渡す方法が正しいかどうかわからない、2) サーバーにいつ受信させてから受信させることができるかわかりません。で待機しているため、データを再送信しますserver.accept()

実行方法は次のとおりです。

public void run()
{   
    conversationBox.appendText("Session Start.\n");
    inputBox.requestFocus();

    while (!kill)
    {
        if (isServer)
        {
            conversationBox.appendText("Server starting on port " + port + "\n");
            conversationBox.appendText("Waiting for clients...\n");
            startServer();
        }
        if (isClient)
        {
            conversationBox.appendText("Starting connection to host " + host + " on port " + port + "\n");
            startClient();
        }
    }       

}

startClient メソッドは次のとおりです。

public void startClient()
{
    try
    {
        Socket c = new Socket(host, port);
        in = new Scanner(c.getInputStream());
        out = new PrintWriter(c.getOutputStream());
        while (true)
        {
            if (in.hasNext())
            {
                Chat.conversationBox.appendText("You Said: " + message);
                out.println("Client Said: " + message);
                out.flush();
            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

startServer メソッドは次のとおりです。

public void startServer()
    {
        try
        {
            server = new ServerSocket(port);
            while (true)
            {
                s = server.accept();
                conversationBox.appendText("Client connected from " + s.getLocalAddress().getHostName() + "\n");    
            }
        }
        catch (Exception e)
        {
            conversationBox.appendText("An error occurred.\n");
            e.printStackTrace();
            isServer = false;
            reEnableAll();
        }

    }

最後に、actionPerformed の一部で、データを取得して (試行) 出力ストリームに書き込もうとしています。

    if (o == sendButton || o == inputBox)
    {
        if(inputBox.getText() != "")
        {
            out.println(inputBox.getText());
            inputBox.setText("");
        }
    }

私の質問は次のとおりだと思います: サーバーがクライアントからのテキストを待ってからすべてのクライアントに送り返すように、メソッドを再配置するにはどうすればよいですか? また、クライアントからサーバーにテキストを送信するにはどうすればよいですか?

4

1 に答える 1