Java 关闭扫描仪会导致无限循环

Java 关闭扫描仪会导致无限循环,java,java.util.scanner,serversocket,Java,Java.util.scanner,Serversocket,我从Java套接字开始,试图向用户请求服务器端口。 如果端口已经在使用中,我会再次询问 我一问两遍,读者就开始窃听并产生一个无限循环。 移除reader.close()可以解决我的问题,但我想了解发生了什么 import java.io.IOException; import java.net.BindException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSo

我从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;
    }

}
import java.io.IOException;
导入java.net.BindException;
导入java.net.InetAddress;
导入java.net.NetworkInterface;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.net.SocketTimeoutException;
导入java.util.Enumeration;
导入java.util.InputMismatchException;
导入java.util.NoSuchElementException;
导入java.util.Scanner;
带有askedport的公共类服务器{
公共静态void main(字符串[]args){
ServerSocket mySkServer=null;
套接字srvSocket=null;
InetAddress localAddress=null;
字符串interfaceName=“lo”;
布尔值portOk=true;
试一试{
NetworkInterface ni=NetworkInterface.getByName(interfaceName);
枚举inetAddresses=ni.getInetAddresses();
while(inetAddresses.hasMoreElements()){
InetAddress ia=inetAddresses.nextElement();
如果(!ia.isLinkLocalAddress()&&&!ia.getHostAddress().equals(“0:0:0:0:0:0:0:1”)){
System.out.println(ni.getName()+“->IP:+ia.getHostAddress());
localAddress=ia;
}   
}
做{
portOk=true;
试一试{
mySkServer=newserversocket(askPort(),5,localAddress);
}
捕获(绑定异常){
System.out.println(“错误:端口已在使用”);
portOk=false;
}
捕获(无接触元素例外e){
portOk=false;
}
}而(!portOk);
System.out.println(“默认超时:+mySkServer.getSoTimeout());
System.out.println(“使用的IP地址:+mySkServer.getInetAddress());
System.out.println(“侦听端口:+mySkServer.getLocalPort());
mySkServer.setSoTimeout(100000);//设置30秒超时
//侦听客户端连接等待客户端连接
System.out.println(“等待客户端连接:”);
srvSocket=mySkServer.accept();
System.out.println(“客户端已连接”);
mySkServer.close();
srvSocket.close();
System.out.println(“闭合插座…”);
}捕获(SocketTimeoutException e){
System.out.println(“连接超时”);
}
捕获(例外e){
e、 printStackTrace();
}
}
公共静态int askPort(){
int-portInt=0;
布尔端口;
扫描仪阅读器=新扫描仪(System.in);
做{
portOk=true;
System.out.println(“输入端口号:(1…65535)”;
试一试{
portInt=reader.nextInt();
如果(比例<1 | |比例>65535){
System.out.println(“错误:端口超出范围”);
portOk=false;
}
}
捕获(输入不匹配异常e){
System.out.println(“Erreur:无效格式”);
portOk=false;
}
}而(!portOk);
reader.close();
回报率;
}
}

要测试问题,只需运行2倍的代码并选择相同的端口。

关闭扫描仪将关闭底层输入流,即System.in。一旦你关闭了System.in,它就关闭了,你就不能再阅读任何东西了@JB niset

关闭扫描仪将关闭底层输入流,即系统输入。一旦你关闭了System.in,它就关闭了,你就不能再阅读任何东西了@JB niset

不要删除
reader.close()
,只需在main方法中创建scanner实例,并将该实例传递给askPort()方法

在catch语句之后的main方法中有一个finally块,并在finally块中关闭读取器

而且,Java7引入了自动资源管理,其中一旦try块的执行完成,try块内定义的资源将自动关闭


只需检查一下它是否正在自动关闭try块中定义的
读取器
资源,您不需要同时关闭该资源…

而不是删除
读取器.close()
,只需在main方法中创建scanner实例并将该实例传递给askPort()方法

在catch语句之后的main方法中有一个finally块,并在finally块中关闭读取器

而且,Java7引入了自动资源管理,其中一旦try块的执行完成,try块内定义的资源将自动关闭


只需检查一次,如果它正在自动关闭try块中定义的
读取器
资源,则无需处理关闭该资源的操作…

关闭扫描仪将关闭底层输入流,即System.in。一旦你关闭了System.in,它就关闭了,你不能再读任何东西了。另外:我认为你应该使用1k以上的端口,因为你的系统中有很多tcp/ip端口range@JBNizet回答正确…关闭扫描仪将关闭底层输入流,即System.in。一旦你关闭了System.in,它就关闭了,你不能再读任何东西了。另外:我认为你应该使用1k以上的端口,因为你的系统中有很多tcp/ip端口range@JBNizet正确答案在这里。。。