<!DOCTYPE html>
<html lang='en'>
<head>
<title>svg.js.git - The lightweight library for manipulating and animating SVG: https://github.com/svgdotjs/svg.js</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='https://source.dussan.org/svg.js.git/atom/src/path.js?h=2.2.0' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/'>index</a> : <a href='/svg.js.git/'>svg.js.git</a></td><td class='form'><form method='get'>
<input type='hidden' name='showmsg' value='1'/><select name='h' onchange='this.form.submit();'>
<option value='2.x'>2.x</option>
<option value='fix-basetag-bug'>fix-basetag-bug</option>
<option value='make-on-off-generic'>make-on-off-generic</option>
<option value='master'>master</option>
<option value='svg.js_v1.x'>svg.js_v1.x</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>The lightweight library for manipulating and animating SVG: https://github.com/svgdotjs/svg.js</td><td class='sub right'>www-data</td></tr></table>
<table class='tabs'><tr><td>
<a href='/svg.js.git/?h=2.2.0'>summary</a><a href='/svg.js.git/refs/?h=2.2.0'>refs</a><a class='active' href='/svg.js.git/log/src/path.js?h=2.2.0&amp;showmsg=1'>log</a><a href='/svg.js.git/tree/src/path.js?h=2.2.0'>tree</a><a href='/svg.js.git/commit/src/path.js?h=2.2.0'>commit</a><a href='/svg.js.git/diff/src/path.js?h=2.2.0'>diff</a><a href='/svg.js.git/stats/src/path.js?h=2.2.0'>stats</a></td><td class='form'><form class='right' method='get' action='/svg.js.git/log/src/path.js'>
<input type='hidden' name='h' value='2.2.0'/><input type='hidden' name='showmsg' value='1'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/svg.js.git/log/?h=2.2.0&amp;showmsg=1'>root</a>/<a href='/svg.js.git/log/src?h=2.2.0&amp;showmsg=1'>src</a>/<a href='/svg.js.git/log/src/path.js?h=2.2.0&amp;showmsg=1'>path.js</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/svg.js.git/log/src/path.js?h=2.2.0'>Collapse</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=dd7c4b7e52eb948ce3018c51a3f5e908b0b456ee'>remove useless executable permission</a></td><td>Peter Dave Hello</td><td><span title='2015-06-23 10:39:13 +0800'>2015-06-23</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+0</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=e567c774c17e6649041d4972defd1232ab602012'>Added SVG.Circle, removed structural internal references</a></td><td>wout</td><td><span title='2014-06-25 15:05:03 +0200'>2014-06-25</span></td><td>1</td><td><span class='deletions'>-4</span>/<span class='insertions'>+10</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=1286e3de26baa3d75ec6a6eafbb2eaa11305c2e1'>Bumped to 1.0.0-rc.6</a></td><td>wout</td><td><span title='2014-03-04 22:19:01 +0100'>2014-03-04</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=8f9ccb16300142307b8ed6aed46c2a4984545600'>Completely reworked `SVG.Text`, `SVG.TSpan` and `SVG.PathArray` and bumped ↵</a></td><td>wout</td><td><span title='2014-02-14 22:25:12 +0100'>2014-02-14</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
to 1.0.0-rc.5


</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=050af98a7ada3280f02acf25fbaba585a264e68a'>added pointAt() method to SVG.Path</a></td><td>wout</td><td><span title='2014-02-05 10:51:47 +0100'>2014-02-05</span></td><td>1</td><td><span class='deletions'>-4</span>/<span class='insertions'>+1</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=8dcb37d3406a85ef639e31b256823cf24fd7b7c6'>Added `length()`method to path</a></td><td>wout</td><td><span title='2014-02-03 21:44:34 +0100'>2014-02-03</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+4</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=e2304534e0cfb6f6f4ab8c37ea5275ae26cd455a'>Implemented SVG.invent function and bumped to v1.0rc3</a></td><td>wout</td><td><span title='2014-02-03 15:14:47 +0100'>2014-02-03</span></td><td>1</td><td><span class='deletions'>-45</span>/<span class='insertions'>+45</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=5b6736666dd85f8a063b87e6c6483ea47be4391c'>Added SVG.PathArray, updated data() and bumped to v1.0rc1</a></td><td>wout</td><td><span title='2014-01-29 21:20:58 +0100'>2014-01-29</span></td><td>1</td><td><span class='deletions'>-51</span>/<span class='insertions'>+25</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=b27d01e9f91bff6145170ebd46857cd703480fec'>Bumped to v0.33</a></td><td>wout</td><td><span title='2014-01-22 12:48:49 +0100'>2014-01-22</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+51</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=9773661d9321927b5b86feef007fabba68eccf32'>Namespace fixes and added textPath and bumped to v0.27</a><span class='decoration'><a class='tag-deco' href='/svg.js.git/tag/?h=0.28'>0.28</a></span></td><td>wout</td><td><span title='2013-07-22 13:52:20 +0100'>2013-07-22</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=8f03d84e43681ecca20ac028071e51a2e2bbc0c8'>Added deep traversing, reorganizd modules</a></td><td>wout</td><td><span title='2013-06-09 11:37:26 +0100'>2013-06-09</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+9</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=264c100153fc45cedf94a8cc8a0174fae12e1fe8'>Added unbiased option to plotable elements</a></td><td>wout</td><td><span title='2013-03-24 21:03:14 +0100'>2013-03-24</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+3</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=67d367e0d74b3287956130da0077e42c6483dd2f'>Bumped to v0.11</a></td><td>wout</td><td><span title='2013-03-24 19:19:06 +0100'>2013-03-24</span></td><td>1</td><td><span class='deletions'>-11</span>/<span class='insertions'>+3</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> 
<span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
- removed SVG.Wrap on SVG.Polyline, SVG.Polygon and SVG.Path
- added delay on SVG.FX module
- made x(), y(), cx() and cy() as getters
- added SGB.get() method, to get elements by a DOM id
- fixed bug in remove() method on container elements
- added jasmine test suite to repo


