我有以下客户端服务器通信器:
public class ServerAdapter
{
private static final int serverPort = 8888;
private static final String host = "localhost";
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
private void startConnection(String host, int port) throws IOException {
clientSocket = new Socket(host, port);
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}
private String sendMessage(String msg) throws IOException {
out.println(msg);
String resp = in.readLine();
return resp;
}
private void stopConnection() throws IOException {
in.close();
out.close();
clientSocket.close();
}
public double sendServerForexRequest(Request clientRequest) throws IOException {
startConnection(host, serverPort);
String result = sendMessage(clientRequest.toString());
stopConnection();
return Double.parseDouble(result);
}
调用sendServerForexRequest
时,客户端成功建立连接,成功发送消息,但在尝试回读时卡住。
这是因为,根据调试,服务器端在尝试从客户端读取时卡住了,即使客户端已经发送了数据:
import java.io.*;
import java.net.Socket;
import java.util.stream.Collectors;
public class UserRequestHandlerThread extends Thread
{
Socket userSocket;
public UserRequestHandlerThread(Socket userSocket)
{
this.userSocket = userSocket;
}
@Override
public void run() {
ForexRate forexRate = new ForexRate();
InputStream input = null;
try {
input = userSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
return;
}
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String requestString = null;
try {
requestString = reader.lines().collect(Collectors.joining()); //RIGHT HERE
} catch (Exception ex)
{
System.out.println(ex.getMessage());
}
Request request = Request.fromString(requestString);
double exchangeResult = forexRate.rate(request.getFrom(), request.getTo()) * request.getAmount();
OutputStream outputStream = null;
try {
outputStream = userSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
return;
}
PrintWriter streamWriter = new PrintWriter(outputStream, true);
streamWriter.print(exchangeResult);
try {
userSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我不知道为什么会这样。我检查了互联网上的多个来源,它们似乎都以完全相同的方式编写客户端和服务器端。这太奇怪了。
为什么服务器无法从客户端读取?
答案 0 :(得分:0)
发现了。请勿使用 reader.lines().collect(Collectors.joining());
。改用 char[]
缓冲方法。