我有一个关于线程运行方法中无限循环中套接字输出流刷新机制的问题。我的代码适用于当客户端套接字向服务器发送消息并在服务器中运行方法时,在“无限循环”中运行,通过readLine()
方法接收消息。在无限期运行的同时在服务器端接收数据'循环工作正常,但是当它向客户端消息发送消息时,如返回确认消息,使用write()
和flush()
方法后,它不起作用,该方法包含在相同的无限&#中39;而'循环。
我正在努力寻找解决这个问题的方法,而且当我发现无限的情况时,我发现了有趣的情感。服务器端的循环停止运行,服务器刷新到客户端的所有消息开始发送到客户端。所以我认为这是队列问题,线程无限循环不会让消息被刷新到另一端,直到无限循环结束以确保安全。所以我创建了另一个带有线程的类,用于向客户端发送服务器消息。它似乎正在工作,因为在刷新消息后,run方法结束。但是每次向客户端发送消息时我都必须创建该类。
这里的示例代码与原始代码使用相同的概念,在单独的main方法上运行
客户方:
try {
// System.out.println("client_working!!") ;
while (true) {
writer.write("rkdgusdnr");
writer.flush();
// writer.flush();
System.out.println("client_Working!!");
sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
reader.close();
writer.close();
client.close();
JOptionPane.showMessageDialog(null, "client closed!!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
服务器端:
try {
client = server.accept();
reader = new BufferedReader(new InputStreamReader(
client.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(
client.getOutputStream()));
String contents = null;
while (true) {
// System.out.println("Server_received") ;
if ((contents = reader.readLine()) != null) {
System.out.println(contents + "\n");
writer.write("Server_received");
writer.flush();
} else {
break;
}
System.out.println("Server_working!!");
sleep(500);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
reader.close();
writer.close();
client.close();
server.close();
JOptionPane.showMessageDialog(null, "server closed!!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:0)
你正在读行,但你不是在写行。您需要发送一个行终止符。