Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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 运行的代码在scanner.hasNextLine()处卡住_Java_Java.util.scanner_Printwriter - Fatal编程技术网

Java 运行的代码在scanner.hasNextLine()处卡住

Java 运行的代码在scanner.hasNextLine()处卡住,java,java.util.scanner,printwriter,Java,Java.util.scanner,Printwriter,我尝试建立一个小型服务器-客户端连接 它们都有一个扫描仪和一个PrintWriter,它们使用套接字的输入和输出流相互写入 Client.java: import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner;

我尝试建立一个小型服务器-客户端连接

它们都有一个扫描仪和一个PrintWriter,它们使用套接字的输入和输出流相互写入

Client.java:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

static ServerSocket serverSocket;
static Socket socket;
static PrintWriter printWriter;
static Scanner scanner;

public static void main(String[] args) throws UnknownHostException, IOException {

    socket = new Socket("localhost", 13344);

    scanner = new Scanner(socket.getInputStream());
    printWriter = new PrintWriter(socket.getOutputStream());

    printWriter.println("dataline 1");
    printWriter.println("dataline 2");
    printWriter.println("dataline 3");
    printWriter.flush();


    //Error!? => I never got the echo from server in output
    while (scanner.hasNextLine()) {

        String lineRead = scanner.nextLine();
        System.out.println("From server" + lineRead);
    }

    socket.close();
    scanner.close();
    printWriter.close();

    System.out.println("Client has quit.");

}

}
Waiting for client to connect
Client has connected!!
From Client: dataline 1
From Client: dataline 3
From Client: dataline 3
Server.java

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {

static ServerSocket serverSocket;
static Socket socket;
static PrintWriter printWriter;
static Scanner scanner;

public static void main(String[] args) throws IOException {

    serverSocket = new ServerSocket(13344);
    System.out.println("Waiting for Client to connect");
    socket = serverSocket.accept();

    scanner = new Scanner(socket.getInputStream());
    printWriter = new PrintWriter(socket.getOutputStream());

    System.out.println("Client has connected!!");

    while (scanner.hasNextLine()) {

        String lineRead = scanner.nextLine();
        System.out.println("From Client: " + lineRead);

    }

    //Error!? => This line never runs
    System.out.println("Now sending echo to Client");

    printWriter.println("Echo from server1");
    printWriter.println("Echo from server2");
    printWriter.flush();


    socket.close();
    printWriter.close();
    scanner.close();


    System.out.println("Server has quit.");

    }

}
  • 我启动服务器:java server.java
  • 我启动客户机:java client.java
  • 服务器的输出:

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class Client {
    
    static ServerSocket serverSocket;
    static Socket socket;
    static PrintWriter printWriter;
    static Scanner scanner;
    
    public static void main(String[] args) throws UnknownHostException, IOException {
    
        socket = new Socket("localhost", 13344);
    
        scanner = new Scanner(socket.getInputStream());
        printWriter = new PrintWriter(socket.getOutputStream());
    
        printWriter.println("dataline 1");
        printWriter.println("dataline 2");
        printWriter.println("dataline 3");
        printWriter.flush();
    
    
        //Error!? => I never got the echo from server in output
        while (scanner.hasNextLine()) {
    
            String lineRead = scanner.nextLine();
            System.out.println("From server" + lineRead);
        }
    
        socket.close();
        scanner.close();
        printWriter.close();
    
        System.out.println("Client has quit.");
    
    }
    
    }
    
    Waiting for client to connect
    Client has connected!!
    From Client: dataline 1
    From Client: dataline 3
    From Client: dataline 3
    
    客户端的输出是空的,上面没有一个字

    正如您所看到的,服务器的代码终止在从客户机的输出流读取之后停止,而客户机的代码终止在从服务器的输出流读取之前停止

    我的问题是: 扫描仪与printWriter的通信是如何工作的,我如何知道printWriter是否在扫描仪能够读取这样的服务器-客户端连接之前打印?我做错了什么,为什么?如何正确使用扫描仪

    E-D-it:

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    public class Client {
    
    static ServerSocket serverSocket;
    static Socket socket;
    static PrintWriter printWriter;
    static Scanner scanner;
    
    public static void main(String[] args) throws UnknownHostException, IOException {
    
        socket = new Socket("localhost", 13344);
    
        scanner = new Scanner(socket.getInputStream());
        printWriter = new PrintWriter(socket.getOutputStream());
    
        printWriter.println("dataline 1");
        printWriter.println("dataline 2");
        printWriter.println("dataline 3");
        printWriter.flush();
    
    
        //Error!? => I never got the echo from server in output
        while (scanner.hasNextLine()) {
    
            String lineRead = scanner.nextLine();
            System.out.println("From server" + lineRead);
        }
    
        socket.close();
        scanner.close();
        printWriter.close();
    
        System.out.println("Client has quit.");
    
    }
    
    }
    
    Waiting for client to connect
    Client has connected!!
    From Client: dataline 1
    From Client: dataline 3
    From Client: dataline 3
    
    @你是说像这样吗?现在我得到了完整的输出,服务器和客户端在发送和接收数据后都将退出

    我修改如下:

        String line = "";
        while (!line.equals("#")) {
    
            line = scanner.nextLine();
            if (!line.equals("#")) {
                System.out.println("From server" + line);
            }
        }
    
    Scanner.hasNext*()
    方法将阻塞以等待扫描输入,因此您无法使用它来检测客户端何时完成发送

    解决此问题的最简单方法是让客户端发送一个特殊字符串,告诉服务器它已完成发送。

    扫描器。hasNext*()方法将阻塞以等待扫描输入,因此您无法使用它来检测客户端何时完成发送


    解决此问题的最简单方法是让客户端发送一个特殊字符串,告诉服务器它已完成发送。

    我已经在客户端-服务器通信上发布了一些示例,并提供了详细说明

    请看下面的帖子,这可能会帮助你更好地理解它


    尝试使用指示此流是否已准备好读取的内容。如果缓冲区不为空,或者基础字符流已准备就绪,则缓冲字符流已准备就绪

    您可以尝试使用,但它没有读取行方法


    使用@T.C.建议的解决方案,但没有向他提供任何示例代码。您可以在我的帖子中找到。

    我已经在客户机-服务器通信上发布了一些示例,并提供了详细说明

    请看下面的帖子,这可能会帮助你更好地理解它


    尝试使用指示此流是否已准备好读取的内容。如果缓冲区不为空,或者基础字符流已准备就绪,则缓冲字符流已准备就绪

    您可以尝试使用,但它没有读取行方法


    使用@T.C.建议的解决方案,但没有向他提供任何示例代码。你可以在我的帖子中找到。

    几乎有同样的问题,在我的头撞键盘几个小时后,这就是救我的原因:

    printWriter = new PrintWriter(socket.getOutputStream(), true);
    

    第二个参数将“自动刷新”设置为true。

    遇到了几乎完全相同的问题,在我的头撞在键盘上几个小时后,这救了我:

    printWriter = new PrintWriter(socket.getOutputStream(), true);
    

    第二个参数将自动刷新设置为true。

    此方法的问题在于存在许多竞争条件。例如,如果服务器在接收客户端数据之前开始检查
    reader.ready()
    ,它就会退出。类似地(这实际上发生在您的输出中),如果客户机在从服务器收到回音之前开始检查
    reader.ready()
    ,它将错过回音。那么服务器和客户机都不会终止吗?(更糟糕的是,服务器永远无法访问“向客户端发送数据”部分,因为它陷入了从客户端打印内容的无限循环中)。@T.C.我已经删除了所有我的代码。谢谢。这可能会有帮助。我已经在你的方法的基础上分享了一些示例。这种方法的问题是存在许多竞争条件。例如,如果服务器在接收客户端数据之前开始检查
    reader.ready()
    ,它就会退出。类似地(这实际上发生在您的输出中),如果客户机在从服务器收到回音之前开始检查
    reader.ready()
    ,它将错过回音。那么服务器和客户机都不会终止吗?(更糟糕的是,服务器永远无法访问“向客户端发送数据”部分,因为它陷入了从客户端打印内容的无限循环中)。@T.C.我已经删除了所有我的代码。谢谢。这可能会有帮助。我已经根据您的方法分享了一些示例。