3

現在、全体的に非常に基本的なチャット アプリケーションを開発していますが、クライアント側とサーバー側の両方から文字列を受信するときに問題が発生しています。私はスレッドを使用してソケットで受信メッセージを受動的にリッスンしていますが、これが問題の原因であると思われます。私はこれを正しい方法でやっていますか?

ソース: 文字列を送信するためのコード:

send.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            messageBuffer = message.getText();
            out.println(messageBuffer);
            chat.append(username + ": " + messageBuffer + "\n");
            message.setText("");
        }
    });

次に、これを受動的にリッスンします(問題はおそらくここにあります):

public void run(){
    while(true){
        try {
               messageBufferIn = in.readLine();
               System.out.println(in.readLine());
               chat.append(recipient + ": " + messageBufferIn + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

これを使用してスレッドも呼び出しています:

public static void startChatting(){
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

あなたが提供できる助けに感謝します。私はまだスレッド全体に慣れていないので、私の間違いはかなり平凡かもしれません。

編集:問題は、受信者にメッセージを送信しようとすると、何も届かず、接続されていることを確認できることです。実際、System.out.println(in.readLine()); 「null」出力でさえ、まったく通過しません。

4

2 に答える 2

3
  1. Swingの同時実行性に問題があります。SwingGUIは、を実行/開いていることを認識していませSocketBackground Task

  2. のすべての更新はEDTSwing GUIで行う必要があります。そうしないと、何も起こらなかったか、いくつかの例外が発生します。

  3. Background Task(あなたの場合Runnable#Thread)からforSwingGUIへのinvokeLater すべての更新をラップする必要があります

  4. while(true){Boolean variableの代わりに無限ループが配置されているtrue場合は、停止、開始、または再起動できます。Socket

  5. send.addActionListener(new ActionListener(){一度だけ実行される場合(ユーザーがクリックによって呼び出された場合)JButtonsSwingWokerを使用してSocketを開く場合SwingWorkerは、すべての出力がEDTで行われる必要があることを十分に保証します。

  6. との違いは、 1回だけ実行するように指定されてRunnable#ThreadいるSwingWorkerことですSwingWorker

于 2012-08-23T11:51:24.763 に答える
2

私はあなたの主な問題はあなたがフラッシュしていないことだと思いますOutputStreamout.flush()書き込みが終わってメッセージを送信した後に追加する必要があります。たとえば、次のActionListenerようになります。

send.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        messageBuffer = message.getText();
        out.println(messageBuffer);
        out.flush();
        chat.append(username + ": " + messageBuffer + "\n");
        message.setText("");
    }
});

これを行わないと、OutputStreamバッファがいっぱいになるまでそこに座ります(これは多くのメッセージになります)。

于 2012-08-24T02:52:02.533 に答える