</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=4bd21ec64a0e3c1d4d0acf5685b2230285c7c16b'>Added x(), y(), cx(), cy() and matrix</a></td><td>wout</td><td><span title='2013-03-12 13:31:09 +0100'>2013-03-12</span></td><td>1</td><td><span class='deletions'>-7</span>/<span class='insertions'>+7</span></td></tr>
<tr class='nohover-highlight'><td class='commitgraph'><span class='column1'>|</span> </td>
<td colspan='5' class='logmsg'>
</td></tr>
<tr class='logheader'><td class='commitgraph'>* </td><td class='logsubject'><a href='/svg.js.git/commit/src/path.js?h=2.2.0&amp;id=6c6c82ed59533f44f8754b69d47e3b11cd6dd129'>Bumped to v0.9, added better style management, text support and extended ↵</a><span class='decoration'><a class='tag-deco' href='/svg.js.git/tag/?h=0.10'>0.10</a></span></td><td>wout</td><td><span title='2013-03-09 22:28:47 +0100'>2<style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm"> * Copyright 2013 gitblit.com.</span>
<span class="cm"> *</span>
<span class="cm"> * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span>
<span class="cm"> * you may not use this file except in compliance with the License.</span>
<span class="cm"> * You may obtain a copy of the License at</span>
<span class="cm"> *</span>
<span class="cm"> *     http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="cm"> *</span>
<span class="cm"> * Unless required by applicable law or agreed to in writing, software</span>
<span class="cm"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span>
<span class="cm"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="cm"> * See the License for the specific language governing permissions and</span>
<span class="cm"> * limitations under the License.</span>
<span class="cm"> */</span>
<span class="kn">package</span><span class="w"> </span><span class="nn">com.gitblit.fanout</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.BufferedInputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.IOException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.OutputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.net.InetSocketAddress</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.net.ServerSocket</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.net.Socket</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.net.SocketException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.net.SocketTimeoutException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.text.MessageFormat</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.Logger</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.LoggerFactory</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * A multi-threaded socket implementation of https://github.com/travisghansen/fanout</span>
<span class="cm"> *</span>
<span class="cm"> * This implementation creates a master acceptor thread which accepts incoming</span>
<span class="cm"> * fanout connections and then spawns a daemon thread for each accepted connection.</span>
<span class="cm"> * If there are 100 concurrent fanout connections, there are 101 threads.</span>
<span class="cm"> *</span>
<span class="cm"> * @author James Moger</span>
<span class="cm"> *</span>
<span class="cm"> */</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">FanoutSocketService</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">FanoutService</span><span class="w"> </span><span class="p">{</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">FanoutSocketService</span><span class="p">.</span><span class="na">class</span><span class="p">);</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">volatile</span><span class="w"> </span><span class="n">ServerSocket</span><span class="w"> </span><span class="n">serviceSocket</span><span class="p">;</span>

<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">FanoutSocketService</span><span class="w"> </span><span class="n">pubsub</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">FanoutSocketService</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">DEFAULT_PORT</span><span class="p">);</span>
<span class="w">		</span><span class="n">pubsub</span><span class="p">.</span><span class="na">setStrictRequestTermination</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="w">		</span><span class="n">pubsub</span><span class="p">.</span><span class="na">setAllowAllChannelAnnouncements</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="w">		</span><span class="n">pubsub</span><span class="p">.</span><span class="na">start</span><span class="p">();</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Create a multi-threaded fanout service.</span>
<span class="cm">	 *</span>
<span class="cm">	 * @param port</span>
<span class="cm">	 *            the port for running the fanout PubSub service</span>
<span class="cm">	 * @throws IOException</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="nf">FanoutSocketService</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">port</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">this</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">port</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * Create a multi-threaded fanout service.</span>
<span class="cm">	 *</span>
<span class="cm">	 * @param bindInterface</span>
<span class="cm">	 *            the ip address to bind for the service, may be null</span>
<span class="cm">	 * @param port</span>
<span class="cm">	 *            the port for running the fanout PubSub service</span>
<span class="cm">	 * @throws IOException</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="nf">FanoutSocketService</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">bindInterface</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">port</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kd">super</span><span class="p">(</span><span class="n">bindInterface</span><span class="p">,</span><span class="w"> </span><span class="n">port</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Fanout socket service&quot;</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">isConnected</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">serviceSocket</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">connect</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">serviceSocket</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ServerSocket</span><span class="p">();</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">setReuseAddress</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">setSoTimeout</span><span class="p">(</span><span class="n">serviceTimeout</span><span class="p">);</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="n">host</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">InetSocketAddress</span><span class="p">(</span><span class="n">port</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">InetSocketAddress</span><span class="p">(</span><span class="n">host</span><span class="p">,</span><span class="w"> </span><span class="n">port</span><span class="p">));</span>
<span class="w">				</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;{0} is ready on {1}:{2,number,0}&quot;</span><span class="p">,</span>
<span class="w">						</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">host</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s">&quot;0.0.0.0&quot;</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">host</span><span class="p">,</span><span class="w"> </span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">getLocalPort</span><span class="p">()));</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">logger</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;failed to open {0} on {1}:{2,number,0}&quot;</span><span class="p">,</span>
<span class="w">						</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">host</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s">&quot;0.0.0.0&quot;</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">host</span><span class="p">,</span><span class="w"> </span><span class="n">port</span><span class="p">),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">disconnect</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">serviceSocket</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">logger</span><span class="p">.</span><span class="na">debug</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;closing {0} server socket&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">));</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">				</span><span class="n">serviceSocket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">logger</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;failed to disconnect {0}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * This accepts incoming fanout connections and spawns connection threads.</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">listen</span><span class="p">()</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">IOException</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">Socket</span><span class="w"> </span><span class="n">socket</span><span class="p">;</span>
<span class="w">			</span><span class="n">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">serviceSocket</span><span class="p">.</span><span class="na">accept</span><span class="p">();</span>
<span class="w">			</span><span class="n">configureClientSocket</span><span class="p">(</span><span class="n">socket</span><span class="p">);</span>

