java - Java Socket 程序中的 PrintWriter

标签 java

我正在编写一个使用套接字进行双向通信的程序。客户端程序向用户提供一些选项,当用户选择该选项时,服务器程序将对其进行处理并将结果返回给客户端程序。我在使用服务器程序时遇到了一些问题,因为如果我将 PrintWriter 语句放入条件语句中,它不会处理它,如下所示。

客户:

Socket socket = null;

    try
    {
        System.out.println("Connecting to Server");

        socket = new Socket("192.168.0.104", 7003);
        socket.setSoTimeout(10000);
        System.out.println("Connected");

        DataOutputStream os = new DataOutputStream(socket.getOutputStream());

        InputStreamReader userInput = new InputStreamReader(System.in);
        BufferedReader userBuffer = new BufferedReader(userInput);

        InputStreamReader serverInput = new InputStreamReader(socket.getInputStream());
        BufferedReader serverBuffer = new BufferedReader(serverInput);
        PrintWriter print = new PrintWriter(socket.getOutputStream(), true);

        System.out.println("Option 1");
        System.out.println("Option 2");
        System.out.println("Option 3");
        String userOption = userBuffer.readLine();

        os.writeBytes(userOption);

        if (userOption.equals("1"))
        {
            String line = serverBuffer.readLine();              
            System.out.println(line);               
        }

        System.out.println("Closing Client Connection");
        serverBuffer.close();
        serverInput.close();
        print.close();
        socket.close();
        os.close();
        System.exit(0);

    }

服务器:

ServerSocket serverSock = null;
    Socket standSock = null;

    try
    {
        serverSock = new ServerSocket(7003);
        standSock = serverSock.accept();

        InputStreamReader input = new InputStreamReader(standSock.getInputStream());
        BufferedReader read = new BufferedReader(input);
        PrintWriter print = new PrintWriter(standSock.getOutputStream(), false);

        String dateTime = (Calendar.getInstance()).getTime().toString();

    if (read.readLine().equals("1"))
    {
        System.out.println("Option 1");
        print.println("You're connected to the Server at: " + dateTime);
    }

        System.out.println("Closing Server Connection");
        read.close();
        input.close();
        print.close();
        standSock.close();

    }

我已经测试了客户端程序的用户输入及其是否正确,但问题是如果我移动

print.println("You're connected to the Server at: " + dateTime);

在条件语句内,程序只是挂起并最终超时,但如果我将该语句移到条件语句之外,它就会起作用。如果我把它放在条件语句中,为什么它不能工作?

最佳答案

客户端中的os.writeBytes(userOption);从未真正写入返回。您正在服务器上调用 readline(),因此它会等待您输入返回值。您从 System.in 调用的 readline() 实际上会丢弃您输入的返回值,因此永远不会传输该返回值。 将 +\n" 添加到 os.writeBytes(userOption); 应该可以解决问题。

也许更好的选择是实际使用您在客户端中创建的 PrintWriter,它将在调用 print.println(userOption) 后自动刷新 StreamBuffer。并且不需要额外的 \n

关于java - Java Socket 程序中的 PrintWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12306708/

相关文章:

java - 单例工厂方法

java - 当用户单击并拖动时调整 Path2D 形状的大小

java - 如何读取jar中的文件?

java - 如何在 MySQL 数据库中保存用户的所有操作 - Java 应用程序

java - HttpServlet 响应。有没有办法在不使用 response.setHeader 的情况下使 cookie 安全和/或仅限 http

java - 两个数组的笛卡尔积

java - 在java中查找奇数

Java DecimalFormat, #仍然显示0

java - setRequestProperty方法的 "If-Modified-Since"参数的作用是什么?

java - jOOQ - 支持 JSR310