annotate test/ServerSample.java @ 481:607f1dfe2b80

add comment
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 15 Oct 2010 19:47:53 +0900
parents 4b535bef903a
children
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;
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
2 import java.io.IOException;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
3 import java.nio.channels.*;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
4 import java.net.*;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
5
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
6 import rep.REPCommand;
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
7 import rep.REPCommandPacker;
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
8 import rep.channel.REPPack;
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
9 import rep.channel.REPSelectionKey;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
10 import rep.channel.REPSelector;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
11 import rep.channel.REPServerSocketChannel;
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
12 import rep.channel.REPSocketChannel;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
13
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
14 public class ServerSample
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
15 {
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
16 // client も書いて、standalone example として動くべき
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
17 public static void main(String[] argv)
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
18 throws Exception
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
19 {
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
20 // Thread base のSimulationか、実際のSocketかの選択
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
21 REPServerSocketChannel.isSimulation = false;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
22 // セレクタの用意
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
23 REPSelector<REPCommand> selector = REPSelector.create();
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
24
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
25 REPPack<REPCommand> pack = new REPCommandPacker();
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
26 // サーバソケットチャンネルを作成。5100番ポートを受付ポートに指定
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
27 // (非ブロックモードに設定:重要)
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
28 REPServerSocketChannel<REPCommand> serverSocketChannel = REPServerSocketChannel.<REPCommand>open(pack);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
29 serverSocketChannel.configureBlocking(false);
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
30 serverSocketChannel.socket().setReuseAddress(true);
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
31 try {
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
32 serverSocketChannel.socket().bind(new InetSocketAddress("::",5100));
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
33 } catch (SocketException e) {
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
34 // some system does not support "::"
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
35 serverSocketChannel.socket().bind(new InetSocketAddress(5100));
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 388
diff changeset
36 }
129
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 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
40
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
41 // セレクタにイベントが通知されるごとに処理
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
42 while (true) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
43
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
44 // セレクタにイベントが発生するまでブロック
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
45 // select のreturn valueは信用しない。selectedKeys()を使う。
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
46 selector.select();
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
47
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
48 // 獲得したイベントごとに処理を実行
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
49 for (REPSelectionKey<REPCommand> selectionKey : selector.selectedKeys1()) {
269
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
50 // java.nio だと for 文では動かないが、REPSocketChannel では動く
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
51 //
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
52 //for (Iterator<SelectionKey> it = keys.iterator();it.hasNext(); ) {
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
53 // SelectionKey k = it.next();
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
54 // newKeys.add(new REPSelectionKey<P>(k,this));
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
55 // it.remove();
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
56 //}
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
57 // と書く必要がある。
129
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 // セレクタに取得したソケットチャンネルを登録
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
62 if (selectionKey.isAcceptable()) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
63
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
64 // サーバソケットチャンネルからソケットチャンネルを獲得
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
65 // ソケットチャンネルを経由してクライアントと通信できる
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
66 //SocketChannel socketChannel = serverSocketChannel.accept();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
67 REPSocketChannel<REPCommand> socketChannel;
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
68 socketChannel = selectionKey.accept(pack);
129
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 // nullの場合は処理を抜ける
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
72 if (null == socketChannel) continue;
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 // セレクタに読み込みを対象として登録
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
76 socketChannel.configureBlocking(false);
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
77 socketChannel.register(selector, SelectionKey.OP_READ);
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
78 socketChannel = null;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
79 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
80
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
81 // クライアントとの通信処理
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
82 // 読込み可能である場合、内容物を読みこんで標準出力に表示。
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
83 // メッセージをクライアントに送信して、コネクションを切断。
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
84 // セレクタから登録を解除
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
85 else if (selectionKey.isReadable()) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
86
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
87 // 登録されているソケットチャンネルを取得
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
88 REPSocketChannel<REPCommand> socketChannel =
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
89 selectionKey.channel1();
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
90
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
91 REPCommand cmd = null;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
92 // クライアントからメッセージの受信
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
93 try {
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
94 cmd = socketChannel.read();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
95 } catch (IOException e) {
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
96 // クライアント側が接続を切断していた場合は、サーバも
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
97 // 接続を切断。セレクタから登録を削除
269
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
98 selectionKey.cancel(); // これは必要だと思う
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
99 socketChannel.close(); // たぶん不要
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
100 }
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
101 if (cmd==null) {
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
102 // 読み込むべきメッセージは届いていないので処理を飛ばす
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
103 // こういう場合もある
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
104 continue;
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
105 }
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
106 // クライアントからメッセージを取得し、標準出力へ
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
107 System.out.print("EEE: " + cmd);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
108
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
109 // クライアントへメッセージを送信
311
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
110 // copy or do not modify after the write
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
111 // In the simulation, object is directly passed
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
112 // to the client
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
113 cmd = new REPCommand(cmd);
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
114 cmd.setString("This is the answer.");
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
115 socketChannel.write(cmd);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
116
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
117 // クライアントとの接続を切断。セレクタから登録を削除
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
118 socketChannel.close();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
119 //break;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
120 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
121 System.out.println(selectionKey.toString());
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
122 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
123 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
124 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
125 }