annotate test/ServerSample.java @ 168:4ed6393ec68e

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