Java-scanner不';没有输入时不要暂停

Java-scanner不';没有输入时不要暂停,java,servlets,network-programming,java.util.scanner,Java,Servlets,Network Programming,Java.util.scanner,我正在jetty本地运行一个客户端和servlet。当我在客户端中阅读消息时,我会: in = new Scanner(conn.getInputStream()); StringBuffer messageBuffer = new StringBuffer(); while (in.hasNext()) { messageBuffer.append(in.next()).append(" "); } 我希望当没有来自servlet的数据时,它应该在 while (in.hasNext(

我正在jetty本地运行一个客户端和servlet。当我在客户端中阅读消息时,我会:

in = new Scanner(conn.getInputStream());
StringBuffer messageBuffer = new StringBuffer();
while (in.hasNext()) {
   messageBuffer.append(in.next()).append(" ");
}
我希望当没有来自servlet的数据时,它应该在

while (in.hasNext())
相反,我最终得到的是空的messageBuffer,我必须处理它并一次又一次地调用该方法,直到得到一条消息。为什么会这样?我怎样才能让它在while语句处停止并等待数据进入

以下是url连接的启动方式(在客户端构造函数中启动一次):

编辑:

尝试使用for循环而不是while循环,其范围为0到(长度-1)。您必须使用while(in.hasNextLine())查找长度,并将长度计数器放入其中。填充完messageBuffer(使用.close())后,不要忘记关闭扫描仪。试试看。它应该会起作用

从扫描仪文档:

next()和hasNext()方法及其原语类型伴侣 方法(如nextInt()和hasNextInt())首先跳过 匹配分隔符模式,然后尝试返回下一个 代币hasNext和next方法都可能阻止等待进一步的操作 输入。hasNext方法块是否与 与其关联的下一个方法将被阻止

它说它可能会阻塞,但它不是api的一部分,它取决于根据扫描内容的下划线实现

无论如何,您需要通过以下方式实现等待:

while (!in.hasNext() && !stop){
   sleep();
}

javadoc声明
Scanner.hasNext()
Scanner.next()
可能会阻塞。它实际上取决于底层的
InputStream
。我个人永远不会使用
扫描仪
从插座读取数据,如果这是真的话

一种更明智的方法可能是使用由
BufferedReader
包装的
InputStreamReader
。另外值得一提的是,除非需要线程安全,否则应该使用
StringBuilder
而不是
StringBuffer

BufferedReader br = 
    new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String input = null;
while ((input = br.readLine()) != null)
{
    sb.append(input).append(" ");
}
注意这是使用
readLine()
,它可能适合您的需要,也可能不适合您的需要,具体取决于您收到的内容。它还假设连接的另一端在完成发送后将关闭。您可能希望改用
read()
方法之一,并进行相应的解析

编辑以添加下面的注释:这就是Java中块读的工作原理。下面是一个完整的示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class App 
{
    public static void main( String[] args ) throws MalformedURLException, IOException
    {
        URL url = new URL("http://www.google.com");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        BufferedReader br = 
            new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder sb = new StringBuilder();
        String input = null;
        while ((input = br.readLine()) != null)
        {
            sb.append(input).append(" ");
        }

        System.out.println(sb.toString());

    }
}
输出(为简洁起见,此处将其截断,但它是整个页面):

。。。

根据我的经验,我一直试图避免阻塞,因此避免使用hasNext()的Scanner方法

相反,我使用了InputStream。您在代码中使用的InputStream:

conn.getInputStream();
然后可以使用InputStream方法available()查看是否传递了任何信息

因此,对于您的代码,我建议:

InputStream inStream = conn.getInputStream();
in = new Scanner(inStream);    
StringBuffer messageBuffer = new StringBuffer();    
while (in.available() <= 0)
{   
 try{
    Thread.sleep(100);
}
catch(InterruptedException e){}
}
messageBuffer.append(in.next()).append(" ");
InputStream inStream=conn.getInputStream();
in=新扫描仪(流内);
StringBuffer messageBuffer=新的StringBuffer();

虽然(在.available()中)不太清楚conn与什么通话。这是到servlet的连接吗?是的,conn=(HttpURLConnection)url.openConnection();HttpConnections为什么不使用HTTP客户端库?或者根本不使用
扫描仪
,这可能是更好的建议-由
BufferedReader
包装的
InputStreamReader
可能是更明智的方法。如果这“不起作用”,那么……你实际上没有连接(有效输入流),这与您的
扫描仪
正在bailing的原因相同;它正在点击
EOF
。所谓“不工作”,我的意思是,即使没有消息,它也会通过while循环,并认为它收到了空消息。请仔细阅读问题。我希望它在while循环中暂停,直到找到输入。以上内容实际上是一个问题关于如何在Java中从InputStream执行阻塞读取的教科书示例;这就是它的工作原理。如果存在有效流(而不是EOF),它将阻塞当前没有可用的数据。如果这不是你看到的,你正在做的事情,你没有向我们展示,你期望收到的东西…不是发送的东西。明白了。那么,你是说服务器端可能有问题,它是如何写东西的?也就是说,服务器在运行时在每条消息的末尾写入EOF事实上它不应该?这就是你的意思吗?不知道-我只是对你提供的小剪贴画感兴趣。你可能想发布更多的代码,说明如何启动HttpURLConnection并访问已经发布的代码。你确定你可以知道流式内容的长度吗?
conn.getInputStream();
InputStream inStream = conn.getInputStream();
in = new Scanner(inStream);    
StringBuffer messageBuffer = new StringBuffer();    
while (in.available() <= 0)
{   
 try{
    Thread.sleep(100);
}
catch(InterruptedException e){}
}
messageBuffer.append(in.next()).append(" ");