annotate rep/ServerSample.java @ 31:593f915dd6ff JOINandPUT

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