有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

sockets Java应用程序在中挂起。hasNext();

我正在开发战列舰swing应用程序,它通过socket进行通信

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);
}

然后调用该方法,等待对手应用程序响应是否有飞船(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) 个答案

  1. # 1 楼答案

    扫描仪正在等待令牌,除非字符串线包含某种终止符,否则打印方法不会发送完整的令牌。尝试改用println

  2. # 2 楼答案

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

    Returns true if this scanner has another token in its input. This method may block while waiting for input to scan. The scanner does not advance past any input.

    查看内部来源,我们可以发现:

    public boolean hasNext() {
        ensureOpen();
        saveState();
        while (!sourceClosed) {
            if (hasTokenInBuffer())
                return revertState(true);
            readInput();
        }
        boolean result = hasTokenInBuffer();
        return revertState(result);
    }
    

    如果源流是打开的,并且没有可用的字节,方法将被阻塞。试着找到另一种方法来解决这个问题。您可以尝试为每个客户端创建新线程,它将调用hasNext()

  3. # 3 楼答案

    您可以首先测试连接inputstream中是否有可用的字节:

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

    然后替换

    if(in.hasNext())
    

    if (instream.available() > 0)
    
  4. # 4 楼答案

    javadoc开始:

    Returns true if this scanner has another token in its input. This method may block while waiting for input to scan. The scanner does not advance past any input.