Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Java套接字通信”;“僵局”;_Java_Multithreading_Sockets_Server_Deadlock - Fatal编程技术网

“Java套接字通信”;“僵局”;

“Java套接字通信”;“僵局”;,java,multithreading,sockets,server,deadlock,Java,Multithreading,Sockets,Server,Deadlock,嗨,我正在尝试实现服务器与多个客户端的操作 问题是服务器没有从inputstream接收消息并等待消息发生。如果客户端在写入流之后没有关闭流,服务器将继续等待。客户端发送消息后,他尝试从inputstream中读取消息,等待响应,但服务器正在等待请求。所以死锁 这是我的客户端类 public class Client implements Runnable{ ... @Override public void run() { BufferedReader is = null;

嗨,我正在尝试实现服务器与多个客户端的操作 问题是服务器没有从inputstream接收消息并等待消息发生。如果客户端在写入流之后没有关闭流,服务器将继续等待。客户端发送消息后,他尝试从inputstream中读取消息,等待响应,但服务器正在等待请求。所以死锁

这是我的客户端类

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);
你的客户正在写请求,但不是一行。您的服务器正在使用
readLine()
读取一行,并且将一直阻止,直到行终止符到达,这是永远不会发生的,因此它将永远不会发送回复,因此您的客户端将永远不会收到它,因此它将永远阻止

将上述内容更改为:

pw.println(request);

非常感谢你!我很感激,非常感谢!我很感激