I am trying to build a simple tcp server using Akka streams.
Tcp()
.bind(props.host, props.port)
.to(Sink.foreach(_.handleWith(handler)))
.run()
.onComplete {
case Success(i) => logger.info(s"Server is bound at ${props.host}:${props.port}")
case Failure(e) => logger.error("Server binding failure", e)
}
I want to allow maximum one connection at a time. To achieve this I have added the following line into my application.conf file.
akka.io.tcp.max-channels = 2
With this configuration, akka allows only one connection at a time. However, as soon as the second connection is attempted it rejects the request and fails itself with the following message:
Could not register incoming connection since selector capacity limit is reached, closing connection
From this point, it is not possible to establish any connection since the Tcp server is down.
Question: What is the proper way of enabling only one connection at a time? The main purpose is answering the first connection request and rejecting others while it is still in progress. It should be again possible to make another connection, after the previous connection is closed. As I mentioned, only one connection should be allowed at any time.
BONUS: Is it possible to provide a whitelist to make akka stream accept connections only from this list? I am planning to allow only known ip addresses to connect my server. To achieve this, I think it is enough to know the proper way of rejecting a request. So I can compare the incoming connection's ip address with a given list and reject if it is not in there. But any better solution is also appreciated.
bindyou getSourceTcp.IncomingConnectionwhich have a possibility to get the address. After that you could in some way reject that connection, but it depends what is rejection in your terms. It could be just an another handler that writes some error data to the incoming connection - maks