【发布时间】:2015-07-15 02:46:06
【问题描述】:
我有一个套接字客户端向套接字服务器发送文本,但 ReadLine 似乎没有等待接收行,然后继续。这是接收文本的服务器:
public void run() {
try {
serveurSocket = new ServerSocket(PORT_ID);
connexionSocket = serveurSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(connexionSocket.getInputStream()));
PrintWriter writer = new PrintWriter(connexionSocket.getOutputStream(), true);
messageRecu = "";
while (true) {
messageRecu = reader.readLine();
messageRecu = messageRecu.toUpperCase();
writer.println(messageRecu);
}
//reader.close();
//writer.close();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
在客户端和服务器之间建立套接字后,执行将在 reader.readLine 处停止,直到我通过套接字手动发送一个字符串。这是正常的和想要的。代码恢复并且它很好,直到它循环回到 reader.ReadLine() 那里它将读取一个“空”行而不是像第一次那样等待来自套接字的输入......这显然会弄乱下一个命令大写。那么我该如何解决呢?
编辑:如果可以帮助理解,我会添加客户端。
public class ClientSocket {
private Socket clientSocket;
public boolean isClosed() { return clientSocket.isClosed(); }
public boolean connectToSocket (String ip, int port) {
try {
clientSocket = new Socket(ip, port);
return true;
}
catch (IOException e) {
System.out.println(e);
return false;
}
}
public String sendToServer(String messageClient) {
String messageRecu = "";
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
writer.println(messageClient);
messageRecu = reader.readLine();
reader.close();
writer.close();
return messageRecu;
}
catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return messageRecu;
}
}
}
按下按钮将调用“connectTosocket”来启动套接字。按下第二个按钮将使用“sendToServer”发送文本字段的内容。
服务器确实接收到消息并将其返回大写,但我希望套接字与服务器保持打开状态,并且如果我发送另一个字符串以发生相同的序列。甚至不确定它是否可以完成:(
【问题讨论】:
-
当
null返回时,流已终止。是时候关闭 BufferedReader,而不是继续阅读了。问题出在您的服务器代码中,您需要了解为什么它会在您不期望的情况下终止流。同时删除客户端中的while (true),因为这是危险代码。