annotate rep/ServerSample.java @ 137:1ea856259add

*** empty log message ***
author pin
date Wed, 27 Aug 2008 18:43:09 +0900
parents 790c8dd42a7b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
1 package rep;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
2 import java.nio.*;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
3 import java.nio.channels.*;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
4 import java.nio.charset.*;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
5 import java.net.*;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
6
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
7 public class ServerSample
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
8 {
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
9 public static void main(String[] argv)
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
10 throws Exception
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
11 {
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
12 // セレクタの用意
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
13 Selector selector = Selector.open();
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
14
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
15 // サーバソケットチャンネルを作成。5100番ポートを受付ポートに指定
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
16 // (非ブロックモードに設定:重要)
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
17 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
18 serverSocketChannel.configureBlocking(false);
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
19 serverSocketChannel.socket().bind(new InetSocketAddress(5100));
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
20
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
21 // セレクタにサーバソケットチャンネルを登録。サーバへの受付を監視
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
22 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
23
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
24 // セレクタにイベントが通知されるごとに処理
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
25 while (true) {
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
26
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
27 // セレクタにイベントが発生するまでブロック
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
28 selector.select();
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
29
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
30 // 獲得したイベントごとに処理を実行
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
31 for (SelectionKey selectionKey : selector.selectedKeys()) {
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
32
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
33 // サーバの受付処理:
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
34 // イベントが受付可能である場合、受け付けるべき対象があれば
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
35 // セレクタに取得したソケットチャンネルを登録
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
36 if (selectionKey.isAcceptable()) {
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
37
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
38 // サーバソケットチャンネルからソケットチャンネルを獲得
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
39 // ソケットチャンネルを経由してクライアントと通信できる
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
40 SocketChannel socketChannel = serverSocketChannel.accept();
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
41
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
42 // 接続先がなくてもここに処理が飛ぶことがある。対象が
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
43 // nullの場合は処理を抜ける
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
44 if (null == socketChannel) continue;
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
45
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
46 // ソケットチャンネルを非ブロックモードに設定(重要)し、
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
47 // セレクタに読み込みを対象として登録
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
48 socketChannel.configureBlocking(false);
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
49 socketChannel.register(selector, SelectionKey.OP_READ);
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
50 socketChannel = null;
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
51 }
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
52
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
53 // クライアントとの通信処理
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
54 // 読込み可能である場合、内容物を読みこんで標準出力に表示。
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
55 // メッセージをクライアントに送信して、コネクションを切断。
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
56 // セレクタから登録を解除
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
57 else if (selectionKey.isReadable()) {
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
58
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
59 // 登録されているソケットチャンネルを取得
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
60 SocketChannel socketChannel =
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
61 (SocketChannel)selectionKey.channel();
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
62
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
63 Charset charset = Charset.forName("US-ASCII");
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
64 ByteBuffer byteBuffer = ByteBuffer.allocate(8192);
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
65
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
66 // クライアントからメッセージの受信
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
67 switch (socketChannel.read(byteBuffer)) {
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
68 case -1:
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
69 // クライアント側が接続を切断していた場合は、サーバも
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
70 // 接続を切断。セレクタから登録を削除
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
71 socketChannel.close();
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
72 break;
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
73 case 0:
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
74 // 読み込むべきメッセージは届いていないので処理を飛ばす
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
75 continue;
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
76 default:
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
77 // クライアントからメッセージを取得し、標準出力へ
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
78 byteBuffer.flip();
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
79 System.out.print("EEE: " + charset.decode(byteBuffer));
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
80
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
81 // クライアントへメッセージを送信
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
82 socketChannel.write(charset.encode("Good bye!\r\n"));
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
83
122
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
84 // クライアントとの接続を切断。セレクタから登録を削除
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
85 //socketChannel.close();
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
86 break;
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
87 }
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
88 }
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
89 System.out.println(selectionKey.toString());
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
90 }
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
91 }
790c8dd42a7b *** empty log message ***
kono
parents: 121
diff changeset
92 }
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
93 }