Java NIOの簡単な例
サーバ側:
クライアント:
実行結果
サービス:
クライアント:
package nioT;
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.nio.charset.Charset;
import java.util.Iterator;
public class NIOServer1 {
//
private static final String LocalCharSetName = "UTF-8";
//
private static final int Listenning_Port = 8888;
//
private static final int Buffer_Size = 1024;
// ,
private static final int TimeOut = 3000;
public static void main(String[] args) throws IOException {
// Socket .
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(Listenning_Port));
serverChannel.configureBlocking(false);
// serverChannel
Selector selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
//
if (selector.select(TimeOut) == 0) {
System.out.println(".");
continue;
}
//
Iterator keyIter = selector.selectedKeys().iterator();
//
while (keyIter.hasNext()) {
SelectionKey key = keyIter.next();
// , clientChannel
if (key.isAcceptable()) {
SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ,
ByteBuffer.allocate(Buffer_Size));
}
//
if (key.isReadable()) {
//
SocketChannel clientChannel = (SocketChannel) key.channel();
//
ByteBuffer buffer = (ByteBuffer) key.attachment();
buffer.clear();
//
long bytesRead = clientChannel.read(buffer);
if (bytesRead == -1) {
//
clientChannel.close();
} else {
//
buffer.flip();
// ( Charset )
String receivedString = Charset
.forName(LocalCharSetName).newDecoder().decode(buffer).toString();
//
System.out.println(" :" + receivedString);
//
String sendString = " , . " + receivedString;
// ( Charset )
buffer = ByteBuffer.wrap(sendString.getBytes(LocalCharSetName));
//
clientChannel.write(buffer);
//
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
}
keyIter.remove();
}
}
}
}
クライアント:
package nioT;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class NIOClient1Test {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket s = new Socket("localhost", 8888);
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();
//
PrintWriter out = new PrintWriter(outStream, true);
out.println("getPublicKey !");
out.flush();
s.shutdownOutput();//
//
Scanner in = new Scanner(inStream);
StringBuilder sb = new StringBuilder();
while (in.hasNextLine()) {
String line = in.nextLine();
sb.append(line);
}
String response = sb.toString();
System.out.println("response=" + response);
}
}
実行結果
サービス:
.
:getPublicKey !
.
クライアント:
response= , . getPublicKey !