annotate test/ServerSample.java @ 388:4ec3b70f8f09

21
author one@firefly.cr.ie.u-ryukyu.ac.jp
date Mon, 10 Nov 2008 22:23:02 +0900
parents 7107faaf3feb
children 4b535bef903a
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);
270
5e0e4877465d *** empty log message ***
kono
parents: 269
diff changeset
30 // この方法だと、IPv6 (Dual stack) 対応にならない..
5e0e4877465d *** empty log message ***
kono
parents: 269
diff changeset
31 // このホストの全てのアドレスを取得して、それ全部に対して、socketを開けて、すべてに対して、
5e0e4877465d *** empty log message ***
kono
parents: 269
diff changeset
32 // select する必要がある。
388
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 311
diff changeset
33 //serverSocketChannel.socket().bind(new InetSocketAddress(5100));
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 311
diff changeset
34 serverSocketChannel.socket().bind(new InetSocketAddress("::",5100));
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
35
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
36 // セレクタにサーバソケットチャンネルを登録。サーバへの受付を監視
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
37 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
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 while (true) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
41
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
42 // セレクタにイベントが発生するまでブロック
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
43 // select のreturn valueは信用しない。selectedKeys()を使う。
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
44 selector.select();
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
45
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
46 // 獲得したイベントごとに処理を実行
194
be219ba8b39c *** empty log message ***
kono
parents: 168
diff changeset
47 for (REPSelectionKey<REPCommand> selectionKey : selector.selectedKeys1()) {
269
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
48 // java.nio だと for 文では動かないが、REPSocketChannel では動く
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
49 //
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
50 //for (Iterator<SelectionKey> it = keys.iterator();it.hasNext(); ) {
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
51 // SelectionKey k = it.next();
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
52 // newKeys.add(new REPSelectionKey<P>(k,this));
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
53 // it.remove();
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
54 //}
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
55 // と書く必要がある。
129
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 if (selectionKey.isAcceptable()) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
61
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
62 // サーバソケットチャンネルからソケットチャンネルを獲得
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
63 // ソケットチャンネルを経由してクライアントと通信できる
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
64 //SocketChannel socketChannel = serverSocketChannel.accept();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
65 REPSocketChannel<REPCommand> socketChannel;
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
66 socketChannel = selectionKey.accept(pack);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
67
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
68 // 接続先がなくてもここに処理が飛ぶことがある。対象が
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
69 // nullの場合は処理を抜ける
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
70 if (null == socketChannel) continue;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
71
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
72 // ソケットチャンネルを非ブロックモードに設定(重要)し、
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
73 // セレクタに読み込みを対象として登録
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
74 socketChannel.configureBlocking(false);
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
75 socketChannel.register(selector, SelectionKey.OP_READ);
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
76 socketChannel = null;
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
77 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
78
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 else if (selectionKey.isReadable()) {
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
84
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
85 // 登録されているソケットチャンネルを取得
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
86 REPSocketChannel<REPCommand> socketChannel =
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
87 selectionKey.channel1();
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
88
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
89 REPCommand cmd = null;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
90 // クライアントからメッセージの受信
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
91 try {
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
92 cmd = socketChannel.read();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
93 } catch (IOException e) {
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
94 // クライアント側が接続を切断していた場合は、サーバも
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
95 // 接続を切断。セレクタから登録を削除
269
6e0fa3415668 *** empty log message ***
kono
parents: 194
diff changeset
96 selectionKey.cancel(); // これは必要だと思う
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
97 socketChannel.close(); // たぶん不要
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
98 }
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
99 if (cmd==null) {
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
100 // 読み込むべきメッセージは届いていないので処理を飛ばす
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
101 // こういう場合もある
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
102 continue;
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
103 }
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
104 // クライアントからメッセージを取得し、標準出力へ
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
105 System.out.print("EEE: " + cmd);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
106
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
107 // クライアントへメッセージを送信
311
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
108 // copy or do not modify after the write
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
109 // In the simulation, object is directly passed
7107faaf3feb *** empty log message ***
kono
parents: 310
diff changeset
110 // to the client
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
111 cmd = new REPCommand(cmd);
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
112 cmd.setString("This is the answer.");
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
113 socketChannel.write(cmd);
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
114
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
115 // クライアントとの接続を切断。セレクタから登録を削除
310
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
116 socketChannel.close();
511376c066db *** empty log message ***
kono
parents: 270
diff changeset
117 //break;
129
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
118 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
119 System.out.println(selectionKey.toString());
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
120 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
121 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
122 }
63a473db5cbf *** empty log message ***
kono
parents:
diff changeset
123 }