Java NIO socketのサーバーソケットプログラミング
処理コード:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Set;
public class HTTPSocket {
public static void main(String[] args) throws IOException {
Selector selector=Selector.open(); //オープンセレクタ
ServerSocketChannel serverSocketChannel=ServerSocketChannel.open(); //オープンサービスはチャネルをリッスン
serverSocketChannel.configureBlocking(false);//非ブロッキングに設定
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);//リスナチャネルセレクタを受け入れるようにマークを登録
serverSocketChannel.socket().bind(new InetSocketAddress(8080));//チャネルの前にソケットを結合したので、データを転送方法無し
SocketChannel channel=null;
boolean b=true;//書くことができる
StringBuffer buffer=new StringBuffer();
while(true){
selector.select();//少なくとも一つのキー操作可能
Set<SelectionKey> selectionKeys=selector.selectedKeys();//キーの準備をする
for(SelectionKey selectionKey:selectionKeys){
if(selectionKey.isAcceptable()){
channel=serverSocketChannel.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
selectionKeys.remove(selectionKey);
}else{
if(selectionKey.isReadable()){//読む
ByteBuffer bytebuffer=ByteBuffer.allocate(1);
channel.read(bytebuffer);
bytebuffer.position(0);
char c=(char)bytebuffer.get();
buffer.append(c);
if(c==’\n’){
System.out.println(buffer);
b=true;
if(!selectionKey.isWritable())
channel.register(selector, SelectionKey.OP_WRITE);
buffer=new StringBuffer();
}
}
else if(selectionKey.isWritable()){//書く
if(b){
ByteBuffer bytebuff=ByteBuffer.wrap(“hello word\n".getBytes());
bytebuff.position(0);
channel.write(bytebuff);
b=false;
if(!selectionKey.isReadable())
channel.register(selector, SelectionKey.OP_READ);
}
}
}
}
}
}
}