# HG changeset patch # User oc # Date 1424074804 -32400 # Node ID 1bc81f8b751709d6f1c653762e47929f244867b5 # Parent 450825b9b9469085ae45520d8e60d3dbdacf02e8 update chapter3 diff -r 450825b9b946 -r 1bc81f8b7517 chapter3.tex --- a/chapter3.tex Mon Feb 16 01:03:50 2015 +0900 +++ b/chapter3.tex Mon Feb 16 17:20:04 2015 +0900 @@ -12,11 +12,10 @@ 最低限のソケットポートを開けることによって、 メモリの使用量を抑えることにも繋がる。 -以下に、動的に port 番号を割り当てているソースコードを記述する。 +以下に、動的に port 番号を割り当てているソースコード\ref{selectport}を記述する。 -% selectPort する箇所を記述する -\begin{lstlisting}[caption=オプション--fixSize,label=fixsize] +\begin{lstlisting}[caption=動的な port 番号の割り当て,label=selectport] public int selectPort(int p) { int port = p; while (true) { @@ -40,13 +39,24 @@ } \end{lstlisting} +\newpage -% messageの説明にportにどんな関係があるのかとから + +selectPort メソッドは、TreeVNC を立ち上げた際に呼ばれる。 +ソースコード\ref{selectport}の try 節で ServerSocket を生成する。 +ServerSocket 生成の際に port 番号を結びつける。 +この時に既に port 番号が使用されている場合、 +BindException error が起こる。 +その場合、catch 節に処理が移行する。 +port をインクリメントし、 +continue でもう一度 ServerSocket を生成しに行く。 +成功するまで port はインクリメントされるので、 +ユニークな port 番号を使用することが可能となる。 + 以前は固定port番号を使用しmessageの通信を行っていたが、 一意なportを割り当てられているnodeが通信を行うことによって、 どのport番号が使用されているかを意識する必要がなくなった。 -\newpage \section{QUALITYモードとSPEEDモード} @@ -85,22 +95,45 @@ 図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に 木構造を形成するように設計した。 -TreeVNCは、rootがnodeListというリストを保持し、木構造を管理している。 -複数のネットワークインターフェースで木構造を形成する場合、 -このnodeListをネットワークインターフェース毎に作成しておく。 -新しいnodeを接続する際、nodeのネットワークインターフェースを取得し、 -どのnodeListに登録されるかが決まる。 -こうすることによって、TreeVNCを複数のネットワークインターフェイス別に -木構造を構成することができる。 - \begin{figure}[htpd] \begin{center} - \includegraphics[scale=0.4]{./images/chapter3/MultiNetworkTree.pdf} + \includegraphics[scale=0.6]{./images/chapter3/MultiNetworkTree.pdf} \end{center} \caption{Multi Network Tree} \label{fig:multinetworktree} \end{figure} +TreeVNC は、root が TreeManager というオブジェクトを持っている。 +TreeManager は TreeVNC の接続部分を管理している。 +TreeManager では木構造を管理する nodeList が生成される。 +この nodeList を元に、新しい node の接続や、node の切断検出時の接続の切り替え等を行う。 + +今回 TreeManager を、 root の保持しているネットワークインタフェース毎に +生成する様に変更した。 +ソースコード\ref{createtreemanager}に、nodeList を生成する部分を示す。 + +\newpage + +\lstinputlisting[breaklines=true,caption=TreeManager の生成,label=createtreemanager]{source/GetNetworkInterfaces.java} + +\begin{itemize} + \item for 文を使用し root が所持しているネットワークインタフェースを取得する(\ref{createtreemanager}中, 2行目) + \item その中から、起動しており Multicast に対応しており、また、ループバックインタフェースでないネットワークインタフェースを取得する(\ref{createtreemanager}中, 4行目) + \item 取得してきたネットワークインタフェースの、ネットマスク、ホストネームを取得する(\ref{createtreemanager}中, 6,7行目) + \item TreeManager を生成する(\ref{createtreemanager}中, 8行目) + \item TreeManager にネットマスクとネットアドレスを追加する(\ref{createtreemanager}中, 14行目) + \item HashMap である interfaces に ネットワークインタフェースと対応する TreeManager を追加する(\ref{createtreemanager}中, 15行目) +\end{itemize} + +新しい node が接続してきた際、 +interfaces から node のネットワークインタフェースと一致する TreeManager を取得する。 +その TreeManager に、node 接続の処理を任せる。 + +こうすることによって、TreeVNC を複数のネットワークインターフェース別に +木構造を構成することができる。 + + + \newpage diff -r 450825b9b946 -r 1bc81f8b7517 source/GetNetworkInterfaces.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/GetNetworkInterfaces.java Mon Feb 16 17:20:04 2015 +0900 @@ -0,0 +1,20 @@ + public void getNetworkInterfaces() throws SocketException { + for (Enumeration e = NetworkInterface.getNetworkInterfaces();e.hasMoreElements();) { + NetworkInterface ni = e.nextElement(); + if (ni.isUp() && ni.supportsMulticast() && !ni.isLoopback()) { + for (InterfaceAddress ipaddress : ni.getInterfaceAddresses()) { + byte [] netmask = getNetMask(ipaddress); + String hostName = ipaddress.getAddress().getHostName(); + TreeManagement treeManager = new TreeManagement(hostName, ConnectionParams.DEFAULT_VNC_ROOT, myRfb.getViewer().getShowTree()); + treeManager.getList().getFirst().setPort(myRfb.getAcceptPort()); + byte[] netaddr = ipaddress.getAddress().getAddress(); + for(int i=0;i