我正在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广播某些内容时,将调用上述函数。
我怎样才能在用户输入线上使用它? IE:
Server running, listening on port 25565
Tim has connected
>Boom
Server: Boom
>That's nice
Server: That's nice
Tim: I agree!
>
答案 0 :(得分: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();
}
}
创建一个扩展PrintStream并覆盖println(String str)方法的类,而不是执行System.setOut(new PrintStream(overrideOut));
,而是始终添加“>”在开头
答案 1 :(得分:0)
根据您使用的console
,您可以通过使用退格符\b
预先挂起服务器行来模拟所需的行为。这是一个测试程序
public class Prompt
{
public static void main(String [] args)
{
System.out.print(">");
System.out.println("line1");
System.out.print(">");
System.out.println("line2");
System.out.print(">");
System.out.println("\bline3");
System.out.print(">");
System.out.println("");
}
}
当我在bash shell中运行此程序时,我得到以下输出:
>line1
>line2
line3
>
请注意,程序确实在line3
之前打印出提示符,但退格字符ate
是提示字符,方法是将光标移回一个字符并覆盖字符。
在您的情况下,当您从服务器广播某些内容时,只需在调用consoleWriteln之前将\b
添加到消息中。
然而,这并不总是有效。它绝对不能在我的Intellij控制台窗口中工作 - 它似乎只是忽略退格字符。因此,这种方法的成功取决于您使用的控制台以及控制台如何处理退格。
如果您使用系统提供的控制台程序(bash或cmd.exe)来运行您的程序,它应该适用于Mac,Linux和Windows。