Java 为什么服务器程序在线冻结';String file=br.readLine()';?

Java 为什么服务器程序在线冻结';String file=br.readLine()';?,java,sockets,Java,Sockets,我不熟悉套接字编程。我必须编写一个程序,客户端从用户那里接受文件名并将其发送到服务器。服务器读取相应的文件并将其内容发送回客户端。现在我的问题是服务器程序冻结在“String file=br.readLine()”上。当我终止客户端程序时,会执行更多行的服务器代码。如果我在客户端代码的末尾注释掉while循环,服务器代码工作得非常好(它将数据打印到标准输出)。你能告诉我我的代码有什么问题吗? 服务器代码: public class SocketServer { public stati

我不熟悉套接字编程。我必须编写一个程序,客户端从用户那里接受文件名并将其发送到服务器。服务器读取相应的文件并将其内容发送回客户端。现在我的问题是服务器程序冻结在“String file=br.readLine()”上。当我终止客户端程序时,会执行更多行的服务器代码。如果我在客户端代码的末尾注释掉while循环,服务器代码工作得非常好(它将数据打印到标准输出)。你能告诉我我的代码有什么问题吗? 服务器代码:

public class SocketServer {

    public static void main(String[] args) throws Exception{
        System.out.println("Server is started.");
        ServerSocket ss = new ServerSocket(9999);

        System.out.println("Server is waiting for a client.");
        Socket server = ss.accept();

        System.out.println("Client is connected.");

        BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream()));
        String file = br.readLine();

        System.out.println("Requested file is: " + file);

        OutputStreamWriter os = new OutputStreamWriter(server.getOutputStream());
        PrintWriter writer = new PrintWriter(os);

        BufferedReader fr = new BufferedReader(new FileReader(file));   

        String line;
        while((line = fr.readLine()) != null) {
            writer.write(line);
            writer.flush();
            System.out.println(line);
        }
    }
}
客户端代码:

public class SocketClient {

    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        Socket client = new Socket("localhost", 9999);

        OutputStreamWriter os = new OutputStreamWriter(client.getOutputStream());
        PrintWriter writer = new PrintWriter(os);

        System.out.print("Enter filename: ");
        String file = in.nextLine();

        writer.write(file);
        writer.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));

        System.out.println("Content of " + file + ":");

        String str;
        while((str = br.readLine()) != null) {
            System.out.print(str);
        }
        System.out.println("File transfer is complete.");
    }

}
br.readLine()将等待输入,直到找到新行

writer.write(文件)您正在写入文件名,但没有新行

所以为了让它工作,要么在客户端写一个换行符,要么在服务器上逐字符读取

希望这有帮助。

br.readLine()将等待输入,直到找到新行

writer.write(文件)您正在写入文件名,但没有新行

所以为了让它工作,要么在客户端写一个换行符,要么在服务器上逐字符读取


希望这有帮助。

您需要一个调试器。我使用了调试器。它显示了服务器程序冻结的行。您需要一个调试器。我使用了调试器。它显示了服务器程序冻结的行。