0

私は単純なクライアント サーバー プロトコルを Java で作成しており、現在サーバー CLI を扱っています。私がやりたいことは>、ユーザー入力行の先頭にあることです。コンソールに文字を出力する機能>はconsoleWritelnです:

public static void consoleWriteln(String message) {
    System.out.println(message);
    System.out.print(">");
}

この機能でサーバーは起動しますが、毎行先頭に文字が表示されます。

Server running, listening on port 25565
>Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
>Tim: I agree!
>

上記の関数は、クライアントから何かが入ってきたとき、またはサーバー CLI から何かがブロードキャストされたときに呼び出されます。

ユーザー入力行にのみ表示するにはどうすればよいですか? いいえ:

Server running, listening on port 25565
Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
Tim: I agree!
>
4

2 に答える 2

1

System.out をキャッチし、任意の出力をリッスンするスレッドを追加し、タスクを処理してから setOut(PrintStream out) を実行できます

次に、setOut で使用した PrintStream にサーバー出力を直接作成します。

これが私のプロジェクトのコードです。サーバーでは、serverOut.println()... を実行します。

    if(OUTPUT_IN_OVERLAY_CONSOLE || OUTPUT_IN_FILE || !OUTPUT_IN_CONSOLE) {
        try {
            JFrame console = new JFrame("Console");
            console.setSize(720,320);
            final JTextArea tarea = new JTextArea();
            JScrollPane scroll = new JScrollPane(tarea);
            console.add(scroll);                

            final OutputStream consoleOut = System.out;
            final OutputStream fileOut  = new FileOutputStream("output.txt");
            final OutputStream o = new OutputStream() {
                StringBuilder sb = new StringBuilder();
                @Override
                public void write(int b) throws IOException {
                    sb.append((char)b);
                    tarea.setText(sb.toString());
                    tarea.setCaretPosition(sb.length());
                    //tarea.requestFocus();
                }
            };

            OutputStream overrideOut = new OutputStream() {

                @Override
                public void write(int b) throws IOException {
                    if(OUTPUT_IN_CONSOLE) consoleOut.write(b);
                    if(OUTPUT_IN_OVERLAY_CONSOLE) o.write(b);
                    if(OUTPUT_IN_FILE)  fileOut.write(b);
                }
            };
            System.setOut(new PrintStream(overrideOut));

            if(OUTPUT_IN_OVERLAY_CONSOLE) {
                console.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                console.setVisible(true);
            } 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

を行う代わりに、System.setOut(new PrintStream(overrideOut));PrintStream を拡張するクラスを作成し、println(String str) メソッドをオーバーライドして、先頭に常に ">" を追加します。

于 2012-11-22T00:18:57.340 に答える