Java应用程序挂起在in.hasNext();

时间:2013-12-12 14:54:00

标签: java sockets java.util.scanner

我正在研究通过套接字进行通信的Battleship swing应用程序。

private ServerSocket server;
private Socket connection;
private PrintWriter out;
private Scanner in;

我建立连接并设置输出和输入流

out = new PrintWriter(connection.getOutputStream(), true);
in = new Scanner(connection.getInputStream());

然后用户点击他认为有船的字段,并且坐标被发送

public void sendXY(String cord)
{
    out.print(cord);
}

然后该方法被调用,等待对手app响应,如果有船或没有(true | false)。

public void readHit()
{
    boolean k = true;
    while(k)
    {
        if(in.hasNext()) //<--app hangs at this line
        {
            Fields.hit = in.nextBoolean();
            k = false;  
        }
    }
}

但是当我测试这个时,我的应用程序会在第一次调用in.hasNext()时挂起。

4 个答案:

答案 0 :(得分:1)

来自JavaDoc https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNext()

  

如果此扫描器的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。

从内部消息来看,我们可以找到:

MATCH (chparent:Characteristic {characteristicId: <someid>})
OPTIONAL MATCH (chparent)-[:CONTAINS]->(chchild:Characteristic)
WITH chparent,collect(distinct(chchild)) as childs
WITH chparent + childs as list
....

如果源流打开且没有可用的字节,则看起来方法会阻止。尝试找到另一种方法来解决这个问题。您可以尝试为每个客户端创建新线程,这将调用public boolean hasNext() { ensureOpen(); saveState(); while (!sourceClosed) { if (hasTokenInBuffer()) return revertState(true); readInput(); } boolean result = hasTokenInBuffer(); return revertState(result); }

答案 1 :(得分:0)

来自javadoc

  

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

答案 2 :(得分:0)

扫描程序正在等待令牌,除非String cord包含某种终结符,否则print方法不会发送完整的令牌。尝试使用println。

答案 3 :(得分:0)

您可以先测试连接输入流中是否有可用的字节:

InputStream instream = connection.getInputStream();
in = new Scanner(instream);

然后替换

if(in.hasNext())

if (instream.available() > 0)