blob: e72f92c02777d16f2e1e40efb3a4bff3bed86b82 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>3.3 - Acceptor &mdash; Apache MINA</title>
<link href="/assets/css/common.css" rel="stylesheet" type="text/css"/>
<link href="/assets/css/mina.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<script src="https://www.apachecon.com/event-images/snippet.js"></script>
<div id="container">
<div id="header">
<div id="subProjectsNavBar">
<a href="/">
Apache MINA Project
</a>
&nbsp;|&nbsp;
<a href="/mina-project/">
<strong>MINA</strong>
</a>
&nbsp;|&nbsp;
<a href="/asyncweb-project/">
AsyncWeb
</a>
&nbsp;|&nbsp;
<a href="/ftpserver-project/">
FtpServer
</a>
&nbsp;|&nbsp;
<a href="/sshd-project/">
SSHD
</a>
&nbsp;|&nbsp;
<a href="/vysper-project/">
Vysper
</a>
</div>
</div>
<div id="content">
<div id="leftColumn">
<div id="navigation">
<a class="acevent" data-format="wide" data-width="170"></a>
<h5>Social Networks</h5>
<ul>
<li><a href="https://fosstodon.org/@apachemina">Apache MINA Mastodon</a></li>
</ul>
<h5>Latest Downloads</h5>
<ul>
<li><a href="/mina-project/downloads_2_0.html">Mina 2.0.25</a></li>
<li><a href="/mina-project/downloads_2_1.html">Mina 2.1.8</a></li>
<li><a href="/mina-project/downloads_2_2.html">Mina 2.2.3</a></li>
<li><a href="/mina-project/downloads_old.html">Mina old versions</a></li>
</ul>
<h5>Documentation</h5>
<ul>
<li><a href="/mina-project/documentation.html" class="external-link" rel="nofollow">Base documentation</a></li>
<li><a href="/mina-project/userguide/user-guide-toc.html" class="external-link" rel="nofollow">User guide</a></li>
<li><a href="/mina-project/2.2-vs-2.1.html" class="external-link" rel="nofollow">2.2 vs 2.1</a></li>
<li><a href="/mina-project/2.1-vs-2.0.html" class="external-link" rel="nofollow">2.1 vs 2.0</a></li>
<li><a href="/mina-project/features.html" class="external-link" rel="nofollow">Features</a></li>
<li><a href="/mina-project/road-map.html" class="external-link" rel="nofollow">Road Map</a></li>
<li><a href="/mina-project/quick-start-guide.html" class="external-link" rel="nofollow">Quick Start Guide</a></li>
<li><a href="/mina-project/faq.html" class="external-link" rel="nofollow">FAQ</a></li>
</ul>
<h5>Resources</h5>
<ul>
<li><a href="/mina-project/mailing-lists.html" class="external-link" rel="nofollow">Mailing lists &amp; IRC</a></li>
<li><a href="/mina-project/issue-tracking.html" class="external-link" rel="nofollow">Issue tracking</a></li>
<li><a href="/mina-project/sources.html" class="external-link" rel="nofollow">Sources</a></li>
<li><a href="/mina-project/gen-docs/latest-2.0/apidocs/index.html" class="external-link" rel="nofollow">API Javadoc 2.0.25</a></li>
<li><a href="/mina-project/gen-docs/latest-2.1/apidocs/index.html" class="external-link" rel="nofollow">API Javadoc 2.1.8</a></li>
<li><a href="/mina-project/gen-docs/latest-2.2/apidocs/index.html" class="external-link" rel="nofollow">API Javadoc 2.2.3</a></li>
<li><a href="/mina-project/gen-docs/latest-2.0/xref/index.html" class="external-link" rel="nofollow">API xref 2.0.25</a></li>
<li><a href="/mina-project/gen-docs/latest-2.1/xref/index.html" class="external-link" rel="nofollow">API xref 2.1.8</a></li>
<li><a href="/mina-project/gen-docs/latest-2.2/xref/index.html" class="external-link" rel="nofollow">API xref 2.2.3</a></li>
<li><a href="/mina-project/performances.html" class="external-link" rel="nofollow">Performances</a></li>
<li><a href="/mina-project/testimonials.html" class="external-link" rel="nofollow">Testimonials</a></li>
<li><a href="/mina-project/conferences.html" class="external-link" rel="nofollow">Conferences</a></li>
<li><a href="/mina-project/developer-guide.html" class="external-link" rel="nofollow">Developers Guide</a></li>
<li><a href="/mina-project/related-projects.html" class="external-link" rel="nofollow">Related Projects</a></li>
<li><a href="https://people.apache.org/~vgritsenko/stats/projects/mina.html" class="external-link" rel="nofollow">Statistics</a></li>
</ul>
<h5>Community</h5>
<ul>
<li><a href="https://www.apache.org/foundation/contributing.html" class="external-link" rel="nofollow">Contributing</a></li>
<li><a href="/contributors.html" class="external-link" rel="nofollow">Team</a></li>
<li><a href="/special-thanks.html" class="external-link" rel="nofollow">Special Thanks</a></li>
<li><a href="https://www.apache.org/security/" class="external-link" rel="nofollow">Security</a></li>
</ul>
<h5>About Apache</h5>
<ul>
<li><a href="https://www.apache.org" class="external-link" rel="nofollow">Apache main site</a></li>
<li><a href="https://www.apache.org/licenses/" class="external-link" rel="nofollow">License</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html" title="The ASF sponsorship program" class="external-link" rel="nofollow">Sponsorship program</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html" class="external-link" rel="nofollow">Thanks</a></li>
</ul>
<h3><a name="Navigation-Upcoming"></a>Upcoming</h3>
<ul>
<li>No event</li>
</ul>
</div>
</div>
<div id="rightColumn">
<div class="nav">
<div class="nav_prev">
<a href="ch3.2-io-service-details.html">3.2 - IoService Details</a>
</div>
<div class="nav_up">
<a href="ch3-service.html">Chapter 3 - Service</a>
</div>
<div class="nav_next">
<a href="ch3.4-connector.html">3.4 - Connector</a>
</div>
<div class="clearfix"></div>
</div>
<h1 id="33---acceptor">3.3 - Acceptor</h1>
<p>In order to build a server, you need to select an implementation of the <em>IoAcceptor</em> interface.</p>
<h2 id="ioacceptor">IoAcceptor</h2>
<p>Basically, this interface is named because of the <em>accept()</em> method, responsible for the creation of new connection between a client and the server. The server accepts incoming connection request.</p>
<p>At some point, we could have named this interface &lsquo;Server&rsquo;.</p>
<p>As we may deal with more than one kind of transport (TCP/UDP/&hellip;), we have more than one implementation for this interface. It would be very unlikely that you need to implement a new one.</p>
<p>We have many of those implementing classes</p>
<ul>
<li><strong>NioSocketAcceptor</strong> : the non-blocking Socket transport <em>IoAcceptor</em></li>
<li><strong>NioDatagramAcceptor</strong> : the non-blocking UDP transport <em>IoAcceptor</em></li>
<li><strong>AprSocketAcceptor</strong> : the blocking Socket transport <em>IoAcceptor</em>, based on APR</li>
<li><strong>VmPipeSocketAcceptor</strong> : the in-VM <em>IoAcceptor</em></li>
</ul>
<p>Just pick the one that fit your need.</p>
<p>Here is the class diagram for the <em>IoAcceptor</em> interfaces and classes :</p>
<p><img src="/assets/img/mina/IoServiceAcceptor.png" alt=""></p>
<h2 id="creation">Creation</h2>
<p>You first have to select the type of <em>IoAcceptor</em> you want to instantiate. This is a choice you will made early in the process, as it all boils down to which network protocol you will use. Let&rsquo;s see with an example how it works :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a2f;font-weight:bold">public</span> <span style="color:#00a000">TcpServer</span><span style="color:#666">(</span><span style="color:#666">)</span> <span style="color:#a2f;font-weight:bold">throws</span> IOException <span style="color:#666">{</span>
<span style="color:#080;font-style:italic">// Create a TCP acceptor
</span><span style="color:#080;font-style:italic"></span> IoAcceptor acceptor <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">new</span> NioSocketAcceptor<span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">;</span>
<span style="color:#080;font-style:italic">// Associate the acceptor to an IoHandler instance (your application)
</span><span style="color:#080;font-style:italic"></span> acceptor<span style="color:#666">.</span><span style="color:#b44">setHandler</span><span style="color:#666">(</span><span style="color:#a2f;font-weight:bold">this</span><span style="color:#666">)</span><span style="color:#666">;</span>
<span style="color:#080;font-style:italic">// Bind : this will start the server...
</span><span style="color:#080;font-style:italic"></span> acceptor<span style="color:#666">.</span><span style="color:#b44">bind</span><span style="color:#666">(</span><span style="color:#a2f;font-weight:bold">new</span> InetSocketAddress<span style="color:#666">(</span>PORT<span style="color:#666">)</span><span style="color:#666">)</span><span style="color:#666">;</span>
System<span style="color:#666">.</span><span style="color:#b44">out</span><span style="color:#666">.</span><span style="color:#b44">println</span><span style="color:#666">(</span><span style="color:#b44">&#34;Server started...&#34;</span><span style="color:#666">)</span><span style="color:#666">;</span>
<span style="color:#666">}</span>
</code></pre></div><p>That&rsquo;s it ! You have created a TCP server. If you want to start an UDP server, simply replace the first line of code :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#666">.</span><span style="color:#666">.</span><span style="color:#666">.</span>
<span style="color:#080;font-style:italic">// Create an UDP acceptor
</span><span style="color:#080;font-style:italic"></span>IoAcceptor acceptor <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">new</span> NioDatagramAcceptor<span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">;</span>
<span style="color:#666">.</span><span style="color:#666">.</span><span style="color:#666">.</span>
</code></pre></div><h2 id="disposal">Disposal</h2>
<p>The service can be stopped by calling the <em>dispose()</em> method. The service will be stopped only when all the pending sessions have been processed :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#080;font-style:italic">// Stop the service, waiting for the pending sessions to be inactive
</span><span style="color:#080;font-style:italic"></span>acceptor<span style="color:#666">.</span><span style="color:#b44">dispose</span><span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">;</span>
</code></pre></div><p>You can also wait for every thread being executed to be properly completed by passing a boolean parameter to this method :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#080;font-style:italic">// Stop the service, waiting for the processing session to be properly completed
</span><span style="color:#080;font-style:italic"></span>acceptor<span style="color:#666">.</span><span style="color:#b44">dispose</span><span style="color:#666">(</span> <span style="color:#a2f;font-weight:bold">true</span> <span style="color:#666">)</span><span style="color:#666">;</span>
</code></pre></div><h2 id="status">Status</h2>
<p>You can get the <em>IoService</em> status by calling one of the following methods :</p>
<ul>
<li><em>isActive()</em> : true if the service can accept incoming requests</li>
<li><em>isDisposing()</em> : true if the <em>dispose()</em> method has been called. It does not tell if the service is actually stopped (some sessions might be processed)</li>
<li><em>isDisposed()</em> : true if the <em>dispose(boolean)</em> method has been called, and the executing threads have been completed.</li>
</ul>
<h2 id="managing-the-iohandler">Managing the IoHandler</h2>
<p>You can add or get the associated <em>IoHandler</em> when the service has been instantiated. You just have to call the <em>setHandler(IoHandler)</em> or <em>getHandler()</em> methods.</p>
<h2 id="managing-the-filters-chain">Managing the Filters chain</h2>
<p>if you want to manage the filters chain, you will have to call the <em>getFilterChain()</em> method. Here is an example :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#080;font-style:italic">// Add a logger filter
</span><span style="color:#080;font-style:italic"></span>DefaultIoFilterChainBuilder chain <span style="color:#666">=</span> acceptor<span style="color:#666">.</span><span style="color:#b44">getFilterChain</span><span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">;</span>
chain<span style="color:#666">.</span><span style="color:#b44">addLast</span><span style="color:#666">(</span><span style="color:#b44">&#34;logger&#34;</span><span style="color:#666">,</span> <span style="color:#a2f;font-weight:bold">new</span> LoggingFilter<span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">)</span><span style="color:#666">;</span>
</code></pre></div><p>You can also create the chain before and set it into the service :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#080;font-style:italic">// Add a logger filter
</span><span style="color:#080;font-style:italic"></span>DefaultIoFilterChainBuilder chain <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">new</span> DefaultIoFilterChainBuilder<span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">;</span>
chain<span style="color:#666">.</span><span style="color:#b44">addLast</span><span style="color:#666">(</span><span style="color:#b44">&#34;logger&#34;</span><span style="color:#666">,</span> <span style="color:#a2f;font-weight:bold">new</span> LoggingFilter<span style="color:#666">(</span><span style="color:#666">)</span><span style="color:#666">)</span><span style="color:#666">;</span>
<span style="color:#080;font-style:italic">// And inject the created chain builder in the service
</span><span style="color:#080;font-style:italic"></span>acceptor<span style="color:#666">.</span><span style="color:#b44">setFilterChainBuilder</span><span style="color:#666">(</span>chain<span style="color:#666">)</span><span style="color:#666">;</span>
</code></pre></div>
<div class="nav">
<div class="nav_prev">
<a href="ch3.2-io-service-details.html">3.2 - IoService Details</a>
</div>
<div class="nav_up">
<a href="ch3-service.html">Chapter 3 - Service</a>
</div>
<div class="nav_next">
<a href="ch3.4-connector.html">3.4 - Connector</a>
</div>
<div class="clearfix"></div>
</div>
</div>
<div id="endContent"></div>
</div>
<div id="footer">
&copy; 2003-2024, <a href="https://www.apache.org">The Apache Software Foundation</a> - <a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a><br />
Apache MINA, MINA, Apache Vysper, Vysper, Apache SSHd, SSHd, Apache FtpServer, FtpServer, Apache AsyncWeb, AsyncWeb,
Apache, the Apache feather logo, and the Apache Mina project logos are trademarks of The Apache Software Foundation.
</div>
</div>
</body>
</html>