annotate paper/chapter3.tex @ 24:b6a6413ac3ca

add files
author Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
date Mon, 03 Feb 2014 16:56:17 +0900
parents
children 2d6118b66367
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{画面共有システムTreeVNCの設計}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 \section{木構造を用いたTreeVNCの設計}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 まず、多人数が参加している授業でVNCを使う場合に起こる問題は、一つのコンピュータに多人数が繋がり、処理が集中してしまって、性能が大幅に落ちてしまうところである(図\ref{fig:vnc})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 多人数の同時接続を可能にするには、一極集中で接続するのではなく、Node同士で負荷を分散させることによって実現できるのではないかと考えた。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 負荷分散を行う際、Node同士どのようなトポロジを組むのが適切か検討した結果、上から流れてきたデータを下のNodeへと伝えていくことのできる木構造が良いと考えた。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7  今回行った設計ではNodeを木構造に接続させデータを流すためにサーバとNodeの間にRoot Node(サーバとNodeの通信を仲介するもの)を設置する方式をとった。Root Nodeは主にNodeの管理とServerから流れてきた画像データの管理を担当する。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 木構造で設計したものを(図\ref{fig:treestructure})に示す。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 \begin{figure}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 \begin{minipage}{0.5\hsize}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 \includegraphics[width=80mm]{./images/vnc.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 \caption{VNCの構造}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \label{fig:vnc}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \end{minipage}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \begin{minipage}{0.5\hsize}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 \includegraphics[width=80mm]{./images/treestructure.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 \caption{TreeVNCの構造}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 \label{fig:treestructure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 \end{minipage}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \section{TreeVNCの原理}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 TreeVNCがどのような負荷分散を行った結果、どのように負荷が分散されているのかを説明する。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 通常のVNCでは、一極集中型でサーバに接続してしまうのでサーバに負荷がかかって性能を低下させたり停止してしまっている。そこでNodeを木構造に配置させることで、負荷がなくなっているように見える。しかし、実は負荷がスイッチにかかっていて、消えているわけではない。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 通常のVNCとTreeVNCの構造を比較した図を(図\ref{fig:comparenormalandtree})に示す。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 \includegraphics[width=130mm]{./images/comparenormalandtree.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 \caption{TreeVNCの構造}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 \label{fig:comparenormalandtree}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 (表\ref{tb:oneporttraffic})はポート一本あたりの通信量である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 表から推察できるように、ポート一本あたりの負荷は通常のVNCの場合はNode数に比例して増えている。しかしTreeVNCの場合はTreeの子供の数が一定なので、Node数に関係なく一定である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 送信する量も通常のVNCの場合Node数に比例した量のデータ送信しなければならいので、CPUに負荷がかかり性能が低下したり停止したりしている。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 対してTreeVNCはが増えても配信するデータは一定なので性能が低下せず使用することができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 \caption{ポート一本あたりの通信量(NはNode数、MはTreeの子供の数)}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 \label{tb:oneporttraffic}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \begin{tabular}{|c|c|c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 & 通常のVNC & TreeVNC \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 通信量 & N * データ量 & (M + 1) * データ量 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 %\section{画面拡大縮小}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 %\section{画面描画範囲の指定}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 \subsection{木の生成}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 負荷を分散させるために木構造を用いるので、Nodeをツリー状に接続する仕組みが必要である。TreeVNCでは、以下の点順で、木の構成を行う。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 図\ref{fig:createtree}は、2分木で木を構成する際の手続きを示したシーケンスダイアグラムである。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 1.初めにNodeはRoot Nodeに接続先IPを尋ねる(Where connect)。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 2.Root Nodeは、Nodeに接続するべきホストのIPを引き渡す(Answer)。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 3.Nodeは指定されたホストに接続する(Connect)。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 \includegraphics[width=140mm]{./images/createtree.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 \caption{TreeVNCの構造}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 \label{fig:createtree}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 \subsection{Root Nodeの仕事}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 Root Nodeの大きな仕事は、Nodeの管理である。NodeのIPアドレス情報をJavaのLinkedListで保持している。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 LinkedListの簡単な説明を\ref{tb:LinkedList}に示す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 \caption{LinkedList}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 \label{tb:LinkedList}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 \begin{tabular}{|c||c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 関数 & 説明 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 add(E e) & Listの最後にeを追加する。 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 get(int index) & リストの$index$番目の値を取得する。\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 remove(int index) & リストの$index$番目の値を削除する。 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 Listing\ref{src:tree}はNodeを管理している部分のプログラムである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 %$line$は接続先を訪ねてきたNodeのIPアドレスであり、$(nodeCounter - 1) / treebranch$で接続するべき親を求め結果を返している。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 %treebranchは木の分岐数である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 $line$は接続先を訪ねてきたNodeのIPアドレスである。初めに接続してきた、Nodeのアドレスを自分が保持しているlist(LinkedList)に登録する。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 親の番号は$(counter - 1)/TreeBraanche$で求めることができるので、listに親の番号を指定し、親のIPアドレスを取得する。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 取得したIpを接続してきたNode($line$)に送り返すことで、NodeはどのIPアドレスに接続すればよいのか知ることができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 \begin{lstlisting}[language=java,frame=lrbt,label=src:tree,caption=クライアント管理のプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 private LinkedList<String> ls = new LinkedList()<String>;
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 private synchronized void replyCreateTree(PrintStream os, String line) throws InterruptedException {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 ls.add(line);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 parentnum = (nodeCounter - 1) / treebranch;
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 request = ls.get(parentnum);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 outputStream(os, request, String.valueOf(parentnum), String.valueOf(nodeCounter));
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 \section{表示画面の切り替え}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 VNCを使用して画面共有を行う場合、授業などでは講師の画面を共有していれば問題ない。しかし、ゼミなどの発表者が多数いる場合は画面共有の対象をを切り替えなければならない。画面共有対象の切り替えを行う場合、発表者ごとにサーバを立ち上げ直さなければならないという問題が発生する。そこで、ユーザ側からRoot Nodeにリクエストを出して、画面共有の対象を切り替える機能が必要になる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 画面を切り替えるときは、Root Nodeだけが接続を切り替え、Nodeたちはそのデータを受け取るだけで良い(図\ref{fig:change})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 \includegraphics[width=100mm]{./images/changeserver.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 \caption{表示画面の切り替え}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 \label{fig:change}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 画面の切替をどのユーザが行うのかという問題がある。Root Nodeに対してユーザが毎回IPアドレスを入力して切り替えるのは手間がかかる。そこで、Node側に画面切り替えボタンを設置し、ボタンを押すとRoot Nodeに自分の画面へ切り替えるように命令を出しRoot Nodeが了承すると画面が切り替わるように設計した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 \section{マルチディスプレイの対応}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 マルチディスプレイを用いてVNCを行うと、すべてのディスプレイのデータが繋がって表示されてしまう。通常発表などに使用されるディスプレイは一つである。すべての画面のデータを送ってしまうとその分だけ無駄なデータを送っていることになる。そこで、発表用に使用する画面のデータだけを送ることのできるようにディスプレイが指定できるようになることが必要になる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 \section{再接続}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 木を構成することはできたが途中のNodeが切断してしまった場合に木を再構成しなければならない。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 木を再構成する手順は以下の用に行う。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141  \begin{enumerate}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 \item 子供のリーダー(最初に親につないだ子供)が親が落ちたことをRoot Nodeに対して報告する。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143  \item Root Nodeは報告を受けると番号の一番大きいNode(最後のNode)に対して落ちた親の代\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 わりになるように報告する。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145  \item Root Nodeから命令を受けたNodeは指定されたNodeに接続をしなおす。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146  \item Root NodeはNodeのリストを更新して、親が落ちた子供たちに新しい親の情報を教える。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147  \item 親が切断された子供たちは、Root Nodeからもらった情報を元に新しい親に対して接続を行う。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148  \end{enumerate}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 このようにして木を再構成することができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 図\ref{fig:reconnection}は再接続の様子を記したコラボレーションダイアグラムである。以下に関数の説明をする。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 \includegraphics[width=140mm]{./images/reconnection.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 \caption{再接続の手続き}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 \label{fig:reconnection}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 1:lostHost():親に切断されたこと報告する関数である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 2:reportLastNode():番号の一番大きい(最後のノード)に対して親の代わりをするように命令する関数である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 3:listUpdate():Root Nodeが持つNodeのリスト情報をアップデートする(切断したノードを削除し最後のノードのアドレスをそこに追加する)。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 4:waitReply.start():NodeはwaitReplyというクラスをmainスレッドとは別にスレッドを作成して走らせている。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 もしRoot Nodeからの命令が来るとNodeはRoot Nodeから指定された場所に接続を行う。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 \includegraphics[width=140mm]{./images/reconnection2.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 \caption{再接続の手続き2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 \label{fig:reconnection2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 6:replyChildlen()は、親が切断した子供たちに対して新しい親の情報を報告する関数である。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 7:reConnection()はRoot Nodeから来た情報をもとにVNC接続を行う関数である。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 以上の関数を用いることでNodeが落ちても木を再構成することができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 \section{MulticastQueue}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 画面が更新された際に画像の更新をNodeに伝えなければならない。ノードが多数ある場合、各ノードに順番に更新を知らせるのではなく、同時に画面の更新を知らせたい。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 同時に更新を知らせるために、CountDownLatchを用いてMultiCastQueueを作成した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 \includegraphics[width=100mm]{./images/countdownlatch.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 \caption{CountDownLatch}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 \label{fig:CountDownLatch}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 java.util.concurrent.CountDownLatchはjavaの並列用に用意されたAPIで他のスレッドで実行中の操作が完了するまで、複数のスレッドを待機させることのできるクラスである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 使い方は、カウント(何回カウントしたらスレッドを開放するのかの数)を指定してCountDownLatchの初期化を行う。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 countDownメソッドを使うとカウントダウンを行うことができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 awaitメソッドはcowntDownメソッドの呼び出しの結果カウントがゼロになるまでの間スレッドをブロックすることができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 countDwonメソッドの結果がゼロになるとawaitメソッドで停止していたスレッドが動き出す(図\ref{fig:CountDownLatch})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 MulticastQueueはQueueのように使用することができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 putメソッドを使用してデータをqueueに追加する。データをputする際にCountDownLatchをカウントダウンする。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 pollメソッドを用いることで、次のデータを取得することができる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 pollメソッドの中でawaitが使われているので次のputでデータが来るまでスレッドがブロックする。(図\ref{fig:multicastqueue})
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 新しくデータがputされるとデータの読み込みが再開される。(図\ref{fig:multicastqueue2})
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 \includegraphics[width=120mm]{./images/multicastqueue.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 \caption{MulticastQueue(データが来るまで待つ)}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 \label{fig:multicastqueue}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 \includegraphics[width=120mm]{./images/multicastqueue2.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 \caption{MulticastQueue(新しいデータが来るとデータを読み出す)}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 \label{fig:multicastqueue2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 \subsection{TimeOut}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 MultiCastQueueを使ってのデータの取得には問題が発生した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 それは、接続してきたNodeがデータを取得しない状況、例えばサスペンド状態になったときにRoot Nodeのメモリの中にデータが残り続けるというものである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 メモリに残り続けたデータはやがてメモリオーバーフローを引き起こしてしまうのである。その様子を図\ref{fig:TimeOut}に示す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 TimeOutスレッドがNodeの代わりにデータを取得することで、MulticastQueueの中からデータが削除されRoot Nodeのメモリを圧迫することがなくなった。(図\ref{fig:TimeOut2})
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 \begin{figure}[tb]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 \includegraphics[scale = 0.5]{images/TimeOut.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 Nodeサスペンド時のRoot Nodeのメモリの様子。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 データが残り続けメモリを圧迫してしまう。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 \label{fig:TimeOut}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 そこで、ある一定の時間が経過すると代わりにデータを取得してくれるTimeOut用のスレッドを作成した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 TimeOutスレッドはサスペンドしているNodeの代わりにデータを取得する。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 \begin{figure}[tb]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 \includegraphics[scale = 0.5]{images/TimeOut2.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 TimeOutが代わりにデータを取得する
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 \label{fig:TimeOut2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 \section{圧縮の問題}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 VNCで扱うRFB プロトコルには、使えるエンコーディングのタイプの1つとしてZRLE(Zlib Run-Length Encoding)がある。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 ZRLEはZlibで圧縮されたデータとそのデータのバイト数がヘッダーとして付けられ送られてくる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 Zlibはフリーのデータ圧縮及び解凍を行うライブラリである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 可逆圧縮アルゴリズムの圧縮と解凍が行えるjava.util.zip.deflaterとjava.util.zip.inflaterを実装している。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 \subsection{java.util.zip.deflaterの実装の問題}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 Zlib圧縮は辞書を持っていて、その辞書に登録されているデータを元に解凍が行われる(図\ref{fig:ZRLE})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 しかし、java.util.zip.deflaterは現在持っている辞書を書き出すこと(flush)ができないことが分かった。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 辞書を書きだすことができない為、Zlib圧縮されたデータを途中から受け取ってもデータが正しく解凍を行うことができない
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 (図\ref{fig:ZRLE2})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 %元々のZlibの規約にはこの辞書をflushする機能があったがJavaには実装されていなかった\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 \includegraphics[width=100mm]{images/ZRLE.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 ZRLE
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 \label{fig:ZRLE}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 \includegraphics[width=100mm]{images/ZRLE2.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 ZRLE2
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 \label{fig:ZRLE2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 \subsection{ZRLEE}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 そこで、Root NodeがZRLEで受け取ったデータをunzipし、データをzipし直して最後にfinish()
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 をいれることで初めからデータを読んでいなくても解凍を行えるようにした
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 (毎回新しい辞書を使うようにした)。(図\ref{fig:ZRLEE})
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 このエンコードはZRLEEエンコードと定義した。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 一度ZRLEEエンコードに変換してしまえば、そのデータをそのまま流すだけで良い。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 よって変換はRoot Nodeが行う一回だけですむ。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 ただし、deflater,inflaterでは前回までの通信で得た辞書をクリアしないといけないため、
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 Root NodeとNode側では毎回新しく作る必要がある(Node側はinflaterだけ)。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 また、ZRLEEはNode側が対応していなければならないという問題がある。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 \includegraphics[width=120mm]{images/ZRLEE.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 \caption{
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 ZRLEE
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 \label{fig:ZRLEE}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 \subsection{接続先自動検索システム}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 NodeがRoot Nodeに接続する際、Root NodeのIPアドレスを指定する必要がある。IPアドレスを毎回入力するのは手間がかかる上、間違うと接続することができない。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 そこで、Nodeが起動した際に、起動しているTreeVNCのRoot Nodeを検索し、IPアドレスの情報を取得し、一覧にして選択させることによって直接アドレスを手入力する必要がなくなる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 TreeVNCのRoot Nodeを検索する際には、Broadcast通信を用いることによって実現することができる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337