[英]Closing scanner cause infinite loop
我从Java套接字开始,尝试向用户询问服务器端口。 如果端口已在使用中,请再次询问。
我问了两次,读者就开始烦扰并产生无限循环。 删除reader.close()
解决了我的问题,但我想了解发生了什么。
import java.io.IOException;
import java.net.BindException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Enumeration;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;
public class ServerWithAskedPort {
public static void main(String[] args) {
ServerSocket mySkServer = null;
Socket srvSocket = null ;
InetAddress localAddress= null ;
String interfaceName = "lo";
boolean portOk = true;
try {
NetworkInterface ni = NetworkInterface.getByName(interfaceName);
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress() && !ia.getHostAddress().equals("0:0:0:0:0:0:0:1")) {
System.out.println(ni.getName() + "->IP: " + ia.getHostAddress());
localAddress = ia;
}
}
do {
portOk = true;
try {
mySkServer = new ServerSocket(askPort(),5,localAddress);
}
catch(BindException e) {
System.out.println("Error: port already in use");
portOk = false;
}
catch(NoSuchElementException e) {
portOk = false;
}
}while(!portOk);
System.out.println("Default Timeout :" + mySkServer.getSoTimeout());
System.out.println("Used IpAddress :" + mySkServer.getInetAddress());
System.out.println("Listening to Port :" + mySkServer.getLocalPort());
mySkServer.setSoTimeout(100000);//set 30 sec timout
//Listen to a client connection wait until a client connects
System.out.println("Waiting for a client connection:");
srvSocket = mySkServer.accept();
System.out.println("A client is connected");
mySkServer.close();
srvSocket.close();
System.out.println("Closing socket....");
}catch (SocketTimeoutException e) {
System.out.println("Connection Timed out");
}
catch (Exception e) {
e.printStackTrace();
}
}
public static int askPort() {
int portInt = 0;
boolean portOk;
Scanner reader = new Scanner(System.in);
do {
portOk = true;
System.out.println("Enter a port nummer : (1 ... 65535)");
try {
portInt = reader.nextInt();
if(portInt < 1 || portInt > 65535) {
System.out.println("Error: Port out of range");
portOk = false;
}
}
catch (InputMismatchException e) {
System.out.println("Erreur: Invalid format");
portOk = false;
}
}while(!portOk);
reader.close();
return portInt;
}
}
要测试该问题,只需运行2倍代码并选择相同的端口即可。
无需删除reader.close()
,只需在main方法中创建扫描程序实例,然后将该实例传递给askPort()方法即可。
在catch语句之后,在main方法中有一个finally块,然后关闭finally块内的阅读器。
而且,JAVA 7引入了自动资源管理,其中在try块的执行完成后,将自动关闭try块中定义的资源。
只需检查一次是否自动关闭在try块中定义的reader
资源,就无需处理关闭该资源的情况...
关闭扫描程序会关闭基础InputStream,即System.in。 关闭System.in后,它也将关闭,您将无法再读取任何内容。 @JB Nizet
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.