【发布时间】:2021-03-03 16:15:09
【问题描述】:
我正在尝试创建具有多个客户端连接的服务器。客户端首先发送用户提示的命令。然后服务器读取所有参数并将其作为对象发送到服务器。
但我的问题是,在执行一个命令后,我的程序会陷入死锁。我对其进行了解决方法,因此我的客户端发送命令并在服务器之后-说您可以发送查询-对象。如何避免这种解决方法?
这是我的服务器。
try {
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
objectOut = new ObjectOutputStream(clientSocket.getOutputStream());
objectIn = new ObjectInputStream(clientSocket.getInputStream());
// communicate with client
if ("Hello Server".equals(in.readLine())) {
out.println("Connection with Server established");
}
else {
out.println("You picked the wrong house, fool! (wrong greeting)");
}
String inputLine;
while ((inputLine = in.readLine()) != null) {
if ("exit".equals(inputLine)) {
break;
}
else if ("ls".equals(inputLine)) {
execute_ls();
}
else if ("data".equals(inputLine)) {
out.println("o");
var query = (Query) objectIn.readObject();
exceute_data(query);
}
}
in.close();
out.close();
clientSocket.close();
} catch (Exception e) {
Logger.err(e.toString());
}
这是我在客户端的功能。
public CompletableFuture<Data> queryData(param) {
Data data_from_server;
CompletableFuture<Data> data_series = new CompletableFuture<>();
try {
outputData.println("data");
inputData.readLine();
objectOutputData.writeObject(param);
data_from_server = (Data) objectInputData.readObject();
data_series.complete(data_from_server);
if (data_from_server.getErrorMessage() != null) {
throw new Exception(data_from_server.getErrorMessage());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return data_series;
}
提前谢谢各位!
【问题讨论】:
-
您正在发送和接收文本和二进制数据的组合。执行此操作时必须小心。
标签: java sockets server client