changeset 121:80ef604d09dc repcamp-2008-start

*** empty log message ***
author kono
date Tue, 26 Aug 2008 09:52:08 +0900
parents 99e598a1dbf8
children 790c8dd42a7b
files rep/ServerSample.java
diffstat 1 files changed, 69 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/rep/ServerSample.java	Thu Jan 17 07:29:54 2008 +0900
+++ b/rep/ServerSample.java	Tue Aug 26 09:52:08 2008 +0900
@@ -6,88 +6,88 @@
 
 public class ServerSample
 {
-public static void main(String[] argv)
-throws Exception
-{
-// ƒZƒŒƒNƒ^‚Ì—pˆÓ
-Selector selector = Selector.open();
+	public static void main(String[] argv)
+	throws Exception
+	{
+		// セレクタの用意
+		Selector selector = Selector.open();
 
-// ƒT[ƒoƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ðì¬B5100”Ôƒ|[ƒg‚ðŽó•tƒ|[ƒg‚ÉŽw’è
-// i”ñƒuƒƒbƒNƒ‚[ƒh‚ɐݒèFd—vj
-ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
-serverSocketChannel.configureBlocking(false);
-serverSocketChannel.socket().bind(new InetSocketAddress(5100));
+		// サーバソケットチャンネルを作成。5100番ポートを受付ポートに指定
+		// (非ブロックモードに設定:重要)
+		ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
+		serverSocketChannel.configureBlocking(false);
+		serverSocketChannel.socket().bind(new InetSocketAddress(5100));
 
-// ƒZƒŒƒNƒ^‚ɃT[ƒoƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ð“o˜^BƒT[ƒo‚Ö‚ÌŽó•t‚ðŠÄŽ‹
-serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
+		// セレクタにサーバソケットチャンネルを登録。サーバへの受付を監視
+		serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
 
-// ƒZƒŒƒNƒ^‚ɃCƒxƒ“ƒg‚ª’Ê’m‚³‚ê‚邲‚Ƃɏˆ—
-while (true) {
+		// セレクタにイベントが通知されるごとに処理
+		while (true) {
 
-// ƒZƒŒƒNƒ^‚ɃCƒxƒ“ƒg‚ª”­¶‚·‚é‚܂ŃuƒƒbƒN
-selector.select();
+			// セレクタにイベントが発生するまでブロック
+			selector.select();
 
-// Šl“¾‚µ‚½ƒCƒxƒ“ƒg‚²‚Ƃɏˆ—‚ðŽÀs
-for (SelectionKey selectionKey : selector.selectedKeys()) {
+			// 獲得したイベントごとに処理を実行
+			for (SelectionKey selectionKey : selector.selectedKeys()) {
 
-// ƒT[ƒo‚ÌŽó•tˆ—: 
-// ƒCƒxƒ“ƒg‚ªŽó•t‰Â”\‚Å‚ ‚éê‡AŽó‚¯•t‚¯‚é‚ׂ«‘Ώۂª‚ ‚ê‚Î
-// ƒZƒŒƒNƒ^‚Ɏ擾‚µ‚½ƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ð“o˜^
-if (selectionKey.isAcceptable()) {
+				// サーバの受付処理: 
+				// イベントが受付可能である場合、受け付けるべき対象があれば
+				// セレクタに取得したソケットチャンネルを登録
+				if (selectionKey.isAcceptable()) {
 
-// ƒT[ƒoƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚©‚çƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ðŠl“¾
-// ƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ðŒo—R‚µ‚ăNƒ‰ƒCƒAƒ“ƒg‚ƒʐM‚Å‚«‚é
-SocketChannel socketChannel = serverSocketChannel.accept();
+					// サーバソケットチャンネルからソケットチャンネルを獲得
+					// ソケットチャンネルを経由してクライアントと通信できる
+					SocketChannel socketChannel = serverSocketChannel.accept();
 
-// Ú‘±æ‚ª‚È‚­‚Ä‚à‚±‚±‚ɏˆ—‚ª”ò‚Ô‚±‚Æ‚ª‚ ‚éB‘Ώۂª
-// null‚̏ꍇ‚͏ˆ—‚𔲂¯‚é
-if (null == socketChannel) continue;
+					// 接続先がなくてもここに処理が飛ぶことがある。対象が
+					// nullの場合は処理を抜ける
+					if (null == socketChannel) continue;
 
-// ƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ð”ñƒuƒƒbƒNƒ‚[ƒh‚ɐݒèid—vj‚µA
-// ƒZƒŒƒNƒ^‚ɓǂݍž‚Ý‚ð‘ΏۂƂµ‚Ä“o˜^
-socketChannel.configureBlocking(false);
-socketChannel.register(selector, SelectionKey.OP_READ);
-socketChannel = null;
-}
+					// ソケットチャンネルを非ブロックモードに設定(重要)し、
+					// セレクタに読み込みを対象として登録
+					socketChannel.configureBlocking(false);
+					socketChannel.register(selector, SelectionKey.OP_READ);
+					socketChannel = null;
+				}
 
-// ƒNƒ‰ƒCƒAƒ“ƒg‚Ƃ̒ʐMˆ—
-// “Ǎž‚݉”\‚Å‚ ‚éê‡A“à—e•¨‚ð“Ç‚Ý‚±‚ñ‚Å•W€o—Í‚É•\Ž¦B
-// ƒƒbƒZ[ƒW‚ðƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M‚µ‚āAƒRƒlƒNƒVƒ‡ƒ“‚ðØ’fB
-// ƒZƒŒƒNƒ^‚©‚ç“o˜^‚ð‰ðœ
-else if (selectionKey.isReadable()) {
+				// クライアントとの通信処理
+				// 読込み可能である場合、内容物を読みこんで標準出力に表示。
+				// メッセージをクライアントに送信して、コネクションを切断。
+				// セレクタから登録を解除
+				else if (selectionKey.isReadable()) {
 
-// “o˜^‚³‚ê‚Ä‚¢‚éƒ\ƒPƒbƒgƒ`ƒƒƒ“ƒlƒ‹‚ðŽæ“¾
-SocketChannel socketChannel = 
-(SocketChannel)selectionKey.channel();
+					// 登録されているソケットチャンネルを取得
+					SocketChannel socketChannel = 
+						(SocketChannel)selectionKey.channel();
 
-Charset charset = Charset.forName("US-ASCII");
-ByteBuffer byteBuffer = ByteBuffer.allocate(8192);
+					Charset charset = Charset.forName("US-ASCII");
+					ByteBuffer byteBuffer = ByteBuffer.allocate(8192);
 
-// ƒNƒ‰ƒCƒAƒ“ƒg‚©‚烁ƒbƒZ[ƒW‚ÌŽóM
-switch (socketChannel.read(byteBuffer)) {
-case -1:
-// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚ªÚ‘±‚ðØ’f‚µ‚Ä‚¢‚½ê‡‚́AƒT[ƒo‚à
-// Ú‘±‚ðØ’fBƒZƒŒƒNƒ^‚©‚ç“o˜^‚ðíœ
-socketChannel.close();
-break;
-case 0:
-// “ǂݍž‚ނׂ«ƒƒbƒZ[ƒW‚Í“Í‚¢‚Ä‚¢‚È‚¢‚̂ŏˆ—‚ð”ò‚΂·
-continue;
-default:
-// ƒNƒ‰ƒCƒAƒ“ƒg‚©‚烁ƒbƒZ[ƒW‚ðŽæ“¾‚µA•W€o—Í‚Ö
-byteBuffer.flip();
-System.out.print("EEE: " + charset.decode(byteBuffer));
+					// クライアントからメッセージの受信
+					switch (socketChannel.read(byteBuffer)) {
+					case -1:
+						// クライアント側が接続を切断していた場合は、サーバも
+						// 接続を切断。セレクタから登録を削除
+						socketChannel.close();
+						break;
+					case 0:
+						// 読み込むべきメッセージは届いていないので処理を飛ばす
+						continue;
+					default:
+						// クライアントからメッセージを取得し、標準出力へ
+						byteBuffer.flip();
+					System.out.print("EEE: " + charset.decode(byteBuffer));
 
-// ƒNƒ‰ƒCƒAƒ“ƒg‚ÖƒƒbƒZ[ƒW‚𑗐M
-socketChannel.write(charset.encode("Good bye!\r\n"));
+					// クライアントへメッセージを送信
+					socketChannel.write(charset.encode("Good bye!\r\n"));
 
-// ƒNƒ‰ƒCƒAƒ“ƒg‚Ƃ̐ڑ±‚ðØ’fBƒZƒŒƒNƒ^‚©‚ç“o˜^‚ðíœ
-//socketChannel.close();
-break;
-}
-}
-System.out.println(selectionKey.toString());
-}
-}
-}
+					// クライアントとの接続を切断。セレクタから登録を削除
+					//socketChannel.close();
+					break;
+					}
+				}
+				System.out.println(selectionKey.toString());
+			}
+		}
+	}
 }
\ No newline at end of file