代码运行卡在scanner.hasNextLine()

时间:2014-05-17 16:02:14

标签: java java.util.scanner printwriter

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

它们都有一个Scanner和一个PrintWriter,它们使用Socket的输入和输出流相互写入。

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.");

}

}

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.");

    }

}
  1. 我启动服务器:java Server.java
  2. 我启动客户端:java Client.java
  3. 服务器的输出:

    Waiting for client to connect
    Client has connected!!
    From Client: dataline 1
    From Client: dataline 3
    From Client: dataline 3
    

    客户端的输出为空,而不是单词。

    正如您所看到的,在从客户端的输出流中读取服务器的代码终止之后停止,并且客户端的代码终止在它可以从服务器的输出流中读取之前停止。

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

    E D I T:

    @ T.C你的意思是这样的吗?现在我得到了完整的输出,服务器和客户端在发送和接收数据后都会退出。

    我这样修改过:

        String line = "";
        while (!line.equals("#")) {
    
            line = scanner.nextLine();
            if (!line.equals("#")) {
                System.out.println("From server" + line);
            }
        }
    

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

请查看以下帖子,以便更好地了解它。


尝试使用包含BufferedReaderready()来说明是否已准备好读取此流。如果缓冲区不为空,或者基础字符流已准备就绪,则缓冲字符流就绪。

您可以尝试使用InputStream#available(),但它没有读取线方法。

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

答案 2 :(得分:0)

几乎完全相同的问题,在键盘上敲了几个小时之后,这就是救了我的:

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

第二个参数将auto-flushing设置为true。