<span class="w">			</span><span class="n">FanoutSocketConnection</span><span class="w"> </span><span class="n">connection</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">FanoutSocketConnection</span><span class="p">(</span><span class="n">socket</span><span class="p">);</span>

<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">addConnection</span><span class="p">(</span><span class="n">connection</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// spawn connection daemon thread</span>
<span class="w">				</span><span class="n">Thread</span><span class="w"> </span><span class="n">connectionThread</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Thread</span><span class="p">(</span><span class="n">connection</span><span class="p">);</span>
<span class="w">				</span><span class="n">connectionThread</span><span class="p">.</span><span class="na">setDaemon</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="w">				</span><span class="n">connectionThread</span><span class="p">.</span><span class="na">setName</span><span class="p">(</span><span class="s">&quot;Fanout &quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">connection</span><span class="p">.</span><span class="na">id</span><span class="p">);</span>
<span class="w">				</span><span class="n">connectionThread</span><span class="p">.</span><span class="na">start</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// synchronously close the connection and remove it</span>
<span class="w">				</span><span class="n">removeConnection</span><span class="p">(</span><span class="n">connection</span><span class="p">);</span>
<span class="w">				</span><span class="n">connection</span><span class="p">.</span><span class="na">closeConnection</span><span class="p">();</span>
<span class="w">				</span><span class="n">connection</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">SocketTimeoutException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// ignore accept timeout exceptions</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="cm">/**</span>
<span class="cm">	 * FanoutSocketConnection handles reading/writing messages from a remote fanout</span>
<span class="cm">	 * connection.</span>
<span class="cm">	 *</span>
<span class="cm">	 * @author James Moger</span>
<span class="cm">	 *</span>
<span class="cm">	 */</span>
<span class="w">	</span><span class="kd">class</span> <span class="nc">FanoutSocketConnection</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">FanoutServiceConnection</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">Runnable</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">Socket</span><span class="w"> </span><span class="n">socket</span><span class="p">;</span>

<span class="w">		</span><span class="n">FanoutSocketConnection</span><span class="p">(</span><span class="n">Socket</span><span class="w"> </span><span class="n">socket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="kd">super</span><span class="p">(</span><span class="n">socket</span><span class="p">);</span>
<span class="w">			</span><span class="k">this</span><span class="p">.</span><span class="na">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">socket</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="cm">/**</span>
<span class="cm">		 * Connection thread read/write method.</span>
<span class="cm">		 */</span>
<span class="w">		</span><span class="nd">@Override</span>
<span class="w">		</span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">run</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">StringBuilder</span><span class="w"> </span><span class="n">sb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StringBuilder</span><span class="p">();</span>
<span class="w">				</span><span class="n">BufferedInputStream</span><span class="w"> </span><span class="n">is</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BufferedInputStream</span><span class="p">(</span><span class="n">socket</span><span class="p">.</span><span class="na">getInputStream</span><span class="p">());</span>
<span class="w">				</span><span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="o">[</span><span class="n">FanoutConstants</span><span class="p">.</span><span class="na">BUFFER_LENGTH</span><span class="o">]</span><span class="p">;</span>
<span class="w">				</span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">				</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">is</span><span class="p">.</span><span class="na">available</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">is</span><span class="p">.</span><span class="na">read</span><span class="p">(</span><span class="n">buffer</span><span class="p">);</span>
<span class="w">						</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">len</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">							</span><span class="kt">byte</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">;</span>
<span class="w">							</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mh">0xa</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">isStrictRequestTermination</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mh">0xd</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">								</span><span class="n">String</span><span class="w"> </span><span class="n">req</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sb</span><span class="p">.</span><span class="na">toString</span><span class="p">();</span>
<span class="w">								</span><span class="n">sb</span><span class="p">.</span><span class="na">setLength</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="w">								</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">req</span><span class="p">.</span><span class="na">length</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">									</span><span class="c1">// ignore empty request strings</span>
<span class="w">									</span><span class="n">processRequest</span><span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="n">req</span><span class="p">);</span>
<span class="w">								</span><span class="p">}</span>
<span class="w">							</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">								</span><span class="n">sb</span><span class="p">.</span><span class="na">append</span><span class="p">((</span><span class="kt">char</span><span class="p">)</span><span class="w"> </span><span class="n">b</span><span class="p">);</span>
<span class="w">							</span><span class="p">}</span>
<span class="w">						</span><span class="p">}</span>
<span class="w">					</span><span class="p">}</span>

