运行的代码卡在了scan.hasNextLine() [英] Code running stuck at scanner.hasNextLine()

查看:186
本文介绍了运行的代码卡在了scan.hasNextLine()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试建立一点服务器-客户端连接.

I try to make a little Server-Client connection.

它们都具有Scanner和PrintWriter,并且正在使用Socket的输入和输出流互相写入.

They both have a Scanner and a PrintWriter, and they are writing to each other using a Socket's input and output stream.

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

服务器的输出:

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

客户的输出为空,上面没有任何文字.

Client's output is empty, not a word on it.

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

As you can see Server's code termination stops AFTER it is read from Client's output stream, and Client's code termination stops BEFORE it could read from Server's output stream.

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

My question is: How this Scanner-PrintWrier communication works, how do i know if a printWriter printed BEFORE a scanner could read in a server-client connection like this? What i did wrong and why? How to use properly a scanner?

E D I T:

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

@T.C Do you mean like this? Now i got full output, both Server and Client are quit after they are sent and received data.

我这样修改:

    String line = "";
    while (!line.equals("#")) {

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

推荐答案

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

The Scanner.hasNext*() methods will block to wait for input to scan, so you can't use it to detect when the client has finished sending.

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

Simplest way to solve this problem would be to have the client send a special string telling the server it's done sending.

这篇关于运行的代码卡在了scan.hasNextLine()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