Java Reference
In-Depth Information
System
.
out
.
println
(
"Listening for connections on port "
+
port
);
ServerSocketChannel
serverChannel
;
Selector
selector
;
try
{
serverChannel
=
ServerSocketChannel
.
open
();
ServerSocket
ss
=
serverChannel
.
socket
();
InetSocketAddress
address
=
new
InetSocketAddress
(
port
);
ss
.
bind
(
address
);
serverChannel
.
configureBlocking
(
false
);
selector
=
Selector
.
open
();
serverChannel
.
register
(
selector
,
SelectionKey
.
OP_ACCEPT
);
}
catch
(
IOException
ex
)
{
ex
.
printStackTrace
();
return
;
}
while
(
true
)
{
try
{
selector
.
select
();
}
catch
(
IOException
ex
)
{
ex
.
printStackTrace
();
break
;
}
Set
<
SelectionKey
>
readyKeys
=
selector
.
selectedKeys
();
Iterator
<
SelectionKey
>
iterator
=
readyKeys
.
iterator
();
while
(
iterator
.
hasNext
())
{
SelectionKey
key
=
iterator
.
next
();
iterator
.
remove
();
try
{
if
(
key
.
isAcceptable
())
{
ServerSocketChannel
server
=
(
ServerSocketChannel
)
key
.
channel
();
SocketChannel
client
=
server
.
accept
();
System
.
out
.
println
(
"Accepted connection from "
+
client
);
client
.
configureBlocking
(
false
);
SelectionKey
key2
=
client
.
register
(
selector
,
SelectionKey
.
OP_WRITE
);
ByteBuffer
output
=
ByteBuffer
.
allocate
(
4
);
output
.
putInt
(
0
);
output
.
flip
();
key2
.
attach
(
output
);
}
else
if
(
key
.
isWritable
())
{
SocketChannel
client
=
(
SocketChannel
)
key
.
channel
();
ByteBuffer
output
=
(
ByteBuffer
)
key
.
attachment
();
if
(!
output
.
hasRemaining
())
{
output
.
rewind
();
int
value
=
output
.
getInt
();
output
.
clear
();
output
.
putInt
(
value
+
1
);
output
.
flip
();
}