我用Java编写一个简单的聊天应用程序,除了以下奇怪的bug之外,一切正常:
当您在终端中输入内容时,例如按" a"并且控制台写了" a",然后你按" i",它写'" i"," r" - > " r" ...你得到了在控制台中写的字(例如" air")。
在我的情况下,我按" e",控制台写"(没有)"," i" - >"(注意)"," r" - > (没有)只有在我按下"进入"控制台突然显示整个单词" air",以相同的方式使用多个单词。实际上,用户可以编写他/她想要的任何内容,但只有在按下Enter后才会显示键入的文本。
在我的程序中,我使用BufferedReader
对象从套接字中读取:
try( ....some socket stuff....
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);//out is the socket output
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //in is the socket input
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); //that's the standard input, the one from keyboard
while(true){
if (stdIn.ready()){
userInput=stdIn.readLine();
out.println(userInput);
if(userInput.equals("Bye.")) break;
System.out.println("Me: "+userInput);
}
if(in.ready()){
if((serverInput= in.readLine())!=null){
System.out.println("Stranger: "+serverInput);
}
}
在我看来,方法 - ready
和readline()
- 可能会破坏控制台。这对我来说似乎有点奇怪,但它是Java,我不是很熟练。
除此之外,聊天就像魅力一样 - 它可以正确发送和接收。 read-receive-input脚本与客户端完全相同。当您键入消息时,控制台中不会显示任何内容,但它实际上是在那里并且在输入它显示时,它不是延迟,它受到Enter的影响。
答案 0 :(得分:-1)
这在java中是不可能的。 至少不是与平台无关的方式。
您要做的是,逐个字符地阅读,而无需按Enter键。 但默认情况下,操作系统本身的控制台处于缓冲线模式。
因此,唯一的解决方案是将控制台置于原始模式(绕过行编辑并且不需要输入密钥),使其与平台相关。
编辑:您的描述说明了字符阅读,顺便说一句,您的代码正在做其他事情。