gpt4 book ai didi

java - WriteUTF 每 2 次才有效

转载 作者:行者123 更新时间:2023-11-29 03:44:46 25 4
gpt4 key购买 nike

我在使用简单的 Java 服务器客户端应用程序时遇到了一些麻烦。基本上主题说明了一切:当我在服务器端执行 writeUTF 时,它只会在每第二次执行时发送一次。例如:

服务器:

public class Server {

/**
* @param args
*/
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(7777);
Socket client = server.accept();
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
while(true) {
for(int i = 0; i < 100; i++) {
out.writeUTF("Test" + i);
out.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

和客户:

public class Client {

/**
* @param args
*/
public static void main(String[] args) {
try {
Socket client = new Socket("localhost", 7777);
DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

while(in.readUTF() != null) {
System.out.println(in.readUTF());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

控制台的输出是这样的:

测试1测试3测试5测试7测试9测试11

是什么导致了这种行为?

最佳答案

这是因为您正在丢弃客户端上的数据。

当您检查 while(in.readUTF() != null) 时,您每次都从流中读取一个条目以查看它是否非空。然后您丢弃这个值,并在循环中读取一个新值。 (除了丢失值外,这还有一个错误,即总值的数量为奇数时,while 条件将评估为真,但下一次调用 readUTF() 将在循环内返回 null。)

要解决此问题,您应该将值读取到变量中,并在使用它之前对其进行测试 - 如下所示:

String value;
while((value = in.readUTF()) != null) {
System.out.println(value);
}

如果您不喜欢将赋值和无效性检查作为单个表达式,您可以改为在每个循环的初始和末尾赋值 value = in.readUTF(),但我个人认为这更容易出错。

关于java - WriteUTF 每 2 次才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com