annotate paper/chapter4.tex @ 25:2d6118b66367

update
author Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
date Mon, 03 Feb 2014 22:14:54 +0900
parents b6a6413ac3ca
children aec4085dd5db
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{TightVNCのアップデートへの対応}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 TightVNCは現在も開発が続いていて、アップデートされている。このアップデートに対応するために、私が作成しているTreeVNCにも対応させる必要がある。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 卒業論文後から私は2種類のアップデートを行った。その2種類のアップデートの対応について説明する。\\
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
6 はじめに行ったアップデートはVersionが1.3.10から2.5.0へ変わるメジャーアップデートと呼ばれる大型アップデートである。\\
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 このアップデートでは、パッケージ構成が追加され、元のソースコードがほとんど残っていない状態であった。このような大型なアップデートに対応するには、新しいTightVNCを元にして、作成したTreeVNCの機能を一つづつ移行していく必要がある。このソースコードのアップデートに加えソースコードの質を高めるためにリファクタリングを行った。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 リファクタリングとは、将来の仕様変更に柔軟に対応できるようにソースコードの手直しを行うことである。
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
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 \section{UIの実装}
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
13 \subsection{FramebufferUpdateの概要}
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 RFBプロトコルでは、FramebufferUpdateによって、矩形状の画像データが送信されてくる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 FrameBufferUpdateの概要を(表\ref{tb:framebufferupdate},表\ref{tb:framebufferupdate2})に示す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \caption{FramebufferUpdate}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \label{tb:framebufferupdate}
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 \begin{tabular}{|c|c|c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 バイト数& 型 & 説明 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 1 & U8 & message-type \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 1 & U8 & padding\\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 2 & U16 & number-of-rectangles \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \end{table}
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 この後にnumber-of-rectanglesの数だけ矩形のピクセルデータが続く。各矩形は(表\ref{tb:framebufferupdate2})に示す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 \caption{FramebufferUpdate}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 \label{tb:framebufferupdate2}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \begin{tabular}{|c|c|c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 バイト数& 型 & 説明 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 2 & U16 & x-position \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 2 & U16 & y-position \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 2 & U16 & width \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 2 & U16 & height \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 4 & S32 & encoding-type \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 ここまでがheaderとして送信されるデータである。矩形の画像なのでx-position、y-position、width、heightの4つの値で画像の位置と大きさを決めることができる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 headerに続いて、実際の画像データが送信されてくる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 画像データはZRLEエンコーディングで送信される。最初の4バイトはデータの大きさを表現して、次にその大きさ分のzlibDataが送信される(表\ref{tb:ZRLE})。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 \caption{ZRLEデータ}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \label{tb:ZRLE}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 \begin{tabular}{|c|c|c|} \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 バイト数& 型 & 説明 \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 4 & U32 & length \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 length & U8 array & zlibData \\ \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 送られてきたzlibDataは展開されると左から右、上から下へ並んだ、64*64ピクセルのタイル群画像データとなる。
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 ここで、画像データがどのように送られてくるのかを調べてみたところ、2つディスプレイがあるとすると、両ディスプレイにまたがった画像更新が来ることがないことがわかった。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 図\ref{fig:rawdata}の黒い部分が画像データだとすると、図\ref{fig:rawdata}のようなFramebufferUpdateは送られてくることはない。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 \includegraphics[width=110mm]{./images/sendscreenimage.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 \caption{画面更新時に来る可能性のないUpdateRectangle}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 \label{fig:sendscreenimage}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 \end{figure}
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
75 \subsection{マルチディスプレイへの対応}
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
76 VNCでは画面の情報を矩形型にして送信する。もし複数のディスプレイが存在する場合すべてのディスプレイの情報が送られてくる。しかし、発表などに使用するディスプレイは一つである場合が多い。\\
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
77 必要な画像が一つのディスプレイなのに、すべてのディスプレイのデータを送ると無駄なデータが発生する。そこで、ディスプレイを指定して、その画像だけ送信する機能を追加することで、無駄なデータ送信を省くことができる。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
78
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
79
24
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 以上のことを踏まえ、FramebufferUpdateで送信されてきたheaderを確認し、x-positionを確認することで、どの画面の画像データを送信するかを選択することができる。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 例えば、図\ref{fig:rawdata}では、左側の画面を送信したいときは、x-positionが1920より小さい場合送信し、右側を送信したい場合は1920以上のデータを送信するようにフィルタリングすることで実現できる。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 \newpage
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 \subsection{表示画面の切り替え}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 ゼミなど発表者が多数いる状況でVNCを使用すると、発表者が切り替わるごとにサーバを立ち上げなおさなければならない。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 画面の切替手順を図\ref{fig:changevncserver}に示す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 \begin{figure}[!htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 \includegraphics[width=150mm]{./images/changevncserver.pdf}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 \caption{画面切り替えの流れ}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 \label{fig:changevncserver}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 \end{figure}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
98 初めに、Root Nodeに対して画面を切り替える命令(1:changeVNCServer("10.3"))を出す。命令を受け取ったRoot Nodeは引数で受けっとた
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
99 IPのコンピュータに対して、接続要求を出す(2:requestVNC())。要求を受け取ったコンピュータはが認証を承諾するとRoot Nodeに対して、接続要求を承諾したことを通知する(3:acceptConnection())。Root Nodeは元から通信していたネットワーク接続を閉じる命令を出す(4:CloseConnection())。最後に繋がっているNodeに新しい画面に切り替わったことを通知する(5:newServer())。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 newServer()の内部処理ををListing\ref{src:changescreen}に示す。これは、Root Nodeが子供に対して、画面の切り替えが起こったことを知らせるソースコードである。\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 clientListは、現在接続されているクライアント情報が入っている。クライアントにそれぞれTCP接続を行い、サーバが変わったので接続し直させる命令を送信する。
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 \begin{lstlisting}[language=java,frame=lrbt,label=src:changescreen,caption=画面が切り替わったことを知らせるプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 for (String client : clientList) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 Socket echoSocket = new Socket(client, 10001);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 DataOutputStream os = new DataOutputStream(echoSocket.getOutputStream());
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 os.writeBytes("reconnection\n");
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 os.close();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 \section{Authentication}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 Root Nodeがサーバに対してVNC接続を行う際、ハンドシェイクが必要となる。
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
116 ハンドシェイクの手順として、始めにRoot Nodeがサーバに接続を行うと、
24
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 Root Nodeはサーバから送られてきたプロトコルバージョン以下の使用できるバージョンを
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 サーバに対し送る。現時点で公開されているプロトコルバージョンは3.3、3.7、3.8だけである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 今回TreeVNCは3.855というバージョンを用意して3.855が来るとTreeVNCを使用するようにした。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 プロトコルバージョンが決定すると、サーバ及びNodeは、
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 バージョン3.7以降ではサーバは自身のサポートするセキュリティタイプの一覧を提示する。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 Nodeのサポートする有効なセキュリティタイプを少なくとも一つサーバが提示した場合、Nodeはその接続上で使用されるセキュリティタイプを表す単一バイトを送り返す。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 登録されているセキュリティタイプの一例として(表 \ref{tb:authtype})のようなものがある。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 \begin{table}[htbp]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 \caption{AuthType}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 \label{tb:authtype}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 \begin{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 \begin{tabular} {|l|l|}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 {\bf 値}&名称\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 {\bf 0}&Invalid\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 {\bf 2}&None\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 {\bf 5}&RA2\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 {\bf 18}&TLS\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 {\bf 21}&MD5 ハッシュ認証\\
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 \hline
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 \end{tabular}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 \end{center}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 \end{table}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 MAC OS X SnowLeopardで起動しているVNCサーバに接続するときには
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 MAC専用の認証の値35がありこれでパスワード認証を行うことができていた。
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 しかしMAC OS X Lionでパスワード認証を行おうとすると、
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 MAC OS X Lionにしてパスワード認証ができなくなったので、
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 別の認証方法で認証を行うことにした。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 調べてみるとMAC OS Xが返してくる認証番号は[30, 31, 32, 2, 35]がある。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 32はサーバに対して画面要求の認証を求めるタイプの認証であることがわかった。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 この認証を用いるとサーバに対してRoot Nodeが接続する際にサーバ側に確認画面が出るようになる。
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
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 \newpage
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
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
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 \section{接続先自動検索システムの実装}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 Listing\ref{src:gethost}はBroadcastを使用して、データを送信するプログラムである。
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
169 起動しているRoot NodeはBroadcastパケットが流れてくるのを待っている(Listing\ref{src:gethost})。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
170 Javaでは、Broadcastパケットを作成す際は、java.net.DatagramPacketを使用する。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 \begin{lstlisting}[language=java,frame=lrbt,label=src:gethost,caption=Broadcastを用いてサーバを探すプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 public GetHostClient(String _str) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 str = _str;
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 public void sendData() {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 buf = str.getBytes();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 DatagramPacket sendPacket = new DatagramPacket(buf, str.length(), mAddr, PORT);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 try {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 soc.send(sendPacket);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 } catch (IOException e) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 e.printStackTrace();
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 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 \end{lstlisting}
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
186
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
187 Listing\ref{src:gethost}のif文の中でstrと受け取った値(recvPacket.getData())を比較しているが、このstrを任意に決めることで、strの情報を知らない人には一覧情報が提供されなくなる。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
188 一覧情報が提供されない場合はIPアドレスを直接指定しなければ接続することができないので、IPアドレスとstrを知らない人は接続することができないので、プライベートな画面共有を行うこともできるように実装している。
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
189 Broadcast Packetを受け取ると、受け取ったIPアドレスに対し、TCPコネクションを張り、現在起動しているVNC Serverの一覧を送る(replayBroadcast())。
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 \begin{lstlisting}[language=java,frame=lrbt,label=src:getbroadcast,caption=Broadcastを受け取るプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 byte[] buf = new byte[BufSize];
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 byte[] resorve = new byte[BufSize];
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 try {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 InetAddress mAddr = InetAddress.getByName(McastAddr);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 MulticastSocket soc = new MulticastSocket(Port);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 DatagramPacket recvPacket = new DatagramPacket(buf, BufSize);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 soc.joinGroup(mAddr);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 while (!stopFlag) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 soc.receive(recvPacket);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 address = getAddress(recvPacket.getSocketAddress());
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 inputStream = new ByteArrayInputStream(recvPacket.getData());
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 inputStream.read(resorve);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 if(str.equals(castString(resorve)))
25
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
204 replyBroadcast();
24
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 if(stopFlag) break;
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 } catch (IOException e) {
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 e.printStackTrace();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 }
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211
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 Listing\ref{src:gethost}は、Root Nodeから受け取ったVNCServer一覧を表示する部分である。ここで使用されているtextは、javaのGUIコンポーネントであるJFrameを継承したクラスのインスタンスである。
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 \begin{lstlisting}[language=java,frame=lrbt,label=src:getaddr,caption=起動サーバ一覧を表示するプログラム,numbers=left]
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 Socket socket = server.accept();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 is = new BufferedReader(new InputStreamReader(
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 socket.getInputStream()));
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 proxyAddr = is.readLine();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 if(proxyAddr!=null)
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 text.checkBox(proxyAddr);
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 text.setButton();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 text.visible();
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 \end{lstlisting}
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
b6a6413ac3ca add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 %各64*64のタイル群の先頭には、1byteのsubencordingタイプが設定されている。