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