1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.core.service;
21
22 import java.io.IOException;
23 import java.net.SocketAddress;
24 import java.util.List;
25 import java.util.Set;
26
27 import org.apache.mina.core.session.IoSession;
28
29 /**
30 * Accepts incoming connection, communicates with clients, and fires events to
31 * {@link IoHandler}s.
32 * <p>
33 * Please refer to
34 * <a href="../../../../../xref-examples/org/apache/mina/examples/echoserver/Main.html">EchoServer</a>
35 * example.
36 * <p>
37 * You should bind to the desired socket address to accept incoming
38 * connections, and then events for incoming connections will be sent to
39 * the specified default {@link IoHandler}.
40 * <p>
41 * Threads accept incoming connections start automatically when
42 * {@link #bind()} is invoked, and stop when {@link #unbind()} is invoked.
43 *
44 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
45 */
46 public interface IoAcceptor extends IoService {
47 /**
48 * Returns the local address which is bound currently. If more than one
49 * address are bound, only one of them will be returned, but it's not
50 * necessarily the firstly bound address.
51 */
52 SocketAddress getLocalAddress();
53
54 /**
55 * Returns a {@link Set} of the local addresses which are bound currently.
56 */
57 Set<SocketAddress> getLocalAddresses();
58
59 /**
60 * Returns the default local address to bind when no argument is specified
61 * in {@link #bind()} method. Please note that the default will not be
62 * used if any local address is specified. If more than one address are
63 * set, only one of them will be returned, but it's not necessarily the
64 * firstly specified address in {@link #setDefaultLocalAddresses(List)}.
65 *
66 */
67 SocketAddress getDefaultLocalAddress();
68
69 /**
70 * Returns a {@link List} of the default local addresses to bind when no
71 * argument is specified in {@link #bind()} method. Please note that the
72 * default will not be used if any local address is specified.
73 */
74 List<SocketAddress> getDefaultLocalAddresses();
75
76 /**
77 * Sets the default local address to bind when no argument is specified in
78 * {@link #bind()} method. Please note that the default will not be used
79 * if any local address is specified.
80 */
81 void setDefaultLocalAddress(SocketAddress localAddress);
82
83 /**
84 * Sets the default local addresses to bind when no argument is specified
85 * in {@link #bind()} method. Please note that the default will not be
86 * used if any local address is specified.
87 */
88 void setDefaultLocalAddresses(SocketAddress firstLocalAddress, SocketAddress... otherLocalAddresses);
89
90 /**
91 * Sets the default local addresses to bind when no argument is specified
92 * in {@link #bind()} method. Please note that the default will not be
93 * used if any local address is specified.
94 */
95 void setDefaultLocalAddresses(Iterable<? extends SocketAddress> localAddresses);
96
97 /**
98 * Sets the default local addresses to bind when no argument is specified
99 * in {@link #bind()} method. Please note that the default will not be
100 * used if any local address is specified.
101 */
102 void setDefaultLocalAddresses(List<? extends SocketAddress> localAddresses);
103
104 /**
105 * Returns <tt>true</tt> if and only if all clients are closed when this
106 * acceptor unbinds from all the related local address (i.e. when the
107 * service is deactivated).
108 */
109 boolean isCloseOnDeactivation();
110
111 /**
112 * Sets whether all client sessions are closed when this acceptor unbinds
113 * from all the related local addresses (i.e. when the service is
114 * deactivated). The default value is <tt>true</tt>.
115 */
116 void setCloseOnDeactivation(boolean closeOnDeactivation);
117
118 /**
119 * Binds to the default local address(es) and start to accept incoming
120 * connections.
121 *
122 * @throws IOException if failed to bind
123 */
124 void bind() throws IOException;
125
126 /**
127 * Binds to the specified local address and start to accept incoming
128 * connections.
129 *
130 * @param localAddress The SocketAddress to bind to
131 *
132 * @throws IOException if failed to bind
133 */
134 void bind(SocketAddress localAddress) throws IOException;
135
136 /**
137 * Binds to the specified local addresses and start to accept incoming
138 * connections. If no address is given, bind on the default local address.
139 *
140 * @param firstLocalAddresses The first address to bind to
141 * @param addresses The SocketAddresses to bind to
142 *
143 * @throws IOException if failed to bind
144 */
145 void bind(SocketAddress firstLocalAddress, SocketAddress... addresses) throws IOException;
146
147 /**
148 * Binds to the specified local addresses and start to accept incoming
149 * connections. If no address is given, bind on the default local address.
150 *
151 * @param addresses The SocketAddresses to bind to
152 *
153 * @throws IOException if failed to bind
154 */
155 void bind(SocketAddress... addresses) throws IOException;
156
157 /**
158 * Binds to the specified local addresses and start to accept incoming
159 * connections.
160 *
161 * @throws IOException if failed to bind
162 */
163 void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException;
164
165 /**
166 * Unbinds from all local addresses that this service is bound to and stops
167 * to accept incoming connections. All managed connections will be closed
168 * if {@link #setCloseOnDeactivation(boolean) disconnectOnUnbind} property
169 * is <tt>true</tt>. This method returns silently if no local address is
170 * bound yet.
171 */
172 void unbind();
173
174 /**
175 * Unbinds from the specified local address and stop to accept incoming
176 * connections. All managed connections will be closed if
177 * {@link #setCloseOnDeactivation(boolean) disconnectOnUnbind} property is
178 * <tt>true</tt>. This method returns silently if the default local
179 * address is not bound yet.
180 */
181 void unbind(SocketAddress localAddress);
182
183 /**
184 * Unbinds from the specified local addresses and stop to accept incoming
185 * connections. All managed connections will be closed if
186 * {@link #setCloseOnDeactivation(boolean) disconnectOnUnbind} property is
187 * <tt>true</tt>. This method returns silently if the default local
188 * addresses are not bound yet.
189 */
190 void unbind(SocketAddress firstLocalAddress, SocketAddress... otherLocalAddresses);
191
192 /**
193 * Unbinds from the specified local addresses and stop to accept incoming
194 * connections. All managed connections will be closed if
195 * {@link #setCloseOnDeactivation(boolean) disconnectOnUnbind} property is
196 * <tt>true</tt>. This method returns silently if the default local
197 * addresses are not bound yet.
198 */
199 void unbind(Iterable<? extends SocketAddress> localAddresses);
200
201 /**
202 * (Optional) Returns an {@link IoSession} that is bound to the specified
203 * <tt>localAddress</tt> and the specified <tt>remoteAddress</tt> which
204 * reuses the local address that is already bound by this service.
205 * <p>
206 * This operation is optional. Please throw {@link UnsupportedOperationException}
207 * if the transport type doesn't support this operation. This operation is
208 * usually implemented for connectionless transport types.
209 *
210 * @throws UnsupportedOperationException if this operation is not supported
211 * @throws IllegalStateException if this service is not running.
212 * @throws IllegalArgumentException if this service is not bound to the
213 * specified <tt>localAddress</tt>.
214 */
215 IoSession newSession(SocketAddress remoteAddress, SocketAddress localAddress);
216 }