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