in alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java [151:210]
private OptionalInt findUnusedPort(GrpcServerConfig serverConfig) throws IOException{
IntStream trialPorts;
if(serverConfig.getPort()==0){
LOG.info("No explicit port is given, system will pick up an ephemeral port.");
if(serverConfig.isPortAutoIncrement() && serverConfig.getPortCount()>0){
LOG.info("Port trial count must be positive: {}",serverConfig.getPortCount());
trialPorts = IntStream.range(serverConfig.getInitialPort(),serverConfig.getInitialPort()+serverConfig.getPortCount());
}else{
trialPorts = IntStream.range(serverConfig.getInitialPort(),serverConfig.getInitialPort()+1);
}
}else{
trialPorts = IntStream.range(serverConfig.getPort(),serverConfig.getPort()+1);
}
IOException[] error = new IOException[1];
OptionalInt bindPort = trialPorts.filter(port -> {
try{
ServerSocketChannel preBindServerSocketChannel = null;
ServerSocket preBindServerSocket = null;
InetSocketAddress inetSocketAddress = new InetSocketAddress(serverConfig.getHost(), port);
try {
preBindServerSocketChannel = ServerSocketChannel.open();
preBindServerSocket = preBindServerSocketChannel.socket();
preBindServerSocket.setReuseAddress(true);
preBindServerSocket.setSoTimeout((int)TimeUnit.SECONDS.toMillis(1));
preBindServerSocket.bind(inetSocketAddress, 100);
LOG.info("Bind successful to inet socket address {}", inetSocketAddress);
preBindServerSocketChannel.configureBlocking(false);
return true;
} catch (IOException e) {
LOG.info("Bind failed to inet socket address {}", inetSocketAddress);
throw e;
}finally {
if (preBindServerSocket != null) {
try {
preBindServerSocket.close();
} catch (IOException ex) {
LOG.error("closeResource failed", ex);
}
}
if(preBindServerSocketChannel != null){
try {
preBindServerSocketChannel.close();
} catch (IOException ex) {
LOG.error("closeResource failed", ex);
}
}
}
}catch (IOException e){
error[0] = e;
}
return false;
}).findAny();
if(bindPort.isPresent()){
return bindPort;
}else{
throw error[0];
}
}