All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.internal.tpcengine.net.AsyncServerSocket Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hazelcast.internal.tpcengine.net;

import com.hazelcast.internal.tpcengine.Reactor;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.SocketAddress;
import java.util.function.Consumer;

/**
 * A server socket that is asynchronous. So accepting incoming connections does not block,
 * but are executed on a {@link Reactor}.
 */
public abstract class AsyncServerSocket extends AbstractAsyncSocket {

    protected final AsyncServerSocketMetrics metrics = new AsyncServerSocketMetrics();

    protected AsyncServerSocket() {
    }

    /**
     * Returns the {@link AsyncServerSocketMetrics} of this AsyncServerSocket.
     * 

* This call can always be made no matter the state of the socket. * * @return the metrics. */ public AsyncServerSocketMetrics metrics() { return metrics; } /** * Gets the {@link AsyncSocketOptions} for this AsyncServerSocket. *

* This call can always be made no matter the state of the socket. * * @return the options. */ public abstract AsyncSocketOptions options(); /** * Gets the local address: the socket address that this channel's socket is bound to. * * @return the local address. */ public final SocketAddress getLocalAddress() { try { return getLocalAddress0(); } catch (Exception e) { return null; } } protected abstract SocketAddress getLocalAddress0() throws IOException; /** * Gets the {@link Reactor} this ServerSocket belongs to. *

* The returned value will never be null * * @return the Reactor. */ public abstract Reactor getReactor(); /** * Gets the local port of the {@link AsyncServerSocket}. *

* If {@link #bind(SocketAddress)} has not been called, then -1 is returned. * * @return the local port. * @throws UncheckedIOException if something failed while obtaining the local port. */ public abstract int getLocalPort(); /** * Binds this AsyncServerSocket to the localAddress address. This method is equivalent * to calling {@link #bind(SocketAddress, int)} with an Integer.MAX_VALUE backlog. *

* This can be made on any thread, but it isn't thread safe. * * @param localAddress the local address. * @throws UncheckedIOException if something failed while binding. * @throws NullPointerException if localAddress is null. */ public void bind(SocketAddress localAddress) { bind(localAddress, Integer.MAX_VALUE); } /** * Binds this AsyncServerSocket to the localAddress address by assigning the local * address to it. *

* At a socket level, this method does 2 things: *

    *
  1. bind: assigning an address to the socket
  2. *
  3. listen: marks the socket as a passive socket that waits for incoming connections. * Because every AsyncServerSocket is such a passive socket, there is no point in adding a * listen method to the AsyncServerSocket.
  4. *
* This can be made on any thread, but it isn't thread safe. *

* This call needs to be made before {@link #start(Consumer)}. *

* Bind should only be called once, otherwise an UncheckedIOException is thrown. * * @param localAddress the local address. * @param backlog the maximum number of pending connections. The backlog argument * doesn't need to be respected by the socket implementation. * @throws UncheckedIOException if something failed while binding. * @throws NullPointerException if localAddress is null. * @throws IllegalArgumentException if backlog smaller than 0. */ public abstract void bind(SocketAddress localAddress, int backlog); /** * Start accepting incoming sockets asynchronously. *

* This method can be called from any thread, but the actual processing will happen on the * reactor-thread. *

* This method should only be called once and isn't thread safe. *

* Before accept is called, {@link #bind(SocketAddress, int)} needs to be called. * */ public abstract void start(); @Override public String toString() { return getClass().getSimpleName() + "[" + getLocalAddress() + "]"; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy