天天看點

Java NIO系列教程(九) ServerSocketChannel

java nio中的 serversocketchannel 是一個可以監聽新進來的tcp連接配接的通道, 就像标準io中的serversocket一樣。serversocketchannel類在 java.nio.channels包中。

這裡有個例子:

<code>01</code>

<code>serversocketchannel serversocketchannel = serversocketchannel.open();</code>

<code>02</code>

<code>03</code>

<code>serversocketchannel.socket().bind(</code><code>new</code> <code>inetsocketaddress(</code><code>9999</code><code>));</code>

<code>04</code>

<code>05</code>

<code>while</code><code>(</code><code>true</code><code>){</code>

<code>06</code>

<code>    </code><code>socketchannel socketchannel =</code>

<code>07</code>

<code>            </code><code>serversocketchannel.accept();</code>

<code>08</code>

<code>09</code>

<code>    </code><code>//do something with socketchannel...</code>

<code>10</code>

<code>}</code>

通過調用 serversocketchannel.open() 方法來打開serversocketchannel.如:

<code>1</code>

通過調用serversocketchannel.close() 方法來關閉serversocketchannel. 如:

<code>serversocketchannel.close();</code>

通過 serversocketchannel.accept() 方法監聽新進來的連接配接。當 accept()方法傳回的時候,它傳回一個包含新進來的連接配接的 socketchannel。是以, accept()方法會一直阻塞到有新連接配接到達。

通常不會僅僅隻監聽一個連接配接,在while循環中調用 accept()方法. 如下面的例子:

<code>2</code>

<code>3</code>

<code>4</code>

<code>5</code>

<code>6</code>

當然,也可以在while循環中使用除了true以外的其它退出準則。

serversocketchannel可以設定成非阻塞模式。在非阻塞模式下,accept() 方法會立刻傳回,如果還沒有新進來的連接配接,傳回的将是null。 是以,需要檢查傳回的socketchannel是否是null.如:

<code>serversocketchannel.configureblocking(</code><code>false</code><code>);</code>

<code>    </code><code>if</code><code>(socketchannel !=</code><code>null</code><code>){</code>

<code>11</code>

<code>        </code><code>//do something with socketchannel...</code>

<code>12</code>

<code>    </code><code>}</code>

<code>13</code>