<span class="w">					</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">isRunning</span><span class="p">.</span><span class="na">get</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="c1">// service has stopped, terminate client connection</span>
<span class="w">						</span><span class="k">break</span><span class="p">;</span>
<span class="w">					</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">						</span><span class="n">Thread</span><span class="p">.</span><span class="na">sleep</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="w">					</span><span class="p">}</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Throwable</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="w"> </span><span class="k">instanceof</span><span class="w"> </span><span class="n">SocketException</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">logger</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;fanout connection {0}: {1}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="na">getMessage</span><span class="p">()));</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="w"> </span><span class="k">instanceof</span><span class="w"> </span><span class="n">SocketTimeoutException</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">logger</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;fanout connection {0}: {1}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="na">getMessage</span><span class="p">()));</span>
<span class="w">				</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">					</span><span class="n">logger</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;exception while handling fanout connection {0}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">),</span><span class="w"> </span><span class="n">t</span><span class="p">);</span>
<span class="w">				</span><span class="p">}</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">closeConnection</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">			</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;thread for fanout connection {0} is finished&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">));</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="nd">@Override</span>
<span class="w">		</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">reply</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">content</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">IOException</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// synchronously send reply</span>
<span class="w">			</span><span class="n">logger</span><span class="p">.</span><span class="na">debug</span><span class="p">(</span><span class="n">MessageFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="s">&quot;fanout reply to {0}: {1}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">content</span><span class="p">));</span>
<span class="w">			</span><span class="n">OutputStream</span><span class="w"> </span><span class="n">os</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">socket</span><span class="p">.</span><span class="na">getOutputStream</span><span class="p">();</span>
<span class="w">			</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">content</span><span class="p">.</span><span class="na">getBytes</span><span class="p">(</span><span class="n">FanoutConstants</span><span class="p">.</span><span class="na">CHARSET</span><span class="p">);</span>
<span class="w">			</span><span class="n">os</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">bytes</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">bytes</span><span class="o">[</span><span class="n">bytes</span><span class="p">.</span><span class="na">length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mh">0xa</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">os</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="mh">0xa</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">os</span><span class="p">.</span><span class="na">flush</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>

<span class="w">		</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">closeConnection</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="c1">// close the connection socket</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">socket</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="n">socket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>

<span class="w">			</span><span class="c1">// remove this connection from the service</span>
<span class="w">			</span><span class="n">removeConnection</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-08-03 00:08:05 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
