我在使用简单的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 TEST3 TEST5 TEST7 Test9 TEST11
导致此行为的原因是什么?
答案 0 :(得分:4)
这是因为您丢弃了客户端上的数据。
当您检查while(in.readUTF() != null)
时,您每次都会从流中读取一个条目,看它是否为非空。然后你丢弃这个值,并在循环中读取一个新值。 (除了丢失值,这有一个错误,即总数值为奇数,while条件将评估为true,但下一次调用readUTF()
将在循环内返回null。)
要解决此问题,您应该读取变量的值,并在使用之前对其进行测试 - 如下所示:
String value;
while((value = in.readUTF()) != null) {
System.out.println(value);
}
如果您不喜欢将赋值和无效性检查作为单个表达式,则可以在最初和每个循环结束时分配value = in.readUTF()
,但我个人认为这更容易出错。
答案 1 :(得分:0)
此循环
while(in.readUTF() != null) {
System.out.println(in.readUTF());
}
抛弃它读取的每一秒字符串。在测试文件结尾时读取一个字符串,丢弃它,然后读取另一个字符串并打印出来。
答案 2 :(得分:0)
您正在使用while循环评估中的数据:
while(in.readUTF() != null) {
System.out.println(in.readUTF());
}
请改为尝试:
String line;
while( ((line = in.readUTF()) != null) {
System.out.println(line);
}
答案 3 :(得分:0)
如果您想要套接字为UTF-8
你只需要添加&#34; UTF-8&#34;在BufferedWriter和BufferedReader的contstructor
中这是样本
this.basicReader = this.Client.getInputStream();
this.basicWriter = this.Client.getOutputStream();
this.Reader= new BufferedReader(new InputStreamReader(basicReader,"UTF-8"));
this.Writer= new BufferedWriter(new OutputStreamWriter(basicWriter,"UTF-8"));
如何发送数据
this.Writer.write("data"+"\r\n");
this.Writer.flush();
并且您的主要问题是当您的客户收到消息时,您的客户端没有回复消息
server to client
client to server
server to client
像这样,尝试一下。