Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/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套接字程序中的PrintWriter_Java - Fatal编程技术网

Java套接字程序中的PrintWriter

Java套接字程序中的PrintWriter,java,Java,我正在编写一个使用套接字进行双向通信的程序。客户机程序向用户提供一些选项,当用户选择该选项时,服务器程序将对其进行处理,并将结果返回给客户机程序。我在使用服务器程序时遇到了一些问题,因为如果我将PrintWriter语句放入条件语句中,它将无法处理PrintWriter语句,如下面所示 客户: Socket socket = null; try { System.out.println("Connecting to Server"); sock

我正在编写一个使用套接字进行双向通信的程序。客户机程序向用户提供一些选项,当用户选择该选项时,服务器程序将对其进行处理,并将结果返回给客户机程序。我在使用服务器程序时遇到了一些问题,因为如果我将PrintWriter语句放入条件语句中,它将无法处理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);
在条件语句内部,程序只是挂起并最终超时,但是如果我将该语句移到条件语句之外,它就会工作。如果我把它放在我的条件语句中,为什么它不能工作?

操作系统的writeBytes(userOption)从未实际写入返回。您正在服务器上调用readline(),因此它将等待您键入返回。从System.in调用的readline()实际上会丢弃您键入的返回,这样就永远不会传输。 将
+\n“
添加到
os.writeBytes(userOption);
应该可以做到这一点

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

os.writeBytes(userOption)
in Client从不实际写入返回值。您在服务器上调用readline(),因此它会等待您键入返回值。您在System.in中调用的readline()实际上会丢弃您键入的返回值,从而永远不会被传输。 将
+\n“
添加到
os.writeBytes(用户选项)应该可以做到这一点


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

问题是DataOutputStream只在换行后或关闭流时发送信息,但是关闭流也会关闭套接字


我建议坚持使用PrintWriter,因为它更易于管理,尤其是在构造函数中,您可以使第二个参数为true,这样它就会“自动刷新”,所以无论何时执行println()在该PrintWriter对象上,它将自动发送信息。

问题是DataOutputStream仅在换行符后或关闭流时发送信息,但是关闭流也将关闭套接字


我建议坚持使用PrintWriter,因为它更易于管理,特别是在构造函数中,您可以使第二个参数为true,这样它会“自动刷新”,因此每当您对PrintWriter对象执行println()时,它都会自动发送信息。

是PrintWriter延迟发送,而不是DataOutStream,这是无缓冲的。我同意默认情况下DataOutStream是无缓冲的,PrintWriter会延迟,但在PrintWriter对象的构造函数中将autoflush设置为true时不会延迟。延迟发送的是PrintWriter,而不是DataOutStream,我同意DataOutStream是无缓冲的,默认情况下PrintWriter会延迟,但在PrintWriter对象的构造函数中将autoflush设置为true时不会延迟。