我有两个重要的类(客户端和服务器),我将在我的文本区域写一些内容,通过单击发送按钮,我将调用客户端类的活动方法,我将该文本发送到我的客户端类,一切都还可以,文本也将打印在服务器控制台上,但是我无法从服务器到客户端回显该文本,请帮助我谢谢。
客户端类:(其中一部分)
os = new PrintWriter(c.getOutputStream(), true);
is = new BufferedReader(new InputStreamReader(c.getInputStream()));
public static void active() {
String teXt = MainClient.getText();
os.println(teXt);
String line = is.readLine();
System.out.println("Text received: " + line);
os.flush();
is.close();
is.close();
c.close();
服务器类:(其中一部分)
BufferedReader streamIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter streamOut =new PrintWriter(client.getOutputStream());
boolean done = false;
String line =null;
while (!done ) {
line = streamIn.readLine();
if (line.equalsIgnoreCase("bye")) {
done = true;
} else {
System.out.println(line);
streamOut.println(line);
}
}
streamIn.close();
client.close();
server.close();
答案 0 :(得分:1)
在阅读服务器答案之前,您需要“os.flush();”。
因为根据您的客户端代码,您准备要使用
发送的文本 String teXt = MainClient.getText();
os.println(teXt);
然后等待服务器回答:
String line = is.readLine();
System.out.println("Text received: " + line);
然后将文本发送到服务器:
os.flush();
尝试:
String teXt = MainClient.getText();
os.println(teXt);
os.flush();
String line = is.readLine();
System.out.println("Text received: " + line);
答案 1 :(得分:1)
实际上Nettogrof的方式正确,但您还必须刷新服务器端:
line = streamIn.readLine();
if (line.equalsIgnoreCase("bye")) {
done = true;
} else {
System.out.println(line);
streamOut.println(line);
streamOut.flush(); // or ...checkError();
}
或者只是在autoFlush设置为true的情况下创建PrintWriter:
PrintWriter streamOut = new PrintWriter(client.getOutputStream(), true);
一个注意事项:您还应该测试readLine()是否返回null,因为客户端将关闭连接而不发送“bye”。
第二个注意事项:PrintWriter的实例永远不会抛出IOExceptions,您应该测试调用checkError()
的错误,这也会刷新流。
答案 2 :(得分:0)
输入流的读取频率是多少?从代码中看,似乎只有一次读取,可能在从服务器发送任何内容之前,就是这样。如果你打算使用你采用的方法,你可能需要对服务器进行更一致的轮询。
类似的东西:
while (line = is.readLine() != null ) {
System.out.println("Text received: " + line);
}
答案 3 :(得分:0)
您的服务器代码实现错误,因为无限循环,streamIn,client和streamOut永远不会关闭。
请参阅medopal提到的文章以获得更多帮助。