Java - 使用从Socket InputStream读取的扫描程序

时间:2016-06-08 14:08:08

标签: java outputstream

我很抱歉因为我想不出任何更好的头衔。 我有一个用java编写的服务器 - 客户端程序服务器发送一个字符串,该字符串以新行号\n结束,客户端从socket.getInputStream()读取,如果使用扫描器输入下一行

在服务器端

ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
PrintWrite send = new PrintWriter(socket.getOutputStream);
send.print("Server has succeeded to proccess your request \n" + show(ID));
send.flush();

show(ID)是一个函数,它返回一个已包含下一行字符的字符串。 在客户端

Socket socket = new Socket(HOST,PORT);
Scanner read = new Scanner(socket.getInputStream);
public Boolean ServerResponse(){
    System.out.println("please wait");
    Boolean result=false;
    while(true){
        if(read.hasNextLine()){
            System.out.println("has next");
            String msg = read.nextLine();
            System.out.println(msg);
            if(msg.contains("succeeded")){
                result = true;
            }

        }else{
            System.out.println("finished reading server respone");
            return result;
        }

    }
}

当我试图运行它时。永远不会打印"finished reading server respone",并且在打印has next的最后一行之后没有Server,假设没有下一行字符。但是永远不会执行else块。奇怪的是,当我终止Server时,它会打印出来。任何人都可以向我解释这个以及我必须做些什么,我不需要终止服务器以便打印该行吗?

2 个答案:

答案 0 :(得分:1)

您可能没有关闭服务器端的PrintWriter。

SocketPrintWriter实现自动分解接口时,您可以使用try with resources块在服务器完成后关闭资源。

try (Socket socket = serverSocket.accept();
     PrintWriter send = new PrintWriter(socket.getOutputStream);) {
    send.print("Server has succeeded to proccess your request \n" + show(ID));
}

当您在客户端调用扫描仪中的方法hasNextLine时,它会阻止等待输入。

如果关闭服务器,流将关闭,方法hasNextLine返回false,客户端会显示finished reading server response

答案 1 :(得分:0)

来自Scanner#hasNextLine文档:

  

如果此扫描仪的输入中有另一行,则返回true。   此方法可能在等待输入时阻塞。扫描仪没有   超越任何输入。

意味着如果下一行可用,它将返回true,当没有下一行可供处理时,它将返回false。不过,它可能正在等待另一条线出现。