聊天客户端一次只能打印1行

时间:2012-10-21 14:55:04

标签: java sockets

我正在编写一个多线程聊天服务器/客户端,我一直在使用SocketTest V 3来测试服务器,它似乎工作正常,但是当我写一个新行时,我在控制台中只编写了更新的客户端,我我正在使用我自己的客户端来进行套接字测试,每次写入内容时套接字都会更新但我的客户端不会

public class clientV2 {


public static final int PORT = 5019;
public static InetAddress host;

public static void main(String[] args) throws IOException {

    try {
        host = InetAddress.getLocalHost();
        Socket socket = new Socket(host, PORT);

        Scanner in = new Scanner(System.in);

        Scanner inputFromServer = new Scanner(socket.getInputStream());

        PrintWriter outputToServer = new PrintWriter(socket.getOutputStream());

        while(true) {
            if(inputFromServer.hasNext()) {
                System.out.println(inputFromServer.nextLine());
            }

            String input = in.nextLine();
            outputToServer.println(input);
            outputToServer.flush();

        }

    } catch (Exception e) {

    }
}

}

2 个答案:

答案 0 :(得分:1)

您的客户端在其扫描仪上调用nextLine(),此方法(如其名称所示)返回下一行。因此,在完整的下一行可用之前,您的客户无法打印任何内容。

这是javadoc对nextLine()所说的内容:

  

使此扫描程序超过当前行并返回该输入   被跳过了。此方法返回当前行的其余部分,   排除末尾的任何行分隔符。该职位设定为   下一行的开头。

     

由于此方法继续搜索输入以查找a   行分隔符,它可以缓冲搜索该行的所有输入   如果没有行分隔符则跳过。

答案 1 :(得分:0)

这是因为System.out.println(inputFromServer.nextLine());就是这样做的。它等待一整行,然后将其打印出来。它不会打印部分线条。

如果缺少的输出不仅仅是最后一个部分行(换行符换行;换行不计算),那么请查找缓冲区。

您可以使用InputStreamReader从输入流中读取单个字符(这是一个字节流)。您可以在构造函数中指定charset。

InputStreamReader inputFromServer = 
  new InputStreamReader(socket.getInputStream(), "UTF-8");

System.out.print((char) inputFromServer.read());