gpt4 book ai didi

Java套接字通信 "deadlock"

转载 作者:行者123 更新时间:2023-12-02 03:02:43 27 4
gpt4 key购买 nike

嗨,我正在尝试实现与多个客户端一起运行的服务器问题是服务器没有从输入流接收消息并等待它发生。如果客户端在写入后不关闭流,服务器将继续等待。客户端发送消息后,他尝试从输入流中读取等待响应,但服务器正在等待请求。所以..陷入僵局

这是我的客户类别

public class Client implements Runnable{

...

@Override
public void run() {

BufferedReader is = null;
BufferedWriter os = null;

try(Socket socket = new Socket(address.getHostName(), address.getPort());){

String request = String.format("%s-%d-%s",this.destination, this.desiredPlace, this.paymentMethod.toString());
os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter pw = new PrintWriter(os, true);
pw.write(request);
pw.flush();
// if I close the stream here the request will be send, but this will close the socket so the I will not receive response.

String response;
while ((response = is.readLine()) != null){
System.out.println(response);
}

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

这是我的服务器类

 public void perform() throws IOException, DestionationProcessingException, InterruptedException {
try (ServerSocket server = new ServerSocket(port);) {
StandalonePayDesk offLinePayDesk = new StandalonePayDesk(ticketManager);
this.threadPool.submit(offLinePayDesk);

while (true) {
Socket socket = server.accept();
RequestHandler handler = new RequestHandler(this.threadPool, offLinePayDesk, this.ticketManager);
handler.process(socket);
}
}
}

以及用于处理每个客户端的RequestHandler类

try (BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter writer = new PrintWriter(client.getOutputStream(), true)) {

writer.println("hello");
writer.flush();

String line;
while ((line = reader.readLine()) != null) {

String[] lineTokens = line.split("-");
...

谁能帮我解决这个问题吗?

最佳答案

pw.write(request);

您的客户端正在写入请求,但不是一行。你的服务器正在使用 readLine() 读取一行,并且会阻塞直到行终止符到达,这是永远不会的,所以它永远不会发送回复,所以你的客户端永远不会收到它,所以它将永远阻塞。

将上面的内容更改为:

pw.println(request);

关于Java套接字通信 "deadlock",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com