我正在研究通过套接字进行通信的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()时挂起。
答案 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)