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()
# 1 楼答案
扫描仪正在等待令牌,除非字符串线包含某种终止符,否则打印方法不会发送完整的令牌。尝试改用println
# 2 楼答案
来自JavaDochttps://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNext()
查看内部来源,我们可以发现:
如果源流是打开的,并且没有可用的字节,方法将被阻塞。试着找到另一种方法来解决这个问题。您可以尝试为每个客户端创建新线程,它将调用
hasNext()
# 3 楼答案
您可以首先测试连接inputstream中是否有可用的字节:
然后替换
与
# 4 楼答案
从javadoc开始: