2

我正在编写一个多线程聊天服务器/客户端,我一直在使用 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) {

    }
}

}

4

2 回答 2

1

你的客户端调用nextLine()它的扫描器,这个方法,正如它的名字所表明的,返回下一行。因此,在完整的下一行可用之前,您的客户无法打印任何内容。

这是javadoc所说的nextLine()

将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。

由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

于 2012-10-21T15:07:02.823 回答
0

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

如果输出丢失的不仅仅是最后一个部分行(换行到换行;换行不计算在内),请沿途查找缓冲区。

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

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

System.out.print((char) inputFromServer.read());
于 2012-10-21T15:08:06.563 回答