Java 关闭扫描仪会导致无限循环
我从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
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正确答案在这里。。。