【问题标题】:Client-server socket program not experiencing deadlock as expected客户端-服务器套接字程序未按预期经历死锁
【发布时间】:2016-02-15 21:52:07
【问题描述】:

我有一个示例套接字程序。客户端只发送数字,服务器将它们回显。

客户:

public class Client {
private Socket socket;
private BufferedReader in;
private PrintWriter out;

public Client(String hostname, int port) throws IOException {
    socket = new Socket(hostname, port);

    //Create a BufferedReader with buffer size of 1
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()), 1);
    out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
}

public void sendRequest(String x) throws IOException {
    out.print(x + "\n");
    out.flush(); 
}

public void close() throws IOException {
    in.close();
    out.close();
    socket.close();
}

public String getReply() throws IOException {
    String reply = in.readLine();
    return reply;
}

public static void main(String[] args) {
    try {
        Client client = new Client("localhost", 4949);

        for (int i = 0; i < 100000; i++){
            System.err.println("Sending: "+i);
            client.sendRequest(String.valueOf(i));
        }

        for (int i = 0; i < 100000; i++){
            client.getReply();
        }

        client.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
}

服务器:

public class Server {
private ServerSocket serverSocket;

public Server(int port) throws IOException {
    serverSocket = new ServerSocket(port);
}

private void handle(Socket socket) throws IOException {
    System.err.println("client connected");

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    // Create a PrintWriter with buffer size 1
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()), 1));

    try {
        for (String line = in.readLine(); line != null; line = in.readLine()) {
            out.print(line + "\n");
            out.flush();
        }
    } finally {
        out.close();
        in.close();
    }
}

public void serve() throws IOException {
    while (true) {
        // block until a client connects
        Socket socket = serverSocket.accept();
        try {
            handle(socket);
        } catch (IOException ioe) {
            ioe.printStackTrace(); // but don't terminate serve()
        } finally {
            socket.close();
        }
    }
}

public static void main(String[] args) {
    try {
        Server server = new Server(4949);
        server.serve();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

这似乎是一个显而易见的问题,但为什么客户端的输入缓冲区没有填满并导致死锁?客户在阅读任何回复之前发送了 10000 个号码。这不会导致客户端的接收缓冲区填满,也导致服务器的发送缓冲区填满吗?我什至使 BufferedReader 和 BufferedWriter 的缓冲区大小尽可能小。但是,当我运行此代码时,没有死锁。

【问题讨论】:

    标签: java sockets deadlock


    【解决方案1】:

    因为您忽略了发送方的套接字发送缓冲区和接收方的套接字接收缓冲区的存在。它们在内核中,它们可以清楚地保存它们之间的所有服务器输出。

    【讨论】:

    • 澄清一下,这些是与我应该在 Java 中设置大小的缓冲区分开的缓冲区,对吗?
    • 是的,它们在内核中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2014-04-08
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多