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);
}

}

}

}

}

}
}

Development

Posted by arkgame